Skip to content

Commit 8f735f0

Browse files
committed
Add tests for database limits of SmallIntegerField
1 parent 540e7a9 commit 8f735f0

File tree

2 files changed

+54
-0
lines changed

2 files changed

+54
-0
lines changed

tests/model_fields_/models.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@
1313
from django_mongodb_backend.models import EmbeddedModel
1414

1515

16+
class Integers(models.Model):
17+
small = models.SmallIntegerField(unique=True, blank=True, null=True)
18+
positive_small = models.PositiveSmallIntegerField(unique=True, blank=True, null=True)
19+
20+
1621
# ObjectIdField
1722
class ObjectIdModel(models.Model):
1823
field = ObjectIdField()
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
from django.db import IntegrityError
2+
from django.test import TestCase
3+
4+
from .models import Integers
5+
6+
7+
class SmallIntegerFieldTests(TestCase):
8+
max_value = 2**31 - 1
9+
min_value = -(2**31)
10+
11+
def test_unique_max_value(self):
12+
"""
13+
SmallIntegerField.db_type() is "int" which means unique constraints
14+
are only enforced up to 32-bit values.
15+
"""
16+
Integers.objects.create(small=self.max_value + 1)
17+
Integers.objects.create(small=self.max_value + 1) # no IntegrityError
18+
Integers.objects.create(small=self.max_value)
19+
with self.assertRaises(IntegrityError):
20+
Integers.objects.create(small=self.max_value)
21+
22+
def test_unique_min_value(self):
23+
"""
24+
SmallIntegerField.db_type() is "int" which means unique constraints
25+
are only enforced down to negative 32-bit values.
26+
"""
27+
Integers.objects.create(small=self.min_value - 1)
28+
Integers.objects.create(small=self.min_value - 1) # no IntegrityError
29+
Integers.objects.create(small=self.min_value)
30+
with self.assertRaises(IntegrityError):
31+
Integers.objects.create(small=self.min_value)
32+
33+
34+
class PositiveSmallIntegerFieldTests(TestCase):
35+
max_value = 2**31 - 1
36+
37+
def test_unique_max_value(self):
38+
"""
39+
SmallIntegerField.db_type() is "int" which means unique constraints
40+
are only enforced up to 32-bit values.
41+
"""
42+
Integers.objects.create(positive_small=self.max_value + 1)
43+
Integers.objects.create(positive_small=self.max_value + 1) # no IntegrityError
44+
Integers.objects.create(positive_small=self.max_value)
45+
with self.assertRaises(IntegrityError):
46+
Integers.objects.create(positive_small=self.max_value)
47+
48+
# test_unique_min_value isn't needed since PositiveSmallIntegerField has a
49+
# limit of zero (enforced only in forms and model validation).

0 commit comments

Comments
 (0)