From 018b743bb1246f85987dcf8ce6f9530f962ddaca Mon Sep 17 00:00:00 2001 From: Robert Mosolgo Date: Wed, 30 Jul 2025 06:35:41 -0400 Subject: [PATCH 1/3] Visibility: Default to preload: true when env.staging? --- lib/graphql/schema/visibility.rb | 4 ++-- spec/graphql/schema/visibility_spec.rb | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/lib/graphql/schema/visibility.rb b/lib/graphql/schema/visibility.rb index 0ac274a786..61e9c716a1 100644 --- a/lib/graphql/schema/visibility.rb +++ b/lib/graphql/schema/visibility.rb @@ -10,9 +10,9 @@ class Schema class Visibility # @param schema [Class] # @param profiles [Hash Hash>] A hash of `name => context` pairs for preloading visibility profiles - # @param preload [Boolean] if `true`, load the default schema profile and all named profiles immediately (defaults to `true` for `Rails.env.production?`) + # @param preload [Boolean] if `true`, load the default schema profile and all named profiles immediately (defaults to `false` for `Rails.env.development?`) # @param migration_errors [Boolean] if `true`, raise an error when `Visibility` and `Warden` return different results - def self.use(schema, dynamic: false, profiles: EmptyObjects::EMPTY_HASH, preload: (defined?(Rails.env) ? Rails.env.production? : nil), migration_errors: false) + def self.use(schema, dynamic: false, profiles: EmptyObjects::EMPTY_HASH, preload: (defined?(Rails.env) ? !Rails.env.development? : nil), migration_errors: false) profiles&.each { |name, ctx| ctx[:visibility_profile] = name ctx.freeze diff --git a/spec/graphql/schema/visibility_spec.rb b/spec/graphql/schema/visibility_spec.rb index 507599f15d..cbf5175ad2 100644 --- a/spec/graphql/schema/visibility_spec.rb +++ b/spec/graphql/schema/visibility_spec.rb @@ -310,4 +310,28 @@ def self.resolve_type(...); Thing; end res = InterfaceSuperclassSchema.execute("{ node { id ... on Thing { name } } }") assert_equal "Hat", res["data"]["node"]["name"] end + + focus + it "defaults to preload: true for Rails.env.staging?" do + prev_rails = defined?(Rails) ? Rails : nil + mock_env = OpenStruct.new(:development? => false) + Object.const_set(:Rails, OpenStruct.new(env: mock_env)) + schema = Class.new(GraphQL::Schema) do + use GraphQL::Schema::Visibility + end + refute Rails.env.development? + assert schema.visibility.preload? + + mock_env[:development?] = true + + schema = Class.new(GraphQL::Schema) do + use GraphQL::Schema::Visibility + end + assert Rails.env.development? + refute schema.visibility.preload? + ensure + if prev_rails + const_set(:Rails, prev_rails) + end + end end From 849eca9ccbac46fd8b1182d4e66d38e870c30045 Mon Sep 17 00:00:00 2001 From: Robert Mosolgo Date: Mon, 8 Dec 2025 11:54:03 -0500 Subject: [PATCH 2/3] Don't default preload: true for Rails.env.test? --- lib/graphql/schema/visibility.rb | 4 ++-- spec/graphql/schema/visibility_spec.rb | 11 ++++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/lib/graphql/schema/visibility.rb b/lib/graphql/schema/visibility.rb index 61e9c716a1..c8b53122ca 100644 --- a/lib/graphql/schema/visibility.rb +++ b/lib/graphql/schema/visibility.rb @@ -10,9 +10,9 @@ class Schema class Visibility # @param schema [Class] # @param profiles [Hash Hash>] A hash of `name => context` pairs for preloading visibility profiles - # @param preload [Boolean] if `true`, load the default schema profile and all named profiles immediately (defaults to `false` for `Rails.env.development?`) + # @param preload [Boolean] if `true`, load the default schema profile and all named profiles immediately (defaults to `true` for `Rails.env.production?` and `Rails.env.staging?`) # @param migration_errors [Boolean] if `true`, raise an error when `Visibility` and `Warden` return different results - def self.use(schema, dynamic: false, profiles: EmptyObjects::EMPTY_HASH, preload: (defined?(Rails.env) ? !Rails.env.development? : nil), migration_errors: false) + def self.use(schema, dynamic: false, profiles: EmptyObjects::EMPTY_HASH, preload: (defined?(Rails.env) ? (Rails.env.production? || Rails.env.staging?) : nil), migration_errors: false) profiles&.each { |name, ctx| ctx[:visibility_profile] = name ctx.freeze diff --git a/spec/graphql/schema/visibility_spec.rb b/spec/graphql/schema/visibility_spec.rb index cbf5175ad2..dc03408f77 100644 --- a/spec/graphql/schema/visibility_spec.rb +++ b/spec/graphql/schema/visibility_spec.rb @@ -311,23 +311,24 @@ def self.resolve_type(...); Thing; end assert_equal "Hat", res["data"]["node"]["name"] end - focus it "defaults to preload: true for Rails.env.staging?" do prev_rails = defined?(Rails) ? Rails : nil - mock_env = OpenStruct.new(:development? => false) + mock_env = OpenStruct.new(:staging? => true) Object.const_set(:Rails, OpenStruct.new(env: mock_env)) schema = Class.new(GraphQL::Schema) do use GraphQL::Schema::Visibility end - refute Rails.env.development? + assert Rails.env.staging? assert schema.visibility.preload? - mock_env[:development?] = true + mock_env[:staging?] = false + mock_env[:test?] = true schema = Class.new(GraphQL::Schema) do use GraphQL::Schema::Visibility end - assert Rails.env.development? + assert Rails.env.test? + refute Rails.env.staging? refute schema.visibility.preload? ensure if prev_rails From b74bf4a389dca18a2f6bf4df8d6564564e7228a4 Mon Sep 17 00:00:00 2001 From: Robert Mosolgo Date: Mon, 8 Dec 2025 12:01:58 -0500 Subject: [PATCH 3/3] Improve test setup and teardown --- spec/graphql/schema/visibility_spec.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/spec/graphql/schema/visibility_spec.rb b/spec/graphql/schema/visibility_spec.rb index dc03408f77..223cf2fdcf 100644 --- a/spec/graphql/schema/visibility_spec.rb +++ b/spec/graphql/schema/visibility_spec.rb @@ -312,7 +312,10 @@ def self.resolve_type(...); Thing; end end it "defaults to preload: true for Rails.env.staging?" do - prev_rails = defined?(Rails) ? Rails : nil + if defined?(Rails) + prev_rails = Rails + Object.send :remove_const, :Rails + end mock_env = OpenStruct.new(:staging? => true) Object.const_set(:Rails, OpenStruct.new(env: mock_env)) schema = Class.new(GraphQL::Schema) do @@ -331,8 +334,9 @@ def self.resolve_type(...); Thing; end refute Rails.env.staging? refute schema.visibility.preload? ensure + Object.send(:remove_const, :Rails) if prev_rails - const_set(:Rails, prev_rails) + Object.const_set(:Rails, prev_rails) end end end