diff --git a/lib/graphql/schema/visibility.rb b/lib/graphql/schema/visibility.rb index 0ac274a786..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 `true` for `Rails.env.production?`) + # @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.production? : 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 507599f15d..223cf2fdcf 100644 --- a/spec/graphql/schema/visibility_spec.rb +++ b/spec/graphql/schema/visibility_spec.rb @@ -310,4 +310,33 @@ def self.resolve_type(...); Thing; end res = InterfaceSuperclassSchema.execute("{ node { id ... on Thing { name } } }") assert_equal "Hat", res["data"]["node"]["name"] end + + it "defaults to preload: true for Rails.env.staging?" do + 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 + use GraphQL::Schema::Visibility + end + assert Rails.env.staging? + assert schema.visibility.preload? + + mock_env[:staging?] = false + mock_env[:test?] = true + + schema = Class.new(GraphQL::Schema) do + use GraphQL::Schema::Visibility + end + assert Rails.env.test? + refute Rails.env.staging? + refute schema.visibility.preload? + ensure + Object.send(:remove_const, :Rails) + if prev_rails + Object.const_set(:Rails, prev_rails) + end + end end