import datetime from unittest import TestCase from ..converters import Iso8601Serializer class Iso8601SerializerTestCase(TestCase): def _gen_dates(self, start_date, end_date, step=1): date = start_date while date <= end_date: text = '%04d-%02d-%02d' % (date.year, date.month, date.day) yield date, text date += datetime.timedelta(step) def _gen_times(self, step_hours=1, step_minutes=1, step_seconds=1): for hour in range(0, 13, step_hours): for minute in range(0, 60, step_minutes): for second in range(0, 60, step_seconds): text = '%02d:%02d:%02d' % (hour, minute, second) time = datetime.time(hour, minute, second) yield (time, text) def _gen_datetimes(self, start_date, end_date, step_days=47, step_hours=1, step_minutes=13, step_seconds=17): for date, date_text in self._gen_dates(start_date, end_date, step_days): for time, time_text in self._gen_times(step_hours, step_minutes, step_seconds): text = '{}T{}'.format(date_text, time_text) obj = datetime.datetime.combine(date, time) yield (obj, text) def test_serialize(self): test_data = [] # Check date objects # Populate test data with all days between 1970 and 2070 test_data += self._gen_dates(datetime.date(1970, 1, 1), datetime.date(2070, 12, 31)) # Check time objects test_data += self._gen_times() # Check datetime objects test_data += self._gen_datetimes(datetime.date(1999, 1, 1), datetime.date(2035, 12, 31)) for obj, text in test_data: expected = 'ISO8601:{}'.format(text) serialized = Iso8601Serializer.serialize(obj) self.assertEqual(serialized, expected) # Check invalid input invalid_values = ( None, True, False, '2019-03-01', ) for value in invalid_values: emsg = ('Expected datetime.datetime, datetime.date or datetime.time,' ' not {}'.format(value.__class__.__name__)) with self.assertRaisesRegex(ValueError, emsg): Iso8601Serializer.serialize(value) serialized = Iso8601Serializer.serialize(value, ignore_unsupported_input=True) self.assertEqual(serialized, value) def test_deserialize(self): test_data = [] # Check '--
' format test_data += self._gen_dates(datetime.date(1970, 1, 1), datetime.date(2070, 12, 31)) # Check '::' format test_data += self._gen_times() # Check '--
T::' format test_data += self._gen_datetimes(datetime.date(1999, 1, 1), datetime.date(2035, 12, 31)) for obj, text in test_data: text = 'ISO8601:{}'.format(text) deserialized = Iso8601Serializer.deserialize(text) self.assertIsInstance(deserialized, obj.__class__) self.assertEqual(deserialized, obj)