From be09d068dfe2ed05aa1a72772a0eca8ecf8c9e10 Mon Sep 17 00:00:00 2001 From: ydah Date: Wed, 16 Sep 2026 21:01:39 +0900 Subject: [PATCH] Resolve default lazy values in Execution::Next --- lib/graphql/schema.rb | 9 +++---- spec/graphql/execution/next_spec.rb | 40 +++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 6 deletions(-) diff --git a/lib/graphql/schema.rb b/lib/graphql/schema.rb index 48f502b447..341a1ee411 100644 --- a/lib/graphql/schema.rb +++ b/lib/graphql/schema.rb @@ -1360,13 +1360,10 @@ def lazy_resolve(lazy_class, value_method) end def resolves_lazies? - lazy_method_count = 0 - lazy_methods.each do |k, v| - if !v.nil? - lazy_method_count += 1 - end + lazy_methods.each do |_lazy_class, lazy_method| + return true if lazy_method end - lazy_method_count > 2 + false end def instrument(instrument_step, instrumenter, options = {}) diff --git a/spec/graphql/execution/next_spec.rb b/spec/graphql/execution/next_spec.rb index d924e020c1..207206dfd2 100644 --- a/spec/graphql/execution/next_spec.rb +++ b/spec/graphql/execution/next_spec.rb @@ -132,6 +132,28 @@ def self.resolve_type(abs_type, obj, ctx) end end + class DefaultLazySchema < GraphQL::Schema + class Source < GraphQL::Dataloader::Source + def fetch(keys) + keys.map { |key| "loaded-#{key}" } + end + end + + class Query < GraphQL::Schema::Object + field :value, String, null: false, resolve_static: true + + def self.value(context) + context.dataloader.with(Source).request(1) + end + end + + query(Query) + use GraphQL::Dataloader + use GraphQL::Execution::Next + end + + class DefaultLazySubclass < GraphQL::Execution::Lazy + end def run_next(...) NextExecutionSchema.execute_next(...) @@ -142,6 +164,24 @@ def run_next(...) NextExecutionSchema::DATA.concat(Marshal.load(Marshal.dump(NextExecutionSchema::CLEAN_DATA))) end + it "keeps lazy detection stable after subclass lookups" do + schema = Class.new(GraphQL::Schema) + resolves_lazies_before = schema.resolves_lazies? + + assert schema.lazy?(DefaultLazySubclass.new { nil }) + assert_equal resolves_lazies_before, schema.resolves_lazies? + assert resolves_lazies_before + end + + it "resolves default Dataloader requests" do + result = nil + capture_io do + result = DefaultLazySchema.execute_next("{ value }") + end + + assert_equal({ "data" => { "value" => "loaded-1" } }, result.to_h) + end + it "runs a query" do result = run_next(" query TestNext($name: String!) {