From 338ce7dfa1b76d2d4d4a937b42083a61daf10afc Mon Sep 17 00:00:00 2001 From: Robert Mosolgo Date: Mon, 21 Apr 2025 15:47:59 -0400 Subject: [PATCH 1/2] Simplify check for non-null input object arguments --- lib/graphql/schema/input_object.rb | 42 ++++++++++++++++-------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/lib/graphql/schema/input_object.rb b/lib/graphql/schema/input_object.rb index b3d5d6efa53..ec4a3bc1861 100644 --- a/lib/graphql/schema/input_object.rb +++ b/lib/graphql/schema/input_object.rb @@ -176,30 +176,32 @@ def validate_non_null_input(input, ctx, max_errors: nil) return GraphQL::Query::InputValidationResult.from_problem(INVALID_OBJECT_MESSAGE % { object: JSON.generate(input, quirks_mode: true) }) end - # Inject missing required arguments - missing_required_inputs = ctx.types.arguments(self).reduce({}) do |m, (argument)| - if !input.key?(argument.graphql_name) && argument.type.non_null? && !argument.default_value? && types.argument(self, argument.graphql_name) - m[argument.graphql_name] = nil - end - m + result = nil + + # Check for missing non-null arguments + ctx.types.arguments(self).each do |argument| + if !input.key?(argument.graphql_name) && argument.type.non_null? && !argument.default_value? + result ||= Query::InputValidationResult.new + argument_result = argument.type.validate_input(value, ctx) + if !argument_result.valid? + result.merge_result!(argument_name, argument_result) + end + end end - result = nil - [input, missing_required_inputs].each do |args_to_validate| - args_to_validate.each do |argument_name, value| - argument = types.argument(self, argument_name) - # Items in the input that are unexpected - if argument.nil? - result ||= Query::InputValidationResult.new - result.add_problem("Field is not defined on #{self.graphql_name}", [argument_name]) - else - # Items in the input that are expected, but have invalid values - argument_result = argument.type.validate_input(value, ctx) + input.each do |argument_name, value| + argument = types.argument(self, argument_name) + # Items in the input that are unexpected + if argument.nil? + result ||= Query::InputValidationResult.new + result.add_problem("Field is not defined on #{self.graphql_name}", [argument_name]) + else + # Items in the input that are expected, but have invalid values + argument_result = argument.type.validate_input(value, ctx) + if !argument_result.valid? result ||= Query::InputValidationResult.new - if !argument_result.valid? - result.merge_result!(argument_name, argument_result) - end + result.merge_result!(argument_name, argument_result) end end end From 4f206d80be7ff2ce398bb729dc290f7f8c53aa0a Mon Sep 17 00:00:00 2001 From: Robert Mosolgo Date: Mon, 21 Apr 2025 16:00:42 -0400 Subject: [PATCH 2/2] Fix broken tests --- lib/graphql/schema/input_object.rb | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/lib/graphql/schema/input_object.rb b/lib/graphql/schema/input_object.rb index ec4a3bc1861..0e8e8631d1f 100644 --- a/lib/graphql/schema/input_object.rb +++ b/lib/graphql/schema/input_object.rb @@ -179,16 +179,6 @@ def validate_non_null_input(input, ctx, max_errors: nil) result = nil - # Check for missing non-null arguments - ctx.types.arguments(self).each do |argument| - if !input.key?(argument.graphql_name) && argument.type.non_null? && !argument.default_value? - result ||= Query::InputValidationResult.new - argument_result = argument.type.validate_input(value, ctx) - if !argument_result.valid? - result.merge_result!(argument_name, argument_result) - end - end - end input.each do |argument_name, value| argument = types.argument(self, argument_name) @@ -206,6 +196,17 @@ def validate_non_null_input(input, ctx, max_errors: nil) end end + # Check for missing non-null arguments + ctx.types.arguments(self).each do |argument| + if !input.key?(argument.graphql_name) && argument.type.non_null? && !argument.default_value? + result ||= Query::InputValidationResult.new + argument_result = argument.type.validate_input(nil, ctx) + if !argument_result.valid? + result.merge_result!(argument.graphql_name, argument_result) + end + end + end + if one_of? if input.size == 1 input.each do |name, value|