summaryrefslogtreecommitdiff
path: root/tests/postgres_tests
diff options
context:
space:
mode:
authorFernando Miranda <fcmiranda@gmail.com>2015-07-22 14:51:05 -0300
committerTim Graham <timograham@gmail.com>2016-03-12 09:14:35 -0500
commit2495023a4cae28f494d0a6172abfac3a47a0b816 (patch)
tree720d4f4e7238627b9e8b3a9c9fe3240301bc07c4 /tests/postgres_tests
parentf8d20da0479b88db5bb5a2a30fa769cbf6d0a5bf (diff)
Fixed #25143 -- Added ArrayField.from_db_value().
Thanks Karan Lyons for contributing to the patch.
Diffstat (limited to 'tests/postgres_tests')
-rw-r--r--tests/postgres_tests/migrations/0002_create_test_models.py2
-rw-r--r--tests/postgres_tests/models.py30
-rw-r--r--tests/postgres_tests/test_array.py22
3 files changed, 53 insertions, 1 deletions
diff --git a/tests/postgres_tests/migrations/0002_create_test_models.py b/tests/postgres_tests/migrations/0002_create_test_models.py
index a58119e23c..872d8aeb58 100644
--- a/tests/postgres_tests/migrations/0002_create_test_models.py
+++ b/tests/postgres_tests/migrations/0002_create_test_models.py
@@ -4,6 +4,7 @@ from __future__ import unicode_literals
from django.db import migrations, models
from ..fields import * # NOQA
+from ..models import TagField
class Migration(migrations.Migration):
@@ -55,6 +56,7 @@ class Migration(migrations.Migration):
('ips', ArrayField(models.GenericIPAddressField(), size=None)),
('uuids', ArrayField(models.UUIDField(), size=None)),
('decimals', ArrayField(models.DecimalField(max_digits=5, decimal_places=2), size=None)),
+ ('tags', ArrayField(TagField(), blank=True, null=True, size=None)),
],
options={
'required_db_vendor': 'postgresql',
diff --git a/tests/postgres_tests/models.py b/tests/postgres_tests/models.py
index 62a32b113d..b950134bb9 100644
--- a/tests/postgres_tests/models.py
+++ b/tests/postgres_tests/models.py
@@ -6,6 +6,35 @@ from .fields import (
)
+class Tag(object):
+ def __init__(self, tag_id):
+ self.tag_id = tag_id
+
+ def __eq__(self, other):
+ return isinstance(other, Tag) and self.tag_id == other.tag_id
+
+
+class TagField(models.SmallIntegerField):
+
+ def from_db_value(self, value, expression, connection, context):
+ if value is None:
+ return value
+ return Tag(int(value))
+
+ def to_python(self, value):
+ if isinstance(value, Tag):
+ return value
+ if value is None:
+ return value
+ return Tag(int(value))
+
+ def get_prep_value(self, value):
+ return value.tag_id
+
+ def get_db_prep_value(self, value, connection, prepared=False):
+ return self.get_prep_value(value)
+
+
class PostgreSQLModel(models.Model):
class Meta:
abstract = True
@@ -38,6 +67,7 @@ class OtherTypesArrayModel(PostgreSQLModel):
ips = ArrayField(models.GenericIPAddressField())
uuids = ArrayField(models.UUIDField())
decimals = ArrayField(models.DecimalField(max_digits=5, decimal_places=2))
+ tags = ArrayField(TagField(), blank=True, null=True)
class HStoreModel(PostgreSQLModel):
diff --git a/tests/postgres_tests/test_array.py b/tests/postgres_tests/test_array.py
index 5df25c1c0f..f5c333e56f 100644
--- a/tests/postgres_tests/test_array.py
+++ b/tests/postgres_tests/test_array.py
@@ -15,7 +15,7 @@ from . import PostgreSQLTestCase
from .models import (
ArrayFieldSubclass, CharArrayModel, DateTimeArrayModel, IntegerArrayModel,
NestedIntegerArrayModel, NullableIntegerArrayModel, OtherTypesArrayModel,
- PostgreSQLModel,
+ PostgreSQLModel, Tag,
)
try:
@@ -92,12 +92,24 @@ class TestSaveLoad(PostgreSQLTestCase):
ips=['192.168.0.1', '::1'],
uuids=[uuid.uuid4()],
decimals=[decimal.Decimal(1.25), 1.75],
+ tags=[Tag(1), Tag(2), Tag(3)],
)
instance.save()
loaded = OtherTypesArrayModel.objects.get()
self.assertEqual(instance.ips, loaded.ips)
self.assertEqual(instance.uuids, loaded.uuids)
self.assertEqual(instance.decimals, loaded.decimals)
+ self.assertEqual(instance.tags, loaded.tags)
+
+ def test_null_from_db_value_handling(self):
+ instance = OtherTypesArrayModel.objects.create(
+ ips=['192.168.0.1', '::1'],
+ uuids=[uuid.uuid4()],
+ decimals=[decimal.Decimal(1.25), 1.75],
+ tags=None,
+ )
+ instance.refresh_from_db()
+ self.assertIsNone(instance.tags)
def test_model_set_on_base_field(self):
instance = IntegerArrayModel()
@@ -306,11 +318,13 @@ class TestOtherTypesExactQuerying(PostgreSQLTestCase):
self.ips = ['192.168.0.1', '::1']
self.uuids = [uuid.uuid4()]
self.decimals = [decimal.Decimal(1.25), 1.75]
+ self.tags = [Tag(1), Tag(2), Tag(3)]
self.objs = [
OtherTypesArrayModel.objects.create(
ips=self.ips,
uuids=self.uuids,
decimals=self.decimals,
+ tags=self.tags,
)
]
@@ -332,6 +346,12 @@ class TestOtherTypesExactQuerying(PostgreSQLTestCase):
self.objs
)
+ def test_exact_tags(self):
+ self.assertSequenceEqual(
+ OtherTypesArrayModel.objects.filter(tags=self.tags),
+ self.objs
+ )
+
@isolate_apps('postgres_tests')
class TestChecks(PostgreSQLTestCase):