Skip to content

Commit 0270754

Browse files
committed
Transform input objects used as default values
1 parent 3819199 commit 0270754

File tree

2 files changed

+103
-6
lines changed

2 files changed

+103
-6
lines changed

src/graphql/execution/values.py

+14-4
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
GraphQLField,
2424
GraphQLInputType,
2525
GraphQLSchema,
26+
is_input_object_type,
2627
is_input_type,
2728
is_non_null_type,
2829
)
@@ -160,8 +161,13 @@ def get_argument_values(
160161
argument_node = arg_node_map.get(name)
161162

162163
if argument_node is None:
163-
if arg_def.default_value is not Undefined:
164-
coerced_values[arg_def.out_name or name] = arg_def.default_value
164+
value = arg_def.default_value
165+
if value is not Undefined:
166+
if is_input_object_type(arg_def.type):
167+
# coerce input value so that out_names are used
168+
value = coerce_input_value(value, arg_def.type)
169+
170+
coerced_values[arg_def.out_name or name] = value
165171
elif is_non_null_type(arg_type): # pragma: no cover else
166172
raise GraphQLError(
167173
f"Argument '{name}' of required type '{arg_type}'"
@@ -176,8 +182,12 @@ def get_argument_values(
176182
if isinstance(value_node, VariableNode):
177183
variable_name = value_node.name.value
178184
if variable_values is None or variable_name not in variable_values:
179-
if arg_def.default_value is not Undefined:
180-
coerced_values[arg_def.out_name or name] = arg_def.default_value
185+
value = arg_def.default_value
186+
if value is not Undefined:
187+
if is_input_object_type(arg_def.type):
188+
# coerce input value so that out_names are used
189+
value = coerce_input_value(value, arg_def.type)
190+
coerced_values[arg_def.out_name or name] = value
181191
elif is_non_null_type(arg_type): # pragma: no cover else
182192
raise GraphQLError(
183193
f"Argument '{name}' of required type '{arg_type}'"

tests/execution/test_resolve.py

+89-2
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,16 @@
22
from typing import Any
33

44
from graphql.error import GraphQLError
5-
from graphql.execution import execute_sync, ExecutionResult
6-
from graphql.language import parse, SourceLocation
5+
from graphql.execution import ExecutionResult, execute_sync
6+
from graphql.language import SourceLocation, parse
77
from graphql.type import (
88
GraphQLArgument,
99
GraphQLField,
10+
GraphQLID,
1011
GraphQLInputField,
1112
GraphQLInputObjectType,
1213
GraphQLInt,
14+
GraphQLList,
1315
GraphQLObjectType,
1416
GraphQLSchema,
1517
GraphQLString,
@@ -213,6 +215,91 @@ def execute_query(query: str, root_value: Any = None) -> ExecutionResult:
213215
None,
214216
)
215217

218+
def transforms_default_values_using_out_names():
219+
# This is an extension of GraphQL.js.
220+
resolver_kwargs: Any
221+
222+
def search_resolver(_obj: None, _info, **kwargs):
223+
nonlocal resolver_kwargs
224+
resolver_kwargs = kwargs
225+
return [{"id": "42"}]
226+
227+
filters_type = GraphQLInputObjectType(
228+
"SearchFilters",
229+
{"pageSize": GraphQLInputField(GraphQLInt, out_name="page_size")},
230+
)
231+
result_type = GraphQLObjectType("SearchResult", {"id": GraphQLField(GraphQLID)})
232+
query = GraphQLObjectType(
233+
"Query",
234+
{
235+
"search": GraphQLField(
236+
GraphQLList(result_type),
237+
{
238+
"searchFilters": GraphQLArgument(
239+
filters_type, {"pageSize": 10}, out_name="search_filters"
240+
)
241+
},
242+
resolve=search_resolver,
243+
)
244+
},
245+
)
246+
schema = GraphQLSchema(query)
247+
248+
resolver_kwargs = None
249+
result = execute_sync(schema, parse("{ search { id } }"))
250+
assert result == ({"search": [{"id": "42"}]}, None)
251+
assert resolver_kwargs == {"search_filters": {"page_size": 10}}
252+
253+
resolver_kwargs = None
254+
result = execute_sync(
255+
schema, parse("{ search(searchFilters:{pageSize: 25}) { id } }")
256+
)
257+
assert result == ({"search": [{"id": "42"}]}, None)
258+
assert resolver_kwargs == {"search_filters": {"page_size": 25}}
259+
260+
resolver_kwargs = None
261+
result = execute_sync(
262+
schema,
263+
parse(
264+
"""
265+
query ($searchFilters: SearchFilters) {
266+
search(searchFilters: $searchFilters) { id }
267+
}
268+
"""
269+
),
270+
)
271+
assert result == ({"search": [{"id": "42"}]}, None)
272+
assert resolver_kwargs == {"search_filters": {"page_size": 10}}
273+
274+
resolver_kwargs = None
275+
result = execute_sync(
276+
schema,
277+
parse(
278+
"""
279+
query ($searchFilters: SearchFilters) {
280+
search(searchFilters: $searchFilters) { id }
281+
}
282+
"""
283+
),
284+
variable_values={"searchFilters": {"pageSize": 25}},
285+
)
286+
assert result == ({"search": [{"id": "42"}]}, None)
287+
assert resolver_kwargs == {"search_filters": {"page_size": 25}}
288+
289+
resolver_kwargs = None
290+
result = execute_sync(
291+
schema,
292+
parse(
293+
"""
294+
query ($searchFilters: SearchFilters = {pageSize: 25}) {
295+
search(searchFilters: $searchFilters) { id }
296+
}
297+
"""
298+
),
299+
)
300+
assert result == ({"search": [{"id": "42"}]}, None)
301+
assert resolver_kwargs == {"search_filters": {"page_size": 25}}
302+
216303
def pass_error_from_resolver_wrapped_as_located_graphql_error():
217304
def resolve(_obj, _info):
218305
raise ValueError("Some error")

0 commit comments

Comments
 (0)