diff options
Diffstat (limited to 'tests/postgres_tests/test_ranges.py')
| -rw-r--r-- | tests/postgres_tests/test_ranges.py | 494 |
1 files changed, 275 insertions, 219 deletions
diff --git a/tests/postgres_tests/test_ranges.py b/tests/postgres_tests/test_ranges.py index 180678578e..d100d40713 100644 --- a/tests/postgres_tests/test_ranges.py +++ b/tests/postgres_tests/test_ranges.py @@ -12,38 +12,43 @@ from django.utils import timezone from . import PostgreSQLSimpleTestCase, PostgreSQLTestCase from .models import ( - BigAutoFieldModel, PostgreSQLModel, RangeLookupsModel, RangesModel, + BigAutoFieldModel, + PostgreSQLModel, + RangeLookupsModel, + RangesModel, SmallAutoFieldModel, ) try: from psycopg2.extras import DateRange, DateTimeTZRange, NumericRange - from django.contrib.postgres import fields as pg_fields, forms as pg_forms + from django.contrib.postgres import fields as pg_fields + from django.contrib.postgres import forms as pg_forms from django.contrib.postgres.validators import ( - RangeMaxValueValidator, RangeMinValueValidator, + RangeMaxValueValidator, + RangeMinValueValidator, ) except ImportError: pass -@isolate_apps('postgres_tests') +@isolate_apps("postgres_tests") class BasicTests(PostgreSQLSimpleTestCase): def test_get_field_display(self): class Model(PostgreSQLModel): field = pg_fields.IntegerRangeField( choices=[ - ['1-50', [((1, 25), '1-25'), ([26, 50], '26-50')]], - ((51, 100), '51-100'), + ["1-50", [((1, 25), "1-25"), ([26, 50], "26-50")]], + ((51, 100), "51-100"), ], ) tests = ( - ((1, 25), '1-25'), - ([26, 50], '26-50'), - ((51, 100), '51-100'), - ((1, 2), '(1, 2)'), - ([1, 2], '[1, 2]'), + ((1, 25), "1-25"), + ([26, 50], "26-50"), + ((51, 100), "51-100"), + ((1, 2), "(1, 2)"), + ([1, 2], "[1, 2]"), ) for value, display in tests: with self.subTest(value=value, display=display): @@ -52,7 +57,6 @@ class BasicTests(PostgreSQLSimpleTestCase): class TestSaveLoad(PostgreSQLTestCase): - def test_all_fields(self): now = timezone.now() instance = RangesModel( @@ -84,7 +88,7 @@ class TestSaveLoad(PostgreSQLTestCase): self.assertEqual(NumericRange(0, 10), loaded.ints) def test_range_object_boundaries(self): - r = NumericRange(0, 10, '[]') + r = NumericRange(0, 10, "[]") instance = RangesModel(decimals=r) instance.save() loaded = RangesModel.objects.get() @@ -92,7 +96,7 @@ class TestSaveLoad(PostgreSQLTestCase): self.assertIn(10, loaded.decimals) def test_unbounded(self): - r = NumericRange(None, None, '()') + r = NumericRange(None, None, "()") instance = RangesModel(decimals=r) instance.save() loaded = RangesModel.objects.get() @@ -113,13 +117,12 @@ class TestSaveLoad(PostgreSQLTestCase): def test_model_set_on_base_field(self): instance = RangesModel() - field = instance._meta.get_field('ints') + field = instance._meta.get_field("ints") self.assertEqual(field.model, RangesModel) self.assertEqual(field.base_field.model, RangesModel) class TestRangeContainsLookup(PostgreSQLTestCase): - @classmethod def setUpTestData(cls): cls.timestamps = [ @@ -131,8 +134,7 @@ class TestRangeContainsLookup(PostgreSQLTestCase): datetime.datetime(year=2016, month=2, day=2), ] cls.aware_timestamps = [ - timezone.make_aware(timestamp) - for timestamp in cls.timestamps + timezone.make_aware(timestamp) for timestamp in cls.timestamps ] cls.dates = [ datetime.date(year=2016, month=1, day=1), @@ -172,13 +174,13 @@ class TestRangeContainsLookup(PostgreSQLTestCase): (self.timestamps[1], self.timestamps[2]), (self.aware_timestamps[1], self.aware_timestamps[2]), Value(self.dates[0]), - Func(F('dates'), function='lower', output_field=DateTimeField()), - F('timestamps_inner'), + Func(F("dates"), function="lower", output_field=DateTimeField()), + F("timestamps_inner"), ) for filter_arg in filter_args: with self.subTest(filter_arg=filter_arg): self.assertCountEqual( - RangesModel.objects.filter(**{'timestamps__contains': filter_arg}), + RangesModel.objects.filter(**{"timestamps__contains": filter_arg}), [self.obj, self.aware_obj], ) @@ -187,28 +189,29 @@ class TestRangeContainsLookup(PostgreSQLTestCase): self.timestamps[1], (self.dates[1], self.dates[2]), Value(self.dates[0], output_field=DateField()), - Func(F('timestamps'), function='lower', output_field=DateField()), - F('dates_inner'), + Func(F("timestamps"), function="lower", output_field=DateField()), + F("dates_inner"), ) for filter_arg in filter_args: with self.subTest(filter_arg=filter_arg): self.assertCountEqual( - RangesModel.objects.filter(**{'dates__contains': filter_arg}), + RangesModel.objects.filter(**{"dates__contains": filter_arg}), [self.obj, self.aware_obj], ) class TestQuerying(PostgreSQLTestCase): - @classmethod def setUpTestData(cls): - cls.objs = RangesModel.objects.bulk_create([ - RangesModel(ints=NumericRange(0, 10)), - RangesModel(ints=NumericRange(5, 15)), - RangesModel(ints=NumericRange(None, 0)), - RangesModel(ints=NumericRange(empty=True)), - RangesModel(ints=None), - ]) + cls.objs = RangesModel.objects.bulk_create( + [ + RangesModel(ints=NumericRange(0, 10)), + RangesModel(ints=NumericRange(5, 15)), + RangesModel(ints=NumericRange(None, 0)), + RangesModel(ints=NumericRange(empty=True)), + RangesModel(ints=None), + ] + ) def test_exact(self): self.assertSequenceEqual( @@ -301,26 +304,28 @@ class TestQuerying(PostgreSQLTestCase): ) def test_bound_type(self): - decimals = RangesModel.objects.bulk_create([ - RangesModel(decimals=NumericRange(None, 10)), - RangesModel(decimals=NumericRange(10, None)), - RangesModel(decimals=NumericRange(5, 15)), - RangesModel(decimals=NumericRange(5, 15, '(]')), - ]) + decimals = RangesModel.objects.bulk_create( + [ + RangesModel(decimals=NumericRange(None, 10)), + RangesModel(decimals=NumericRange(10, None)), + RangesModel(decimals=NumericRange(5, 15)), + RangesModel(decimals=NumericRange(5, 15, "(]")), + ] + ) tests = [ - ('lower_inc', True, [decimals[1], decimals[2]]), - ('lower_inc', False, [decimals[0], decimals[3]]), - ('lower_inf', True, [decimals[0]]), - ('lower_inf', False, [decimals[1], decimals[2], decimals[3]]), - ('upper_inc', True, [decimals[3]]), - ('upper_inc', False, [decimals[0], decimals[1], decimals[2]]), - ('upper_inf', True, [decimals[1]]), - ('upper_inf', False, [decimals[0], decimals[2], decimals[3]]), + ("lower_inc", True, [decimals[1], decimals[2]]), + ("lower_inc", False, [decimals[0], decimals[3]]), + ("lower_inf", True, [decimals[0]]), + ("lower_inf", False, [decimals[1], decimals[2], decimals[3]]), + ("upper_inc", True, [decimals[3]]), + ("upper_inc", False, [decimals[0], decimals[1], decimals[2]]), + ("upper_inf", True, [decimals[1]]), + ("upper_inf", False, [decimals[0], decimals[2], decimals[3]]), ] for lookup, filter_arg, excepted_result in tests: with self.subTest(lookup=lookup, filter_arg=filter_arg): self.assertSequenceEqual( - RangesModel.objects.filter(**{'decimals__%s' % lookup: filter_arg}), + RangesModel.objects.filter(**{"decimals__%s" % lookup: filter_arg}), excepted_result, ) @@ -328,32 +333,38 @@ class TestQuerying(PostgreSQLTestCase): class TestQueryingWithRanges(PostgreSQLTestCase): def test_date_range(self): objs = [ - RangeLookupsModel.objects.create(date='2015-01-01'), - RangeLookupsModel.objects.create(date='2015-05-05'), + RangeLookupsModel.objects.create(date="2015-01-01"), + RangeLookupsModel.objects.create(date="2015-05-05"), ] self.assertSequenceEqual( - RangeLookupsModel.objects.filter(date__contained_by=DateRange('2015-01-01', '2015-05-04')), + RangeLookupsModel.objects.filter( + date__contained_by=DateRange("2015-01-01", "2015-05-04") + ), [objs[0]], ) def test_date_range_datetime_field(self): objs = [ - RangeLookupsModel.objects.create(timestamp='2015-01-01'), - RangeLookupsModel.objects.create(timestamp='2015-05-05'), + RangeLookupsModel.objects.create(timestamp="2015-01-01"), + RangeLookupsModel.objects.create(timestamp="2015-05-05"), ] self.assertSequenceEqual( - RangeLookupsModel.objects.filter(timestamp__date__contained_by=DateRange('2015-01-01', '2015-05-04')), + RangeLookupsModel.objects.filter( + timestamp__date__contained_by=DateRange("2015-01-01", "2015-05-04") + ), [objs[0]], ) def test_datetime_range(self): objs = [ - RangeLookupsModel.objects.create(timestamp='2015-01-01T09:00:00'), - RangeLookupsModel.objects.create(timestamp='2015-05-05T17:00:00'), + RangeLookupsModel.objects.create(timestamp="2015-01-01T09:00:00"), + RangeLookupsModel.objects.create(timestamp="2015-05-05T17:00:00"), ] self.assertSequenceEqual( RangeLookupsModel.objects.filter( - timestamp__contained_by=DateTimeTZRange('2015-01-01T09:00', '2015-05-04T23:55') + timestamp__contained_by=DateTimeTZRange( + "2015-01-01T09:00", "2015-05-04T23:55" + ) ), [objs[0]], ) @@ -365,7 +376,9 @@ class TestQueryingWithRanges(PostgreSQLTestCase): RangeLookupsModel.objects.create(small_integer=-1), ] self.assertSequenceEqual( - RangeLookupsModel.objects.filter(small_integer__contained_by=NumericRange(4, 6)), + RangeLookupsModel.objects.filter( + small_integer__contained_by=NumericRange(4, 6) + ), [objs[1]], ) @@ -377,7 +390,7 @@ class TestQueryingWithRanges(PostgreSQLTestCase): ] self.assertSequenceEqual( RangeLookupsModel.objects.filter(integer__contained_by=NumericRange(1, 98)), - [objs[0]] + [objs[0]], ) def test_biginteger_range(self): @@ -387,19 +400,23 @@ class TestQueryingWithRanges(PostgreSQLTestCase): RangeLookupsModel.objects.create(big_integer=-1), ] self.assertSequenceEqual( - RangeLookupsModel.objects.filter(big_integer__contained_by=NumericRange(1, 98)), - [objs[0]] + RangeLookupsModel.objects.filter( + big_integer__contained_by=NumericRange(1, 98) + ), + [objs[0]], ) def test_decimal_field_contained_by(self): objs = [ - RangeLookupsModel.objects.create(decimal_field=Decimal('1.33')), - RangeLookupsModel.objects.create(decimal_field=Decimal('2.88')), - RangeLookupsModel.objects.create(decimal_field=Decimal('99.17')), + RangeLookupsModel.objects.create(decimal_field=Decimal("1.33")), + RangeLookupsModel.objects.create(decimal_field=Decimal("2.88")), + RangeLookupsModel.objects.create(decimal_field=Decimal("99.17")), ] self.assertSequenceEqual( RangeLookupsModel.objects.filter( - decimal_field__contained_by=NumericRange(Decimal('1.89'), Decimal('7.91')), + decimal_field__contained_by=NumericRange( + Decimal("1.89"), Decimal("7.91") + ), ), [objs[1]], ) @@ -412,13 +429,13 @@ class TestQueryingWithRanges(PostgreSQLTestCase): ] self.assertSequenceEqual( RangeLookupsModel.objects.filter(float__contained_by=NumericRange(1, 98)), - [objs[0]] + [objs[0]], ) def test_small_auto_field_contained_by(self): - objs = SmallAutoFieldModel.objects.bulk_create([ - SmallAutoFieldModel() for i in range(1, 5) - ]) + objs = SmallAutoFieldModel.objects.bulk_create( + [SmallAutoFieldModel() for i in range(1, 5)] + ) self.assertSequenceEqual( SmallAutoFieldModel.objects.filter( id__contained_by=NumericRange(objs[1].pk, objs[3].pk), @@ -427,9 +444,9 @@ class TestQueryingWithRanges(PostgreSQLTestCase): ) def test_auto_field_contained_by(self): - objs = RangeLookupsModel.objects.bulk_create([ - RangeLookupsModel() for i in range(1, 5) - ]) + objs = RangeLookupsModel.objects.bulk_create( + [RangeLookupsModel() for i in range(1, 5)] + ) self.assertSequenceEqual( RangeLookupsModel.objects.filter( id__contained_by=NumericRange(objs[1].pk, objs[3].pk), @@ -438,9 +455,9 @@ class TestQueryingWithRanges(PostgreSQLTestCase): ) def test_big_auto_field_contained_by(self): - objs = BigAutoFieldModel.objects.bulk_create([ - BigAutoFieldModel() for i in range(1, 5) - ]) + objs = BigAutoFieldModel.objects.bulk_create( + [BigAutoFieldModel() for i in range(1, 5)] + ) self.assertSequenceEqual( BigAutoFieldModel.objects.filter( id__contained_by=NumericRange(objs[1].pk, objs[3].pk), @@ -455,8 +472,8 @@ class TestQueryingWithRanges(PostgreSQLTestCase): RangeLookupsModel.objects.create(float=99, parent=parent), ] self.assertSequenceEqual( - RangeLookupsModel.objects.filter(float__contained_by=F('parent__decimals')), - [objs[0]] + RangeLookupsModel.objects.filter(float__contained_by=F("parent__decimals")), + [objs[0]], ) def test_exclude(self): @@ -467,7 +484,7 @@ class TestQueryingWithRanges(PostgreSQLTestCase): ] self.assertSequenceEqual( RangeLookupsModel.objects.exclude(float__contained_by=NumericRange(0, 100)), - [objs[2]] + [objs[2]], ) @@ -490,36 +507,39 @@ class TestSerialization(PostgreSQLSimpleTestCase): def test_dumping(self): instance = RangesModel( - ints=NumericRange(0, 10), decimals=NumericRange(empty=True), + ints=NumericRange(0, 10), + decimals=NumericRange(empty=True), timestamps=DateTimeTZRange(self.lower_dt, self.upper_dt), dates=DateRange(self.lower_date, self.upper_date), ) - data = serializers.serialize('json', [instance]) + data = serializers.serialize("json", [instance]) dumped = json.loads(data) - for field in ('ints', 'dates', 'timestamps'): - dumped[0]['fields'][field] = json.loads(dumped[0]['fields'][field]) + for field in ("ints", "dates", "timestamps"): + dumped[0]["fields"][field] = json.loads(dumped[0]["fields"][field]) check = json.loads(self.test_data) - for field in ('ints', 'dates', 'timestamps'): - check[0]['fields'][field] = json.loads(check[0]['fields'][field]) + for field in ("ints", "dates", "timestamps"): + check[0]["fields"][field] = json.loads(check[0]["fields"][field]) self.assertEqual(dumped, check) def test_loading(self): - instance = list(serializers.deserialize('json', self.test_data))[0].object + instance = list(serializers.deserialize("json", self.test_data))[0].object self.assertEqual(instance.ints, NumericRange(0, 10)) self.assertEqual(instance.decimals, NumericRange(empty=True)) self.assertIsNone(instance.bigints) self.assertEqual(instance.dates, DateRange(self.lower_date, self.upper_date)) - self.assertEqual(instance.timestamps, DateTimeTZRange(self.lower_dt, self.upper_dt)) + self.assertEqual( + instance.timestamps, DateTimeTZRange(self.lower_dt, self.upper_dt) + ) def test_serialize_range_with_null(self): instance = RangesModel(ints=NumericRange(None, 10)) - data = serializers.serialize('json', [instance]) - new_instance = list(serializers.deserialize('json', data))[0].object + data = serializers.serialize("json", [instance]) + new_instance = list(serializers.deserialize("json", data))[0].object self.assertEqual(new_instance.ints, NumericRange(None, 10)) instance = RangesModel(ints=NumericRange(10, None)) - data = serializers.serialize('json', [instance]) - new_instance = list(serializers.deserialize('json', data))[0].object + data = serializers.serialize("json", [instance]) + new_instance = list(serializers.deserialize("json", data))[0].object self.assertEqual(new_instance.ints, NumericRange(10, None)) @@ -528,60 +548,59 @@ class TestChecks(PostgreSQLSimpleTestCase): class Model(PostgreSQLModel): field = pg_fields.IntegerRangeField( choices=[ - ['1-50', [((1, 25), '1-25'), ([26, 50], '26-50')]], - ((51, 100), '51-100'), + ["1-50", [((1, 25), "1-25"), ([26, 50], "26-50")]], + ((51, 100), "51-100"), ], ) - self.assertEqual(Model._meta.get_field('field').check(), []) + self.assertEqual(Model._meta.get_field("field").check(), []) -class TestValidators(PostgreSQLSimpleTestCase): +class TestValidators(PostgreSQLSimpleTestCase): def test_max(self): validator = RangeMaxValueValidator(5) validator(NumericRange(0, 5)) - msg = 'Ensure that this range is completely less than or equal to 5.' + msg = "Ensure that this range is completely less than or equal to 5." with self.assertRaises(exceptions.ValidationError) as cm: validator(NumericRange(0, 10)) self.assertEqual(cm.exception.messages[0], msg) - self.assertEqual(cm.exception.code, 'max_value') + self.assertEqual(cm.exception.code, "max_value") with self.assertRaisesMessage(exceptions.ValidationError, msg): validator(NumericRange(0, None)) # an unbound range def test_min(self): validator = RangeMinValueValidator(5) validator(NumericRange(10, 15)) - msg = 'Ensure that this range is completely greater than or equal to 5.' + msg = "Ensure that this range is completely greater than or equal to 5." with self.assertRaises(exceptions.ValidationError) as cm: validator(NumericRange(0, 10)) self.assertEqual(cm.exception.messages[0], msg) - self.assertEqual(cm.exception.code, 'min_value') + self.assertEqual(cm.exception.code, "min_value") with self.assertRaisesMessage(exceptions.ValidationError, msg): validator(NumericRange(None, 10)) # an unbound range class TestFormField(PostgreSQLSimpleTestCase): - def test_valid_integer(self): field = pg_forms.IntegerRangeField() - value = field.clean(['1', '2']) + value = field.clean(["1", "2"]) self.assertEqual(value, NumericRange(1, 2)) def test_valid_decimal(self): field = pg_forms.DecimalRangeField() - value = field.clean(['1.12345', '2.001']) - self.assertEqual(value, NumericRange(Decimal('1.12345'), Decimal('2.001'))) + value = field.clean(["1.12345", "2.001"]) + self.assertEqual(value, NumericRange(Decimal("1.12345"), Decimal("2.001"))) def test_valid_timestamps(self): field = pg_forms.DateTimeRangeField() - value = field.clean(['01/01/2014 00:00:00', '02/02/2014 12:12:12']) + value = field.clean(["01/01/2014 00:00:00", "02/02/2014 12:12:12"]) lower = datetime.datetime(2014, 1, 1, 0, 0, 0) upper = datetime.datetime(2014, 2, 2, 12, 12, 12) self.assertEqual(value, DateTimeTZRange(lower, upper)) def test_valid_dates(self): field = pg_forms.DateRangeField() - value = field.clean(['01/01/2014', '02/02/2014']) + value = field.clean(["01/01/2014", "02/02/2014"]) lower = datetime.date(2014, 1, 1) upper = datetime.date(2014, 2, 2) self.assertEqual(value, DateRange(lower, upper)) @@ -594,7 +613,9 @@ class TestFormField(PostgreSQLSimpleTestCase): field = SplitDateTimeRangeField() form = SplitForm() - self.assertHTMLEqual(str(form), ''' + self.assertHTMLEqual( + str(form), + """ <tr> <th> <label for="id_field_0">Field:</label> @@ -606,21 +627,24 @@ class TestFormField(PostgreSQLSimpleTestCase): <input id="id_field_1_1" name="field_1_1" type="text"> </td> </tr> - ''') - form = SplitForm({ - 'field_0_0': '01/01/2014', - 'field_0_1': '00:00:00', - 'field_1_0': '02/02/2014', - 'field_1_1': '12:12:12', - }) + """, + ) + form = SplitForm( + { + "field_0_0": "01/01/2014", + "field_0_1": "00:00:00", + "field_1_0": "02/02/2014", + "field_1_1": "12:12:12", + } + ) self.assertTrue(form.is_valid()) lower = datetime.datetime(2014, 1, 1, 0, 0, 0) upper = datetime.datetime(2014, 2, 2, 12, 12, 12) - self.assertEqual(form.cleaned_data['field'], DateTimeTZRange(lower, upper)) + self.assertEqual(form.cleaned_data["field"], DateTimeTZRange(lower, upper)) def test_none(self): field = pg_forms.IntegerRangeField(required=False) - value = field.clean(['', '']) + value = field.clean(["", ""]) self.assertIsNone(value) def test_datetime_form_as_table(self): @@ -639,12 +663,14 @@ class TestFormField(PostgreSQLSimpleTestCase): <input type="hidden" name="initial-datetime_field_0" id="initial-id_datetime_field_0"> <input type="hidden" name="initial-datetime_field_1" id="initial-id_datetime_field_1"> </td></tr> - """ + """, + ) + form = DateTimeRangeForm( + { + "datetime_field_0": "2010-01-01 11:13:00", + "datetime_field_1": "2020-12-12 16:59:00", + } ) - form = DateTimeRangeForm({ - 'datetime_field_0': '2010-01-01 11:13:00', - 'datetime_field_1': '2020-12-12 16:59:00', - }) self.assertHTMLEqual( form.as_table(), """ @@ -659,7 +685,7 @@ class TestFormField(PostgreSQLSimpleTestCase): id="initial-id_datetime_field_0"> <input type="hidden" name="initial-datetime_field_1" value="2020-12-12 16:59:00" id="initial-id_datetime_field_1"></td></tr> - """ + """, ) def test_datetime_form_initial_data(self): @@ -667,16 +693,18 @@ class TestFormField(PostgreSQLSimpleTestCase): datetime_field = pg_forms.DateTimeRangeField(show_hidden_initial=True) data = QueryDict(mutable=True) - data.update({ - 'datetime_field_0': '2010-01-01 11:13:00', - 'datetime_field_1': '', - 'initial-datetime_field_0': '2010-01-01 10:12:00', - 'initial-datetime_field_1': '', - }) + data.update( + { + "datetime_field_0": "2010-01-01 11:13:00", + "datetime_field_1": "", + "initial-datetime_field_0": "2010-01-01 10:12:00", + "initial-datetime_field_1": "", + } + ) form = DateTimeRangeForm(data=data) self.assertTrue(form.has_changed()) - data['initial-datetime_field_0'] = '2010-01-01 11:13:00' + data["initial-datetime_field_0"] = "2010-01-01 11:13:00" form = DateTimeRangeForm(data=data) self.assertFalse(form.has_changed()) @@ -684,7 +712,9 @@ class TestFormField(PostgreSQLSimpleTestCase): class RangeForm(forms.Form): ints = pg_forms.IntegerRangeField() - self.assertHTMLEqual(str(RangeForm()), ''' + self.assertHTMLEqual( + str(RangeForm()), + """ <tr> <th><label for="id_ints_0">Ints:</label></th> <td> @@ -692,195 +722,222 @@ class TestFormField(PostgreSQLSimpleTestCase): <input id="id_ints_1" name="ints_1" type="number"> </td> </tr> - ''') + """, + ) def test_integer_lower_bound_higher(self): field = pg_forms.IntegerRangeField() with self.assertRaises(exceptions.ValidationError) as cm: - field.clean(['10', '2']) - self.assertEqual(cm.exception.messages[0], 'The start of the range must not exceed the end of the range.') - self.assertEqual(cm.exception.code, 'bound_ordering') + field.clean(["10", "2"]) + self.assertEqual( + cm.exception.messages[0], + "The start of the range must not exceed the end of the range.", + ) + self.assertEqual(cm.exception.code, "bound_ordering") def test_integer_open(self): field = pg_forms.IntegerRangeField() - value = field.clean(['', '0']) + value = field.clean(["", "0"]) self.assertEqual(value, NumericRange(None, 0)) def test_integer_incorrect_data_type(self): field = pg_forms.IntegerRangeField() with self.assertRaises(exceptions.ValidationError) as cm: - field.clean('1') - self.assertEqual(cm.exception.messages[0], 'Enter two whole numbers.') - self.assertEqual(cm.exception.code, 'invalid') + field.clean("1") + self.assertEqual(cm.exception.messages[0], "Enter two whole numbers.") + self.assertEqual(cm.exception.code, "invalid") def test_integer_invalid_lower(self): field = pg_forms.IntegerRangeField() with self.assertRaises(exceptions.ValidationError) as cm: - field.clean(['a', '2']) - self.assertEqual(cm.exception.messages[0], 'Enter a whole number.') + field.clean(["a", "2"]) + self.assertEqual(cm.exception.messages[0], "Enter a whole number.") def test_integer_invalid_upper(self): field = pg_forms.IntegerRangeField() with self.assertRaises(exceptions.ValidationError) as cm: - field.clean(['1', 'b']) - self.assertEqual(cm.exception.messages[0], 'Enter a whole number.') + field.clean(["1", "b"]) + self.assertEqual(cm.exception.messages[0], "Enter a whole number.") def test_integer_required(self): field = pg_forms.IntegerRangeField(required=True) with self.assertRaises(exceptions.ValidationError) as cm: - field.clean(['', '']) - self.assertEqual(cm.exception.messages[0], 'This field is required.') - value = field.clean([1, '']) + field.clean(["", ""]) + self.assertEqual(cm.exception.messages[0], "This field is required.") + value = field.clean([1, ""]) self.assertEqual(value, NumericRange(1, None)) def test_decimal_lower_bound_higher(self): field = pg_forms.DecimalRangeField() with self.assertRaises(exceptions.ValidationError) as cm: - field.clean(['1.8', '1.6']) - self.assertEqual(cm.exception.messages[0], 'The start of the range must not exceed the end of the range.') - self.assertEqual(cm.exception.code, 'bound_ordering') + field.clean(["1.8", "1.6"]) + self.assertEqual( + cm.exception.messages[0], + "The start of the range must not exceed the end of the range.", + ) + self.assertEqual(cm.exception.code, "bound_ordering") def test_decimal_open(self): field = pg_forms.DecimalRangeField() - value = field.clean(['', '3.1415926']) - self.assertEqual(value, NumericRange(None, Decimal('3.1415926'))) + value = field.clean(["", "3.1415926"]) + self.assertEqual(value, NumericRange(None, Decimal("3.1415926"))) def test_decimal_incorrect_data_type(self): field = pg_forms.DecimalRangeField() with self.assertRaises(exceptions.ValidationError) as cm: - field.clean('1.6') - self.assertEqual(cm.exception.messages[0], 'Enter two numbers.') - self.assertEqual(cm.exception.code, 'invalid') + field.clean("1.6") + self.assertEqual(cm.exception.messages[0], "Enter two numbers.") + self.assertEqual(cm.exception.code, "invalid") def test_decimal_invalid_lower(self): field = pg_forms.DecimalRangeField() with self.assertRaises(exceptions.ValidationError) as cm: - field.clean(['a', '3.1415926']) - self.assertEqual(cm.exception.messages[0], 'Enter a number.') + field.clean(["a", "3.1415926"]) + self.assertEqual(cm.exception.messages[0], "Enter a number.") def test_decimal_invalid_upper(self): field = pg_forms.DecimalRangeField() with self.assertRaises(exceptions.ValidationError) as cm: - field.clean(['1.61803399', 'b']) - self.assertEqual(cm.exception.messages[0], 'Enter a number.') + field.clean(["1.61803399", "b"]) + self.assertEqual(cm.exception.messages[0], "Enter a number.") def test_decimal_required(self): field = pg_forms.DecimalRangeField(required=True) with self.assertRaises(exceptions.ValidationError) as cm: - field.clean(['', '']) - self.assertEqual(cm.exception.messages[0], 'This field is required.') - value = field.clean(['1.61803399', '']) - self.assertEqual(value, NumericRange(Decimal('1.61803399'), None)) + field.clean(["", ""]) + self.assertEqual(cm.exception.messages[0], "This field is required.") + value = field.clean(["1.61803399", ""]) + self.assertEqual(value, NumericRange(Decimal("1.61803399"), None)) def test_date_lower_bound_higher(self): field = pg_forms.DateRangeField() with self.assertRaises(exceptions.ValidationError) as cm: - field.clean(['2013-04-09', '1976-04-16']) - self.assertEqual(cm.exception.messages[0], 'The start of the range must not exceed the end of the range.') - self.assertEqual(cm.exception.code, 'bound_ordering') + field.clean(["2013-04-09", "1976-04-16"]) + self.assertEqual( + cm.exception.messages[0], + "The start of the range must not exceed the end of the range.", + ) + self.assertEqual(cm.exception.code, "bound_ordering") def test_date_open(self): field = pg_forms.DateRangeField() - value = field.clean(['', '2013-04-09']) + value = field.clean(["", "2013-04-09"]) self.assertEqual(value, DateRange(None, datetime.date(2013, 4, 9))) def test_date_incorrect_data_type(self): field = pg_forms.DateRangeField() with self.assertRaises(exceptions.ValidationError) as cm: - field.clean('1') - self.assertEqual(cm.exception.messages[0], 'Enter two valid dates.') - self.assertEqual(cm.exception.code, 'invalid') + field.clean("1") + self.assertEqual(cm.exception.messages[0], "Enter two valid dates.") + self.assertEqual(cm.exception.code, "invalid") def test_date_invalid_lower(self): field = pg_forms.DateRangeField() with self.assertRaises(exceptions.ValidationError) as cm: - field.clean(['a', '2013-04-09']) - self.assertEqual(cm.exception.messages[0], 'Enter a valid date.') + field.clean(["a", "2013-04-09"]) + self.assertEqual(cm.exception.messages[0], "Enter a valid date.") def test_date_invalid_upper(self): field = pg_forms.DateRangeField() with self.assertRaises(exceptions.ValidationError) as cm: - field.clean(['2013-04-09', 'b']) - self.assertEqual(cm.exception.messages[0], 'Enter a valid date.') + field.clean(["2013-04-09", "b"]) + self.assertEqual(cm.exception.messages[0], "Enter a valid date.") def test_date_required(self): field = pg_forms.DateRangeField(required=True) with self.assertRaises(exceptions.ValidationError) as cm: - field.clean(['', '']) - self.assertEqual(cm.exception.messages[0], 'This field is required.') - value = field.clean(['1976-04-16', '']) + field.clean(["", ""]) + self.assertEqual(cm.exception.messages[0], "This field is required.") + value = field.clean(["1976-04-16", ""]) self.assertEqual(value, DateRange(datetime.date(1976, 4, 16), None)) def test_date_has_changed_first(self): - self.assertTrue(pg_forms.DateRangeField().has_changed( - ['2010-01-01', '2020-12-12'], - ['2010-01-31', '2020-12-12'], - )) + self.assertTrue( + pg_forms.DateRangeField().has_changed( + ["2010-01-01", "2020-12-12"], + ["2010-01-31", "2020-12-12"], + ) + ) def test_date_has_changed_last(self): - self.assertTrue(pg_forms.DateRangeField().has_changed( - ['2010-01-01', '2020-12-12'], - ['2010-01-01', '2020-12-31'], - )) + self.assertTrue( + pg_forms.DateRangeField().has_changed( + ["2010-01-01", "2020-12-12"], + ["2010-01-01", "2020-12-31"], + ) + ) def test_datetime_lower_bound_higher(self): field = pg_forms.DateTimeRangeField() with self.assertRaises(exceptions.ValidationError) as cm: - field.clean(['2006-10-25 14:59', '2006-10-25 14:58']) - self.assertEqual(cm.exception.messages[0], 'The start of the range must not exceed the end of the range.') - self.assertEqual(cm.exception.code, 'bound_ordering') + field.clean(["2006-10-25 14:59", "2006-10-25 14:58"]) + self.assertEqual( + cm.exception.messages[0], + "The start of the range must not exceed the end of the range.", + ) + self.assertEqual(cm.exception.code, "bound_ordering") def test_datetime_open(self): field = pg_forms.DateTimeRangeField() - value = field.clean(['', '2013-04-09 11:45']) - self.assertEqual(value, DateTimeTZRange(None, datetime.datetime(2013, 4, 9, 11, 45))) + value = field.clean(["", "2013-04-09 11:45"]) + self.assertEqual( + value, DateTimeTZRange(None, datetime.datetime(2013, 4, 9, 11, 45)) + ) def test_datetime_incorrect_data_type(self): field = pg_forms.DateTimeRangeField() with self.assertRaises(exceptions.ValidationError) as cm: - field.clean('2013-04-09 11:45') - self.assertEqual(cm.exception.messages[0], 'Enter two valid date/times.') - self.assertEqual(cm.exception.code, 'invalid') + field.clean("2013-04-09 11:45") + self.assertEqual(cm.exception.messages[0], "Enter two valid date/times.") + self.assertEqual(cm.exception.code, "invalid") def test_datetime_invalid_lower(self): field = pg_forms.DateTimeRangeField() with self.assertRaises(exceptions.ValidationError) as cm: - field.clean(['45', '2013-04-09 11:45']) - self.assertEqual(cm.exception.messages[0], 'Enter a valid date/time.') + field.clean(["45", "2013-04-09 11:45"]) + self.assertEqual(cm.exception.messages[0], "Enter a valid date/time.") def test_datetime_invalid_upper(self): field = pg_forms.DateTimeRangeField() with self.assertRaises(exceptions.ValidationError) as cm: - field.clean(['2013-04-09 11:45', 'sweet pickles']) - self.assertEqual(cm.exception.messages[0], 'Enter a valid date/time.') + field.clean(["2013-04-09 11:45", "sweet pickles"]) + self.assertEqual(cm.exception.messages[0], "Enter a valid date/time.") def test_datetime_required(self): field = pg_forms.DateTimeRangeField(required=True) with self.assertRaises(exceptions.ValidationError) as cm: - field.clean(['', '']) - self.assertEqual(cm.exception.messages[0], 'This field is required.') - value = field.clean(['2013-04-09 11:45', '']) - self.assertEqual(value, DateTimeTZRange(datetime.datetime(2013, 4, 9, 11, 45), None)) + field.clean(["", ""]) + self.assertEqual(cm.exception.messages[0], "This field is required.") + value = field.clean(["2013-04-09 11:45", ""]) + self.assertEqual( + value, DateTimeTZRange(datetime.datetime(2013, 4, 9, 11, 45), None) + ) - @override_settings(USE_TZ=True, TIME_ZONE='Africa/Johannesburg') + @override_settings(USE_TZ=True, TIME_ZONE="Africa/Johannesburg") def test_datetime_prepare_value(self): field = pg_forms.DateTimeRangeField() value = field.prepare_value( - DateTimeTZRange(datetime.datetime(2015, 5, 22, 16, 6, 33, tzinfo=timezone.utc), None) + DateTimeTZRange( + datetime.datetime(2015, 5, 22, 16, 6, 33, tzinfo=timezone.utc), None + ) ) self.assertEqual(value, [datetime.datetime(2015, 5, 22, 18, 6, 33), None]) def test_datetime_has_changed_first(self): - self.assertTrue(pg_forms.DateTimeRangeField().has_changed( - ['2010-01-01 00:00', '2020-12-12 00:00'], - ['2010-01-31 23:00', '2020-12-12 00:00'], - )) + self.assertTrue( + pg_forms.DateTimeRangeField().has_changed( + ["2010-01-01 00:00", "2020-12-12 00:00"], + ["2010-01-31 23:00", "2020-12-12 00:00"], + ) + ) def test_datetime_has_changed_last(self): - self.assertTrue(pg_forms.DateTimeRangeField().has_changed( - ['2010-01-01 00:00', '2020-12-12 00:00'], - ['2010-01-01 00:00', '2020-12-31 23:00'], - )) + self.assertTrue( + pg_forms.DateTimeRangeField().has_changed( + ["2010-01-01 00:00", "2020-12-12 00:00"], + ["2010-01-01 00:00", "2020-12-31 23:00"], + ) + ) def test_model_field_formfield_integer(self): model_field = pg_fields.IntegerRangeField() @@ -909,15 +966,15 @@ class TestFormField(PostgreSQLSimpleTestCase): def test_has_changed(self): for field, value in ( - (pg_forms.DateRangeField(), ['2010-01-01', '2020-12-12']), - (pg_forms.DateTimeRangeField(), ['2010-01-01 11:13', '2020-12-12 14:52']), + (pg_forms.DateRangeField(), ["2010-01-01", "2020-12-12"]), + (pg_forms.DateTimeRangeField(), ["2010-01-01 11:13", "2020-12-12 14:52"]), (pg_forms.IntegerRangeField(), [1, 2]), - (pg_forms.DecimalRangeField(), ['1.12345', '2.001']), + (pg_forms.DecimalRangeField(), ["1.12345", "2.001"]), ): with self.subTest(field=field.__class__.__name__): self.assertTrue(field.has_changed(None, value)) - self.assertTrue(field.has_changed([value[0], ''], value)) - self.assertTrue(field.has_changed(['', value[1]], value)) + self.assertTrue(field.has_changed([value[0], ""], value)) + self.assertTrue(field.has_changed(["", value[1]], value)) self.assertFalse(field.has_changed(value, value)) @@ -925,19 +982,18 @@ class TestWidget(PostgreSQLSimpleTestCase): def test_range_widget(self): f = pg_forms.ranges.DateTimeRangeField() self.assertHTMLEqual( - f.widget.render('datetimerange', ''), - '<input type="text" name="datetimerange_0"><input type="text" name="datetimerange_1">' + f.widget.render("datetimerange", ""), + '<input type="text" name="datetimerange_0"><input type="text" name="datetimerange_1">', ) self.assertHTMLEqual( - f.widget.render('datetimerange', None), - '<input type="text" name="datetimerange_0"><input type="text" name="datetimerange_1">' + f.widget.render("datetimerange", None), + '<input type="text" name="datetimerange_0"><input type="text" name="datetimerange_1">', ) dt_range = DateTimeTZRange( - datetime.datetime(2006, 1, 10, 7, 30), - datetime.datetime(2006, 2, 12, 9, 50) + datetime.datetime(2006, 1, 10, 7, 30), datetime.datetime(2006, 2, 12, 9, 50) ) self.assertHTMLEqual( - f.widget.render('datetimerange', dt_range), + f.widget.render("datetimerange", dt_range), '<input type="text" name="datetimerange_0" value="2006-01-10 07:30:00">' - '<input type="text" name="datetimerange_1" value="2006-02-12 09:50:00">' + '<input type="text" name="datetimerange_1" value="2006-02-12 09:50:00">', ) |
