Skip to content

Commit

Permalink
Transform input objects used as default values (#206)
Browse files Browse the repository at this point in the history
  • Loading branch information
Cito committed Jan 26, 2025
1 parent d4f8b32 commit 6c9475b
Show file tree
Hide file tree
Showing 2 changed files with 100 additions and 4 deletions.
17 changes: 13 additions & 4 deletions src/graphql/execution/values.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
GraphQLDirective,
GraphQLField,
GraphQLSchema,
is_input_object_type,
is_input_type,
is_non_null_type,
)
Expand Down Expand Up @@ -171,8 +172,12 @@ def get_argument_values(
argument_node = arg_node_map.get(name)

if argument_node is None:
if arg_def.default_value is not Undefined:
coerced_values[arg_def.out_name or name] = arg_def.default_value
value = arg_def.default_value
if value is not Undefined:
if is_input_object_type(arg_def.type):
# try to coerce input value so that out_names are used
value = coerce_input_value(value, arg_def.type)
coerced_values[arg_def.out_name or name] = value
elif is_non_null_type(arg_type): # pragma: no cover else
msg = (
f"Argument '{name}' of required type '{arg_type}' was not provided."
Expand All @@ -186,8 +191,12 @@ def get_argument_values(
if isinstance(value_node, VariableNode):
variable_name = value_node.name.value
if variable_values is None or variable_name not in variable_values:
if arg_def.default_value is not Undefined:
coerced_values[arg_def.out_name or name] = arg_def.default_value
value = arg_def.default_value
if value is not Undefined:
if is_input_object_type(arg_def.type):
# coerce input value so that out_names are used
value = coerce_input_value(value, arg_def.type)
coerced_values[arg_def.out_name or name] = value
elif is_non_null_type(arg_type): # pragma: no cover else
msg = (
f"Argument '{name}' of required type '{arg_type}'"
Expand Down
87 changes: 87 additions & 0 deletions tests/execution/test_resolve.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@
from graphql.type import (
GraphQLArgument,
GraphQLField,
GraphQLID,
GraphQLInputField,
GraphQLInputObjectType,
GraphQLInt,
GraphQLList,
GraphQLObjectType,
GraphQLSchema,
GraphQLString,
Expand Down Expand Up @@ -213,6 +215,91 @@ def execute_query(query: str, root_value: Any = None) -> ExecutionResult:
None,
)

def transforms_default_values_using_out_names():
# This is an extension of GraphQL.js.
resolver_kwargs: Any

def search_resolver(_obj: None, _info, **kwargs):
nonlocal resolver_kwargs
resolver_kwargs = kwargs
return [{"id": "42"}]

filters_type = GraphQLInputObjectType(
"SearchFilters",
{"pageSize": GraphQLInputField(GraphQLInt, out_name="page_size")},
)
result_type = GraphQLObjectType("SearchResult", {"id": GraphQLField(GraphQLID)})
query = GraphQLObjectType(
"Query",
{
"search": GraphQLField(
GraphQLList(result_type),
{
"searchFilters": GraphQLArgument(
filters_type, {"pageSize": 10}, out_name="search_filters"
)
},
resolve=search_resolver,
)
},
)
schema = GraphQLSchema(query)

resolver_kwargs = None
result = execute_sync(schema, parse("{ search { id } }"))
assert result == ({"search": [{"id": "42"}]}, None)
assert resolver_kwargs == {"search_filters": {"page_size": 10}}

resolver_kwargs = None
result = execute_sync(
schema, parse("{ search(searchFilters:{pageSize: 25}) { id } }")
)
assert result == ({"search": [{"id": "42"}]}, None)
assert resolver_kwargs == {"search_filters": {"page_size": 25}}

resolver_kwargs = None
result = execute_sync(
schema,
parse(
"""
query ($searchFilters: SearchFilters) {
search(searchFilters: $searchFilters) { id }
}
"""
),
)
assert result == ({"search": [{"id": "42"}]}, None)
assert resolver_kwargs == {"search_filters": {"page_size": 10}}

resolver_kwargs = None
result = execute_sync(
schema,
parse(
"""
query ($searchFilters: SearchFilters) {
search(searchFilters: $searchFilters) { id }
}
"""
),
variable_values={"searchFilters": {"pageSize": 25}},
)
assert result == ({"search": [{"id": "42"}]}, None)
assert resolver_kwargs == {"search_filters": {"page_size": 25}}

resolver_kwargs = None
result = execute_sync(
schema,
parse(
"""
query ($searchFilters: SearchFilters = {pageSize: 25}) {
search(searchFilters: $searchFilters) { id }
}
"""
),
)
assert result == ({"search": [{"id": "42"}]}, None)
assert resolver_kwargs == {"search_filters": {"page_size": 25}}

def pass_error_from_resolver_wrapped_as_located_graphql_error():
def resolve(_obj, _info):
raise ValueError("Some error")
Expand Down

0 comments on commit 6c9475b

Please sign in to comment.