summaryrefslogtreecommitdiff
path: root/tests/postgres_tests/test_ranges.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/postgres_tests/test_ranges.py')
-rw-r--r--tests/postgres_tests/test_ranges.py494
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">',
)