From 940dc361cdaf7157284dd5795b3e4d2e65a86edb Mon Sep 17 00:00:00 2001 From: Robert Mosolgo Date: Wed, 24 Jun 2026 14:28:00 -0400 Subject: [PATCH 1/3] Copy replication from script --- .../dataloader/async_dataloader_spec.rb | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/spec/graphql/dataloader/async_dataloader_spec.rb b/spec/graphql/dataloader/async_dataloader_spec.rb index 59d8172cba..000cc74dd4 100644 --- a/spec/graphql/dataloader/async_dataloader_spec.rb +++ b/spec/graphql/dataloader/async_dataloader_spec.rb @@ -389,5 +389,63 @@ class TraceAsyncSchema < AsyncSchema check_snapshot(data, if_exec_next("example-next.json", "example.json")) end end + + if testing_rails? + describe "with activerecord" do + class ActiveRecordAsyncSchema < GraphQL::Schema + class Author < GraphQL::Schema::Object + field :name, String + end + + class Book < GraphQL::Schema::Object + field :title, String + field :author, Author + end + + Author.field(:books, Book.connection_type) + + class Query < GraphQL::Schema::Object + field :book, Book do + argument :title, String + end + + def book(title:) + puts "Begin Book: #{title}" + result = dataload_record(::Book, title, find_by: :title) + puts "End Book: #{title}" + result + end + + field :author, Author do + argument :name, String + end + + def author(name:) + puts "Begin Author: #{name}" + result = dataload_record(::Author, name, find_by: :name) + puts "End Author: #{name}" + result + end + end + + query(Query) + use GraphQL::Dataloader::AsyncDataloader + end + + it "works with repeated queries" do + query_str = <<~GRAPHQL + { + author(name: "William Shakespeare") { name } + b1: book(title: "A Midsummer Night's Dream") { title author { name } } + b2: book(title: "Hamlet") { title author { name } } + } + GRAPHQL + + 5.times do + ActiveRecordAsyncSchema.execute(query_str) + end + end + end + end end end From d29c3f95e088e60b9e23264716c50a7f5b0c416f Mon Sep 17 00:00:00 2001 From: Robert Mosolgo Date: Wed, 24 Jun 2026 14:37:58 -0400 Subject: [PATCH 2/3] Improve replication to fail properly --- .../dataloader/async_dataloader_spec.rb | 30 ++++++++++++------- .../dataloader/async_dataloader_spec.rb | 2 +- spec/integration/rails/spec_helper.rb | 5 +++- 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/spec/graphql/dataloader/async_dataloader_spec.rb b/spec/graphql/dataloader/async_dataloader_spec.rb index 000cc74dd4..b3c4db27ca 100644 --- a/spec/graphql/dataloader/async_dataloader_spec.rb +++ b/spec/graphql/dataloader/async_dataloader_spec.rb @@ -390,7 +390,7 @@ class TraceAsyncSchema < AsyncSchema end end - if testing_rails? + if testing_rails? && ISOLATION_LEVEL_FIBER describe "with activerecord" do class ActiveRecordAsyncSchema < GraphQL::Schema class Author < GraphQL::Schema::Object @@ -410,10 +410,7 @@ class Query < GraphQL::Schema::Object end def book(title:) - puts "Begin Book: #{title}" - result = dataload_record(::Book, title, find_by: :title) - puts "End Book: #{title}" - result + dataload_record(::Book, title, find_by: :title) end field :author, Author do @@ -421,10 +418,7 @@ def book(title:) end def author(name:) - puts "Begin Author: #{name}" - result = dataload_record(::Author, name, find_by: :name) - puts "End Author: #{name}" - result + dataload_record(::Author, name, find_by: :name) end end @@ -441,9 +435,23 @@ def author(name:) } GRAPHQL - 5.times do - ActiveRecordAsyncSchema.execute(query_str) + results = [] + 10.times do + stdout, stderr = capture_io do + result = ActiveRecordAsyncSchema.execute(query_str) + results << [ + result["data"]["author"]["name"], + result["data"]["b2"]["title"] + ] + end + assert_equal "", stdout, "Nothing to stdout" + assert_equal "", stderr, "Nothing to stderr (like warnings from Task errors)" + rescue + :failed end + + p results + assert_equal Array.new(10, ["William Shakespeare", "Hamlet"]), results end end end diff --git a/spec/integration/rails/graphql/dataloader/async_dataloader_spec.rb b/spec/integration/rails/graphql/dataloader/async_dataloader_spec.rb index 68f4734db6..ed027c28d1 100644 --- a/spec/integration/rails/graphql/dataloader/async_dataloader_spec.rb +++ b/spec/integration/rails/graphql/dataloader/async_dataloader_spec.rb @@ -89,7 +89,7 @@ def role end before { - skip("Only test when isolation_level = :fiber") unless ENV["ISOLATION_LEVEL_FIBER"] + skip("Only test when isolation_level = :fiber") unless ISOLATION_LEVEL_FIBER } it "cleans up database connections" do diff --git a/spec/integration/rails/spec_helper.rb b/spec/integration/rails/spec_helper.rb index 722dd73226..fa13d6750b 100644 --- a/spec/integration/rails/spec_helper.rb +++ b/spec/integration/rails/spec_helper.rb @@ -10,9 +10,12 @@ require "sqlite3" end -if ENV["ISOLATION_LEVEL_FIBER"] +ISOLATION_LEVEL_FIBER = if ENV["ISOLATION_LEVEL_FIBER"] ActiveSupport::IsolatedExecutionState.isolation_level = :fiber puts "ActiveSupport::IsolatedExecutionState: #{ActiveSupport::IsolatedExecutionState.isolation_level}" + true +else + false end require_relative "generators/base_generator_test" From 8bc4b60992b2026d9a6277df63a99fa6e3211a14 Mon Sep 17 00:00:00 2001 From: Robert Mosolgo Date: Thu, 25 Jun 2026 09:52:41 -0400 Subject: [PATCH 3/3] remove debug --- spec/graphql/dataloader/async_dataloader_spec.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/spec/graphql/dataloader/async_dataloader_spec.rb b/spec/graphql/dataloader/async_dataloader_spec.rb index b3c4db27ca..033ac012a9 100644 --- a/spec/graphql/dataloader/async_dataloader_spec.rb +++ b/spec/graphql/dataloader/async_dataloader_spec.rb @@ -450,7 +450,6 @@ def author(name:) :failed end - p results assert_equal Array.new(10, ["William Shakespeare", "Hamlet"]), results end end