|
10 | 10 | from django.http import QueryDict
|
11 | 11 | from django.test import TestCase, override_settings
|
12 | 12 | from django.utils import six
|
13 |
| -from django.utils.timezone import utc |
| 13 | +from django.utils.timezone import activate, deactivate, utc |
14 | 14 |
|
15 | 15 | import rest_framework
|
16 | 16 | from rest_framework import compat, serializers
|
17 | 17 | from rest_framework.fields import is_simple_callable
|
18 | 18 |
|
| 19 | +try: |
| 20 | + import pytz |
| 21 | +except ImportError: |
| 22 | + pytz = None |
| 23 | + |
19 | 24 | try:
|
20 | 25 | import typings
|
21 | 26 | except ImportError:
|
@@ -1168,7 +1173,7 @@ class TestDateTimeField(FieldValues):
|
1168 | 1173 | datetime.date(2001, 1, 1): ['Expected a datetime but got a date.'],
|
1169 | 1174 | }
|
1170 | 1175 | outputs = {
|
1171 |
| - datetime.datetime(2001, 1, 1, 13, 00): '2001-01-01T13:00:00', |
| 1176 | + datetime.datetime(2001, 1, 1, 13, 00): '2001-01-01T13:00:00Z', |
1172 | 1177 | datetime.datetime(2001, 1, 1, 13, 00, tzinfo=utc): '2001-01-01T13:00:00Z',
|
1173 | 1178 | '2001-01-01T00:00:00': '2001-01-01T00:00:00',
|
1174 | 1179 | six.text_type('2016-01-10T00:00:00'): '2016-01-10T00:00:00',
|
@@ -1230,10 +1235,59 @@ class TestNaiveDateTimeField(FieldValues):
|
1230 | 1235 | '2001-01-01 13:00': datetime.datetime(2001, 1, 1, 13, 00),
|
1231 | 1236 | }
|
1232 | 1237 | invalid_inputs = {}
|
1233 |
| - outputs = {} |
| 1238 | + outputs = { |
| 1239 | + datetime.datetime(2001, 1, 1, 13, 00): '2001-01-01T13:00:00', |
| 1240 | + datetime.datetime(2001, 1, 1, 13, 00, tzinfo=utc): '2001-01-01T13:00:00', |
| 1241 | + } |
1234 | 1242 | field = serializers.DateTimeField(default_timezone=None)
|
1235 | 1243 |
|
1236 | 1244 |
|
| 1245 | +@pytest.mark.skipif(pytz is None, reason='pytz not installed') |
| 1246 | +class TestTZWithDateTimeField(FieldValues): |
| 1247 | + """ |
| 1248 | + Valid and invalid values for `DateTimeField` when not using UTC as the timezone. |
| 1249 | + """ |
| 1250 | + @classmethod |
| 1251 | + def setup_class(cls): |
| 1252 | + # use class setup method, as class-level attribute will still be evaluated even if test is skipped |
| 1253 | + kolkata = pytz.timezone('Asia/Kolkata') |
| 1254 | + |
| 1255 | + cls.valid_inputs = { |
| 1256 | + '2016-12-19T10:00:00': kolkata.localize(datetime.datetime(2016, 12, 19, 10)), |
| 1257 | + '2016-12-19T10:00:00+05:30': kolkata.localize(datetime.datetime(2016, 12, 19, 10)), |
| 1258 | + datetime.datetime(2016, 12, 19, 10): kolkata.localize(datetime.datetime(2016, 12, 19, 10)), |
| 1259 | + } |
| 1260 | + cls.invalid_inputs = {} |
| 1261 | + cls.outputs = { |
| 1262 | + datetime.datetime(2016, 12, 19, 10): '2016-12-19T10:00:00+05:30', |
| 1263 | + datetime.datetime(2016, 12, 19, 4, 30, tzinfo=utc): '2016-12-19T10:00:00+05:30', |
| 1264 | + } |
| 1265 | + cls.field = serializers.DateTimeField(default_timezone=kolkata) |
| 1266 | + |
| 1267 | + |
| 1268 | +@pytest.mark.skipif(pytz is None, reason='pytz not installed') |
| 1269 | +@override_settings(TIME_ZONE='UTC', USE_TZ=True) |
| 1270 | +class TestDefaultTZDateTimeField(TestCase): |
| 1271 | + """ |
| 1272 | + Test the current/default timezone handling in `DateTimeField`. |
| 1273 | + """ |
| 1274 | + |
| 1275 | + @classmethod |
| 1276 | + def setup_class(cls): |
| 1277 | + cls.field = serializers.DateTimeField() |
| 1278 | + cls.kolkata = pytz.timezone('Asia/Kolkata') |
| 1279 | + |
| 1280 | + def test_default_timezone(self): |
| 1281 | + assert self.field.default_timezone() == utc |
| 1282 | + |
| 1283 | + def test_current_timezone(self): |
| 1284 | + assert self.field.default_timezone() == utc |
| 1285 | + activate(self.kolkata) |
| 1286 | + assert self.field.default_timezone() == self.kolkata |
| 1287 | + deactivate() |
| 1288 | + assert self.field.default_timezone() == utc |
| 1289 | + |
| 1290 | + |
1237 | 1291 | class TestNaiveDayLightSavingTimeTimeZoneDateTimeField(FieldValues):
|
1238 | 1292 | """
|
1239 | 1293 | Invalid values for `DateTimeField` with datetime in DST shift (non-existing or ambiguous) and timezone with DST.
|
|
0 commit comments