diff --git a/src/graphql/validation/validation_context.py b/src/graphql/validation/validation_context.py index d39f94aa..175403ef 100644 --- a/src/graphql/validation/validation_context.py +++ b/src/graphql/validation/validation_context.py @@ -21,7 +21,6 @@ VisitorAction, visit, ) -from ..pyutils import Undefined from ..utilities import TypeInfo, TypeInfoVisitor if TYPE_CHECKING: @@ -85,33 +84,24 @@ def enter_variable_definition(self, *_args: Any) -> VisitorAction: def enter_variable(self, node: VariableNode, *_args: Any) -> VisitorAction: type_info = self._type_info fragment_definition = self._fragment_definition + fragment_variable_definition = None if fragment_definition: fragment_signature = type_info.get_fragment_signature_by_name()( fragment_definition.name.value ) - fragment_variable_definition = ( - fragment_signature.variable_definitions.get(node.name.value) - if fragment_signature - else None - ) - # Fragment variables have a variable default but no location default, - # which is what this default value represents. - usage = VariableUsage( - node, - type_info.get_input_type(), - type_info.get_parent_input_type(), - Undefined, - fragment_variable_definition, - ) - else: - usage = VariableUsage( + if fragment_signature: + fragment_variable_definition = ( + fragment_signature.variable_definitions.get(node.name.value) + ) + self._append_usage( + VariableUsage( node, type_info.get_input_type(), type_info.get_parent_input_type(), type_info.get_default_value(), - None, + fragment_variable_definition, ) - self._append_usage(usage) + ) return None diff --git a/tests/validation/test_variables_in_allowed_position.py b/tests/validation/test_variables_in_allowed_position.py index 41e37f05..56683dd6 100644 --- a/tests/validation/test_variables_in_allowed_position.py +++ b/tests/validation/test_variables_in_allowed_position.py @@ -374,6 +374,20 @@ def forbids_one_nullable_variable(): ) def describe_fragment_arguments_are_validated(): + def int_to_non_null_int_when_field_argument_provides_default_value(): + assert_valid( + """ + query Query { + complicatedArgs { + ...A + } + } + fragment A($intVar: Int) on ComplicatedArgs { + nonNullFieldWithDefault(arg: $intVar) + } + """ + ) + def validates_fragment_variables_defined_before_the_operation(): assert_errors( """ @@ -505,7 +519,22 @@ def int_to_non_null_int_when_optional_arg_provides_default_value(): """ query Query($intVar: Int) { complicatedArgs { - nonNullFieldWithDefault(nonNullIntArg: $intVar) + nonNullFieldWithDefault(arg: $intVar) + } + } + """ + ) + + def int_to_non_null_int_when_argument_default_is_inside_fragment(): + assert_valid( + """ + fragment defaultArgFrag on ComplicatedArgs { + nonNullFieldWithDefault(arg: $intVar) + } + + query Query($intVar: Int) { + complicatedArgs { + ...defaultArgFrag } } """