Skip to content

Commit ea38577

Browse files
committed
coerce_value: correctly handle nan and similar values
Replicates graphql/graphql-js@670bbac
1 parent c250717 commit ea38577

File tree

3 files changed

+23
-8
lines changed

3 files changed

+23
-8
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ The current version 3.0.0a2 of GraphQL-core is up-to-date
1616
with GraphQL.js version 14.4.2.
1717

1818
All parts of the API are covered by an extensive test suite
19-
of currently 1903 unit tests.
19+
of currently 1905 unit tests.
2020

2121

2222
## Documentation

src/graphql/utilities/coerce_value.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from ..error import GraphQLError, INVALID
44
from ..language import Node
5-
from ..pyutils import did_you_mean, inspect, is_invalid, suggestion_list
5+
from ..pyutils import did_you_mean, inspect, suggestion_list
66
from ..type import (
77
GraphQLEnumType,
88
GraphQLInputObjectType,
@@ -63,7 +63,7 @@ def coerce_value(
6363
type_ = cast(GraphQLScalarType, type_)
6464
try:
6565
parse_result = type_.parse_value(value)
66-
if is_invalid(parse_result):
66+
if parse_result is INVALID:
6767
return of_errors(
6868
[coercion_error(f"Expected type {type_.name}", blame_node, path)]
6969
)
@@ -137,8 +137,8 @@ def coerce_value(
137137
# Ensure every defined field is valid.
138138
for field_name, field in fields.items():
139139
field_value = value.get(field_name, INVALID)
140-
if is_invalid(field_value):
141-
if not is_invalid(field.default_value):
140+
if field_value is INVALID:
141+
if field.default_value is not INVALID:
142142
# Use out name as name if it exists (extension of GraphQL.js).
143143
coerced_value_dict[
144144
field.out_name or field_name

tests/utilities/test_coerce_value.py

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from math import nan
12
from typing import Any, List
23

34
from graphql.error import INVALID
@@ -65,6 +66,10 @@ def returns_no_error_for_null_result():
6566
result = coerce_value({"value": None}, TestScalar)
6667
assert expect_value(result) is None
6768

69+
def returns_no_error_for_nan_result():
70+
result = coerce_value({"value": nan}, TestScalar)
71+
assert expect_value(result) is nan
72+
6873
def returns_an_error_for_undefined_result():
6974
error = ValueError("Some error message")
7075
result = coerce_value({"error": error}, TestScalar)
@@ -117,10 +122,10 @@ def returns_an_error_for_a_non_dict_value():
117122
]
118123

119124
def returns_an_error_for_an_invalid_field():
120-
result = coerce_value({"foo": "abc"}, TestInputObject)
125+
result = coerce_value({"foo": nan}, TestInputObject)
121126
assert expect_errors(result) == [
122127
"Expected type Int at value.foo."
123-
" Int cannot represent non-integer value: 'abc'"
128+
" Int cannot represent non-integer value: nan"
124129
]
125130

126131
def returns_multiple_errors_for_multiple_invalid_fields():
@@ -182,7 +187,11 @@ def describe_for_graphql_input_object_with_default_value():
182187
def _get_test_input_object(default_value):
183188
return GraphQLInputObjectType(
184189
"TestInputObject",
185-
{"foo": GraphQLInputField(GraphQLInt, default_value=default_value)},
190+
{
191+
"foo": GraphQLInputField(
192+
GraphQLScalarType("TestScalar"), default_value=default_value
193+
)
194+
},
186195
)
187196

188197
def returns_no_errors_for_valid_input_value():
@@ -197,6 +206,12 @@ def returns_null_as_value():
197206
result = coerce_value({}, _get_test_input_object(None))
198207
assert expect_value(result) == {"foo": None}
199208

209+
def returns_nan_as_value():
210+
result = coerce_value({}, _get_test_input_object(nan))
211+
result_value = expect_value(result)
212+
assert "foo" in result_value
213+
assert result_value["foo"] is nan
214+
200215
def describe_for_graphql_list():
201216
TestList = GraphQLList(GraphQLInt)
202217

0 commit comments

Comments
 (0)