Skip to content

Commit 1833ca9

Browse files
author
Robert Mosolgo
authored
Merge pull request rmosolgo#1851 from cjoudrey/improvements-to-loads
Passthrough `null` values for arguments using `loads`
2 parents 213854e + 3041fbb commit 1833ca9

File tree

2 files changed

+82
-4
lines changed

2 files changed

+82
-4
lines changed

lib/graphql/schema/resolver.rb

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -139,10 +139,14 @@ def load_arguments(args)
139139
args.each do |key, value|
140140
arg_defn = @arguments_by_keyword[key]
141141
if arg_defn
142-
prepped_value = prepared_args[key] = load_argument(key, value)
143-
if context.schema.lazy?(prepped_value)
144-
prepare_lazies << context.schema.after_lazy(prepped_value) do |finished_prepped_value|
145-
prepared_args[key] = finished_prepped_value
142+
if value.nil?
143+
prepared_args[key] = value
144+
else
145+
prepped_value = prepared_args[key] = load_argument(key, value)
146+
if context.schema.lazy?(prepped_value)
147+
prepare_lazies << context.schema.after_lazy(prepped_value) do |finished_prepped_value|
148+
prepared_args[key] = finished_prepped_value
149+
end
146150
end
147151
end
148152
else

spec/graphql/schema/resolver_spec.rb

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,36 @@ def resolve
271271
end
272272
end
273273

274+
class MutationWithNullableLoadsArgument < GraphQL::Schema::Mutation
275+
argument :label_id, ID, required: false, loads: HasValue
276+
argument :label_ids, [ID], required: false, loads: HasValue
277+
278+
field :inputs, String, null: false
279+
280+
def resolve(**inputs)
281+
{
282+
inputs: JSON.dump(inputs)
283+
}
284+
end
285+
end
286+
287+
class MutationWithRequiredLoadsArgument < GraphQL::Schema::Mutation
288+
argument :label_id, ID, required: true, loads: HasValue
289+
290+
field :inputs, String, null: false
291+
292+
def resolve(**inputs)
293+
{
294+
inputs: JSON.dump(inputs)
295+
}
296+
end
297+
end
298+
299+
class Mutation < GraphQL::Schema::Object
300+
field :mutation_with_nullable_loads_argument, mutation: MutationWithNullableLoadsArgument
301+
field :mutation_with_required_loads_argument, mutation: MutationWithRequiredLoadsArgument
302+
end
303+
274304
class Query < GraphQL::Schema::Object
275305
class CustomField < GraphQL::Schema::Field
276306
def resolve_field(*args)
@@ -312,8 +342,17 @@ def resolve_field(*args)
312342

313343
class Schema < GraphQL::Schema
314344
query(Query)
345+
mutation(Mutation)
315346
lazy_resolve LazyBlock, :value
316347
orphan_types IntegerWrapper
348+
349+
def object_from_id(id, ctx)
350+
if id == "invalid"
351+
nil
352+
else
353+
1
354+
end
355+
end
317356
end
318357
end
319358

@@ -535,6 +574,41 @@ def add_error_assertions(field_name, description)
535574
# (100 + 8) * 3
536575
assert_equal [27, 54, 324], res["data"]["prepResolver9Array"].map { |v| v["value"] }
537576
end
577+
578+
it "preserves `nil` when nullable argument is provided `null`" do
579+
res = exec_query("mutation { mutationWithNullableLoadsArgument(labelId: null) { inputs } }")
580+
581+
assert_equal nil, res["errors"]
582+
assert_equal '{"label":null}', res["data"]["mutationWithNullableLoadsArgument"]["inputs"]
583+
end
584+
585+
it "preserves `nil` when nullable list argument is provided `null`" do
586+
res = exec_query("mutation { mutationWithNullableLoadsArgument(labelIds: null) { inputs } }")
587+
588+
assert_equal nil, res["errors"]
589+
assert_equal '{"labels":null}', res["data"]["mutationWithNullableLoadsArgument"]["inputs"]
590+
end
591+
592+
it "omits omitted nullable argument" do
593+
res = exec_query("mutation { mutationWithNullableLoadsArgument { inputs } }")
594+
595+
assert_equal nil, res["errors"]
596+
assert_equal "{}", res["data"]["mutationWithNullableLoadsArgument"]["inputs"]
597+
end
598+
599+
it "returns an error when nullable argument is provided an invalid value" do
600+
res = exec_query('mutation { mutationWithNullableLoadsArgument(labelId: "invalid") { inputs } }')
601+
602+
assert res["errors"]
603+
assert_equal 'No object found for `labelId: "invalid"`', res["errors"][0]["message"]
604+
end
605+
606+
it "returns an error when a non-nullable argument is provided an invalid value" do
607+
res = exec_query('mutation { mutationWithRequiredLoadsArgument(labelId: "invalid") { inputs } }')
608+
609+
assert res["errors"]
610+
assert_equal 'No object found for `labelId: "invalid"`', res["errors"][0]["message"]
611+
end
538612
end
539613
end
540614
end

0 commit comments

Comments
 (0)