Added tests and improved resilience against bad DateTime, Date, and Time inputs.

This commit is contained in:
as 2018-11-12 10:24:47 +01:00
parent 6fe4f4be78
commit 2b918e5e51
2 changed files with 62 additions and 6 deletions

View File

@ -34,8 +34,8 @@ class Date(Scalar):
try: try:
if isinstance(value, datetime.date): if isinstance(value, datetime.date):
return value return value
elif isinstance(value, str):
return parse_date(value) return parse_date(value)
except ValueError: except ValueError:
return None return None
@ -64,8 +64,8 @@ class DateTime(Scalar):
try: try:
if isinstance(value, datetime.datetime): if isinstance(value, datetime.datetime):
return value return value
elif isinstance(value, str):
return parse_datetime(value) return parse_datetime(value)
except ValueError: except ValueError:
return None return None
@ -94,7 +94,7 @@ class Time(Scalar):
try: try:
if isinstance(value, datetime.time): if isinstance(value, datetime.time):
return value return value
elif isinstance(value, str):
return parse_time(value) return parse_time(value)
except ValueError: except ValueError:
return None return None

View File

@ -2,6 +2,7 @@ import datetime
import pytz import pytz
from graphql import GraphQLError from graphql import GraphQLError
import pytest
from ..datetime import Date, DateTime, Time from ..datetime import Date, DateTime, Time
from ..objecttype import ObjectType from ..objecttype import ObjectType
@ -88,6 +89,15 @@ def test_datetime_query_variable():
now = datetime.datetime.now().replace(tzinfo=pytz.utc) now = datetime.datetime.now().replace(tzinfo=pytz.utc)
isoformat = now.isoformat() isoformat = now.isoformat()
# test datetime variable provided as Python datetime
result = schema.execute(
"""query Test($date: DateTime){ datetime(in: $date) }""",
variables={"date": now},
)
assert not result.errors
assert result.data == {"datetime": isoformat}
# test datetime variable in string representation
result = schema.execute( result = schema.execute(
"""query Test($date: DateTime){ datetime(in: $date) }""", """query Test($date: DateTime){ datetime(in: $date) }""",
variables={"date": isoformat}, variables={"date": isoformat},
@ -100,6 +110,14 @@ def test_date_query_variable():
now = datetime.datetime.now().replace(tzinfo=pytz.utc).date() now = datetime.datetime.now().replace(tzinfo=pytz.utc).date()
isoformat = now.isoformat() isoformat = now.isoformat()
# test date variable provided as Python date
result = schema.execute(
"""query Test($date: Date){ date(in: $date) }""", variables={"date": now}
)
assert not result.errors
assert result.data == {"date": isoformat}
# test date variable in string representation
result = schema.execute( result = schema.execute(
"""query Test($date: Date){ date(in: $date) }""", variables={"date": isoformat} """query Test($date: Date){ date(in: $date) }""", variables={"date": isoformat}
) )
@ -112,8 +130,46 @@ def test_time_query_variable():
time = datetime.time(now.hour, now.minute, now.second, now.microsecond, now.tzinfo) time = datetime.time(now.hour, now.minute, now.second, now.microsecond, now.tzinfo)
isoformat = time.isoformat() isoformat = time.isoformat()
# test time variable provided as Python time
result = schema.execute(
"""query Test($time: Time){ time(at: $time) }""", variables={"time": time}
)
assert not result.errors
assert result.data == {"time": isoformat}
# test time variable in string representation
result = schema.execute( result = schema.execute(
"""query Test($time: Time){ time(at: $time) }""", variables={"time": isoformat} """query Test($time: Time){ time(at: $time) }""", variables={"time": isoformat}
) )
assert not result.errors assert not result.errors
assert result.data == {"time": isoformat} assert result.data == {"time": isoformat}
@pytest.mark.xfail(reason="creating the error message fails when un-parsable object is not JSON serializable.")
def test_bad_variables():
def _test_bad_variables(type, input):
result = schema.execute(
"""query Test($input: %s){ %s(in: $input) }""" % (type, type.lower()),
variables={"input": input}
)
assert len(result.errors) == 1
# when `input` is not JSON serializable formatting the error message in
# `graphql.utils.is_valid_value` line 79 fails with a TypeError
assert isinstance(result.errors[0], GraphQLError)
print(result.errors[0])
assert result.data is None
not_a_date = dict()
not_a_date_str = "Some string that's not a date"
today = datetime.date.today()
now = datetime.datetime.now().replace(tzinfo=pytz.utc)
time = datetime.time(now.hour, now.minute, now.second, now.microsecond, now.tzinfo)
bad_pairs = [
('DateTime', not_a_date), ('DateTime', not_a_date_str), ('DateTime', today), ('DateTime', time),
('Date', not_a_date), ('Date', not_a_date_str), ('Date', now), ('Date', time),
('Time', not_a_date), ('Time', not_a_date_str), ('Time', now), ('Time', today)
]
for type, input in bad_pairs:
_test_bad_variables(type, input)