summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorMarc Tamlyn <marc.tamlyn@gmail.com>2014-07-15 10:35:29 +0100
committerMarc Tamlyn <marc.tamlyn@gmail.com>2014-09-16 10:08:09 +0100
commited7821231b7dbf34a6c8ca65be3b9bcbda4a0703 (patch)
tree98657032a61094eb7ac9c46d5db5bc12d25d1fa0 /tests
parent0d1561d19739e83cf20150585c9e26894b428bad (diff)
Fixed #19463 -- Added UUIDField
Uses native support in postgres, and char(32) on other backends.
Diffstat (limited to 'tests')
-rw-r--r--tests/forms_tests/tests/test_fields.py24
-rw-r--r--tests/model_fields/models.py13
-rw-r--r--tests/model_fields/test_uuid.py89
3 files changed, 125 insertions, 1 deletions
diff --git a/tests/forms_tests/tests/test_fields.py b/tests/forms_tests/tests/test_fields.py
index b64e55b066..22af2cf23d 100644
--- a/tests/forms_tests/tests/test_fields.py
+++ b/tests/forms_tests/tests/test_fields.py
@@ -30,6 +30,7 @@ import datetime
import pickle
import re
import os
+import uuid
from decimal import Decimal
from unittest import skipIf
import warnings
@@ -46,7 +47,7 @@ from django.forms import (
Form, forms, HiddenInput, ImageField, IntegerField, MultipleChoiceField,
NullBooleanField, NumberInput, PasswordInput, RadioSelect, RegexField,
SplitDateTimeField, TextInput, Textarea, TimeField, TypedChoiceField,
- TypedMultipleChoiceField, URLField, ValidationError, Widget,
+ TypedMultipleChoiceField, URLField, UUIDField, ValidationError, Widget,
)
from django.test import SimpleTestCase
from django.utils import formats
@@ -1342,3 +1343,24 @@ class FieldsTests(SimpleTestCase):
self.assertTrue(f.has_changed(datetime.datetime(2008, 5, 6, 12, 40, 00), ['2008-05-06', '12:40:00']))
self.assertFalse(f.has_changed(datetime.datetime(2008, 5, 6, 12, 40, 00), ['06/05/2008', '12:40']))
self.assertTrue(f.has_changed(datetime.datetime(2008, 5, 6, 12, 40, 00), ['06/05/2008', '12:41']))
+
+ def test_uuidfield_1(self):
+ field = UUIDField()
+ value = field.clean('550e8400e29b41d4a716446655440000')
+ self.assertEqual(value, uuid.UUID('550e8400e29b41d4a716446655440000'))
+
+ def test_uuidfield_2(self):
+ field = UUIDField(required=False)
+ value = field.clean('')
+ self.assertEqual(value, None)
+
+ def test_uuidfield_3(self):
+ field = UUIDField()
+ with self.assertRaises(ValidationError) as cm:
+ field.clean('550e8400')
+ self.assertEqual(cm.exception.messages[0], 'Enter a valid UUID.')
+
+ def test_uuidfield_4(self):
+ field = UUIDField()
+ value = field.prepare_value(uuid.UUID('550e8400e29b41d4a716446655440000'))
+ self.assertEqual(value, '550e8400e29b41d4a716446655440000')
diff --git a/tests/model_fields/models.py b/tests/model_fields/models.py
index 430722cf4b..ed1cfa8e8d 100644
--- a/tests/model_fields/models.py
+++ b/tests/model_fields/models.py
@@ -1,5 +1,6 @@
import os
import tempfile
+import uuid
import warnings
try:
@@ -294,3 +295,15 @@ if Image:
width_field='headshot_width')
###############################################################################
+
+
+class UUIDModel(models.Model):
+ field = models.UUIDField()
+
+
+class NullableUUIDModel(models.Model):
+ field = models.UUIDField(blank=True, null=True)
+
+
+class PrimaryKeyUUIDModel(models.Model):
+ id = models.UUIDField(primary_key=True, default=uuid.uuid4)
diff --git a/tests/model_fields/test_uuid.py b/tests/model_fields/test_uuid.py
new file mode 100644
index 0000000000..b5bc37a48d
--- /dev/null
+++ b/tests/model_fields/test_uuid.py
@@ -0,0 +1,89 @@
+import json
+import uuid
+
+from django.core import exceptions, serializers
+from django.db import models
+from django.test import TestCase
+
+from .models import UUIDModel, NullableUUIDModel, PrimaryKeyUUIDModel
+
+
+class TestSaveLoad(TestCase):
+ def test_uuid_instance(self):
+ instance = UUIDModel.objects.create(field=uuid.uuid4())
+ loaded = UUIDModel.objects.get()
+ self.assertEqual(loaded.field, instance.field)
+
+ def test_str_instance_no_hyphens(self):
+ UUIDModel.objects.create(field='550e8400e29b41d4a716446655440000')
+ loaded = UUIDModel.objects.get()
+ self.assertEqual(loaded.field, uuid.UUID('550e8400e29b41d4a716446655440000'))
+
+ def test_str_instance_hyphens(self):
+ UUIDModel.objects.create(field='550e8400-e29b-41d4-a716-446655440000')
+ loaded = UUIDModel.objects.get()
+ self.assertEqual(loaded.field, uuid.UUID('550e8400e29b41d4a716446655440000'))
+
+ def test_str_instance_bad_hyphens(self):
+ UUIDModel.objects.create(field='550e84-00-e29b-41d4-a716-4-466-55440000')
+ loaded = UUIDModel.objects.get()
+ self.assertEqual(loaded.field, uuid.UUID('550e8400e29b41d4a716446655440000'))
+
+ def test_null_handling(self):
+ NullableUUIDModel.objects.create(field=None)
+ loaded = NullableUUIDModel.objects.get()
+ self.assertEqual(loaded.field, None)
+
+
+class TestQuerying(TestCase):
+ def setUp(self):
+ self.objs = [
+ NullableUUIDModel.objects.create(field=uuid.uuid4()),
+ NullableUUIDModel.objects.create(field='550e8400e29b41d4a716446655440000'),
+ NullableUUIDModel.objects.create(field=None),
+ ]
+
+ def test_exact(self):
+ self.assertSequenceEqual(
+ NullableUUIDModel.objects.filter(field__exact='550e8400e29b41d4a716446655440000'),
+ [self.objs[1]]
+ )
+
+ def test_isnull(self):
+ self.assertSequenceEqual(
+ NullableUUIDModel.objects.filter(field__isnull=True),
+ [self.objs[2]]
+ )
+
+
+class TestSerialization(TestCase):
+ test_data = '[{"fields": {"field": "550e8400-e29b-41d4-a716-446655440000"}, "model": "model_fields.uuidmodel", "pk": null}]'
+
+ def test_dumping(self):
+ instance = UUIDModel(field=uuid.UUID('550e8400e29b41d4a716446655440000'))
+ data = serializers.serialize('json', [instance])
+ self.assertEqual(json.loads(data), json.loads(self.test_data))
+
+ def test_loading(self):
+ instance = list(serializers.deserialize('json', self.test_data))[0].object
+ self.assertEqual(instance.field, uuid.UUID('550e8400-e29b-41d4-a716-446655440000'))
+
+
+class TestValidation(TestCase):
+ def test_invalid_uuid(self):
+ field = models.UUIDField()
+ with self.assertRaises(exceptions.ValidationError) as cm:
+ field.clean('550e8400', None)
+ self.assertEqual(cm.exception.code, 'invalid')
+ self.assertEqual(cm.exception.message % cm.exception.params, "'550e8400' is not a valid UUID.")
+
+ def test_uuid_instance_ok(self):
+ field = models.UUIDField()
+ field.clean(uuid.uuid4(), None) # no error
+
+
+class TestAsPrimaryKey(TestCase):
+ def test_creation(self):
+ PrimaryKeyUUIDModel.objects.create()
+ loaded = PrimaryKeyUUIDModel.objects.get()
+ self.assertIsInstance(loaded.pk, uuid.UUID)