22
33import pytz
44from graphql import GraphQLError
5+ import pytest
56
67from ..datetime import Date , DateTime , Time
78from ..objecttype import ObjectType
@@ -88,6 +89,15 @@ def test_datetime_query_variable():
8889 now = datetime .datetime .now ().replace (tzinfo = pytz .utc )
8990 isoformat = now .isoformat ()
9091
92+ # test datetime variable provided as Python datetime
93+ result = schema .execute (
94+ """query Test($date: DateTime){ datetime(in: $date) }""" ,
95+ variables = {"date" : now },
96+ )
97+ assert not result .errors
98+ assert result .data == {"datetime" : isoformat }
99+
100+ # test datetime variable in string representation
91101 result = schema .execute (
92102 """query Test($date: DateTime){ datetime(in: $date) }""" ,
93103 variables = {"date" : isoformat },
@@ -100,6 +110,14 @@ def test_date_query_variable():
100110 now = datetime .datetime .now ().replace (tzinfo = pytz .utc ).date ()
101111 isoformat = now .isoformat ()
102112
113+ # test date variable provided as Python date
114+ result = schema .execute (
115+ """query Test($date: Date){ date(in: $date) }""" , variables = {"date" : now }
116+ )
117+ assert not result .errors
118+ assert result .data == {"date" : isoformat }
119+
120+ # test date variable in string representation
103121 result = schema .execute (
104122 """query Test($date: Date){ date(in: $date) }""" , variables = {"date" : isoformat }
105123 )
@@ -112,8 +130,57 @@ def test_time_query_variable():
112130 time = datetime .time (now .hour , now .minute , now .second , now .microsecond , now .tzinfo )
113131 isoformat = time .isoformat ()
114132
133+ # test time variable provided as Python time
134+ result = schema .execute (
135+ """query Test($time: Time){ time(at: $time) }""" , variables = {"time" : time }
136+ )
137+ assert not result .errors
138+ assert result .data == {"time" : isoformat }
139+
140+ # test time variable in string representation
115141 result = schema .execute (
116142 """query Test($time: Time){ time(at: $time) }""" , variables = {"time" : isoformat }
117143 )
118144 assert not result .errors
119145 assert result .data == {"time" : isoformat }
146+
147+
148+ @pytest .mark .xfail (
149+ reason = "creating the error message fails when un-parsable object is not JSON serializable."
150+ )
151+ def test_bad_variables ():
152+ def _test_bad_variables (type , input ):
153+ result = schema .execute (
154+ """query Test($input: {}){{ {}(in: $input) }}""" .format (type , type .lower ()),
155+ variables = {"input" : input },
156+ )
157+ assert len (result .errors ) == 1
158+ # when `input` is not JSON serializable formatting the error message in
159+ # `graphql.utils.is_valid_value` line 79 fails with a TypeError
160+ assert isinstance (result .errors [0 ], GraphQLError )
161+ print (result .errors [0 ])
162+ assert result .data is None
163+
164+ not_a_date = dict ()
165+ not_a_date_str = "Some string that's not a date"
166+ today = datetime .date .today ()
167+ now = datetime .datetime .now ().replace (tzinfo = pytz .utc )
168+ time = datetime .time (now .hour , now .minute , now .second , now .microsecond , now .tzinfo )
169+
170+ bad_pairs = [
171+ ("DateTime" , not_a_date ),
172+ ("DateTime" , not_a_date_str ),
173+ ("DateTime" , today ),
174+ ("DateTime" , time ),
175+ ("Date" , not_a_date ),
176+ ("Date" , not_a_date_str ),
177+ ("Date" , now ),
178+ ("Date" , time ),
179+ ("Time" , not_a_date ),
180+ ("Time" , not_a_date_str ),
181+ ("Time" , now ),
182+ ("Time" , today ),
183+ ]
184+
185+ for type , input in bad_pairs :
186+ _test_bad_variables (type , input )
0 commit comments