diff options
| author | Marc Tamlyn <marc.tamlyn@gmail.com> | 2014-07-15 10:35:29 +0100 |
|---|---|---|
| committer | Marc Tamlyn <marc.tamlyn@gmail.com> | 2014-09-16 10:08:09 +0100 |
| commit | ed7821231b7dbf34a6c8ca65be3b9bcbda4a0703 (patch) | |
| tree | 98657032a61094eb7ac9c46d5db5bc12d25d1fa0 /tests | |
| parent | 0d1561d19739e83cf20150585c9e26894b428bad (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.py | 24 | ||||
| -rw-r--r-- | tests/model_fields/models.py | 13 | ||||
| -rw-r--r-- | tests/model_fields/test_uuid.py | 89 |
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) |
