diff --git a/lib/graphql/dataloader/source.rb b/lib/graphql/dataloader/source.rb index d70db0a2a4..9aa3ac2d2c 100644 --- a/lib/graphql/dataloader/source.rb +++ b/lib/graphql/dataloader/source.rb @@ -73,7 +73,7 @@ def load_all(values) end } - if pending_keys.any? + if pending_keys.size.positive? sync(pending_keys) end diff --git a/spec/graphql/dataloader_spec.rb b/spec/graphql/dataloader_spec.rb index 69b0b13d14..3b1d1d8091 100644 --- a/spec/graphql/dataloader_spec.rb +++ b/spec/graphql/dataloader_spec.rb @@ -231,6 +231,22 @@ def recipe(recipe:) recipe end + field :recipe_by_id_using_load, Recipe do + argument :id, ID, required: false + end + + def recipe_by_id_using_load(id:) + dataloader.with(DataObject).load(id) + end + + field :recipes_by_id_using_load_all, [Recipe] do + argument :ids, [ID, null: true] + end + + def recipes_by_id_using_load_all(ids:) + dataloader.with(DataObject).load_all(ids) + end + field :recipes_by_id, [Recipe] do argument :ids, [ID], loads: Recipe, as: :recipes end @@ -901,6 +917,30 @@ def self.included(child_class) assert_equal 1, context[:batched_calls_counter].count end + it "works when passing nil into source" do + query_str = <<-GRAPHQL + query($id: ID) { + recipe: recipeByIdUsingLoad(id: $id) { + name + } + } + GRAPHQL + res = schema.execute(query_str, variables: { id: nil }) + expected_data = { "recipe" => nil } + assert_equal expected_data, res["data"] + + query_str = <<-GRAPHQL + query($ids: [ID]!) { + recipes: recipesByIdUsingLoadAll(ids: $ids) { + name + } + } + GRAPHQL + res = schema.execute(query_str, variables: { ids: [nil] }) + expected_data = { "recipes" => nil } + assert_equal expected_data, res["data"] + end + it "Works with input objects using variables, load and request" do query_str = <<-GRAPHQL query($input: CommonIngredientsInput!) {