Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 9 additions & 19 deletions src/graphql/validation/validation_context.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
VisitorAction,
visit,
)
from ..pyutils import Undefined
from ..utilities import TypeInfo, TypeInfoVisitor

if TYPE_CHECKING:
Expand Down Expand Up @@ -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


Expand Down
31 changes: 30 additions & 1 deletion tests/validation/test_variables_in_allowed_position.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
"""
Expand Down Expand Up @@ -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
}
}
"""
Expand Down
Loading