Skip to content

Commit e20b1fd

Browse files
committed
Test run_isolated
1 parent d337203 commit e20b1fd

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-1
lines changed

lib/graphql/dataloader.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,11 @@ def append_job(&job)
8181
def run_isolated
8282
prev_queue = @pending_jobs
8383
@pending_jobs = []
84-
res = yield
84+
res = nil
85+
# Make sure the block is inside a Fiber, so it can `Fiber.yield`
86+
append_job {
87+
res = yield
88+
}
8589
run
8690
res
8791
ensure

spec/graphql/dataloader_spec.rb

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -734,6 +734,42 @@ def request_all
734734
assert :world, value
735735
end
736736

737+
describe "#run_isolated" do
738+
module RunIsolated
739+
class CountSource < GraphQL::Dataloader::Source
740+
def fetch(ids)
741+
@count ||= 0
742+
@count += ids.size
743+
ids.map { |_id| @count }
744+
end
745+
end
746+
end
747+
748+
it "uses its own queue" do
749+
dl = GraphQL::Dataloader.new
750+
result = {}
751+
dl.append_job { result[:a] = 1 }
752+
dl.append_job { result[:b] = 2 }
753+
dl.append_job { result[:c] = 3 }
754+
755+
dl.run_isolated { result[:d] = 4 }
756+
757+
assert_equal({ d: 4 }, result)
758+
759+
dl.run_isolated {
760+
r1 = dl.with(RunIsolated::CountSource).request(1)
761+
r2 = dl.with(RunIsolated::CountSource).request(2)
762+
r3 = dl.with(RunIsolated::CountSource).request(3)
763+
# This is going to Fiber.yield
764+
result[:e] = r3.load
765+
}
766+
767+
assert_equal({ d: 4, e: 3 }, result)
768+
dl.run
769+
assert_equal({ a: 1, b: 2, c: 3, d: 4, e: 3 }, result)
770+
end
771+
end
772+
737773
describe "thread local variables" do
738774
module ThreadVariable
739775
class Type < GraphQL::Schema::Object

0 commit comments

Comments
 (0)