summaryrefslogtreecommitdiff
path: root/tests/db_functions
diff options
context:
space:
mode:
authorLily Acorn <code@lilyf.org>2025-11-15 16:29:12 +0000
committerJacob Walls <jacobtylerwalls@gmail.com>2025-12-12 11:17:08 -0500
commitaccceec9493d08e19d59fa1a59f69c0fdf23bb13 (patch)
tree76fb22d06b9fa3074317a477b713c06fa68ddc12 /tests/db_functions
parent8932a677258fbda34f24a1be6f426265148b0003 (diff)
Fixed #36735 -- Added UUID4 and UUID7 database functions.
Co-authored-by: Mariusz Felisiak <felisiak.mariusz@gmail.com>
Diffstat (limited to 'tests/db_functions')
-rw-r--r--tests/db_functions/migrations/0002_create_test_models.py6
-rw-r--r--tests/db_functions/models.py4
-rw-r--r--tests/db_functions/test_uuid.py64
3 files changed, 74 insertions, 0 deletions
diff --git a/tests/db_functions/migrations/0002_create_test_models.py b/tests/db_functions/migrations/0002_create_test_models.py
index 37ee93f92f..32fa83b910 100644
--- a/tests/db_functions/migrations/0002_create_test_models.py
+++ b/tests/db_functions/migrations/0002_create_test_models.py
@@ -88,4 +88,10 @@ class Migration(migrations.Migration):
("f2", models.FloatField(null=True, blank=True)),
],
),
+ migrations.CreateModel(
+ name="UUIDModel",
+ fields=[
+ ("uuid", models.UUIDField(null=True)),
+ ],
+ ),
]
diff --git a/tests/db_functions/models.py b/tests/db_functions/models.py
index c126f1bae1..4985b4bfca 100644
--- a/tests/db_functions/models.py
+++ b/tests/db_functions/models.py
@@ -55,3 +55,7 @@ class IntegerModel(models.Model):
class FloatModel(models.Model):
f1 = models.FloatField(null=True, blank=True)
f2 = models.FloatField(null=True, blank=True)
+
+
+class UUIDModel(models.Model):
+ uuid = models.UUIDField(null=True)
diff --git a/tests/db_functions/test_uuid.py b/tests/db_functions/test_uuid.py
new file mode 100644
index 0000000000..b595aafc1b
--- /dev/null
+++ b/tests/db_functions/test_uuid.py
@@ -0,0 +1,64 @@
+import uuid
+
+from django.db import NotSupportedError, connection
+from django.db.models.functions import UUID4, UUID7
+from django.test import TestCase
+from django.test.testcases import skipIfDBFeature, skipUnlessDBFeature
+
+from .models import UUIDModel
+
+
+class TestUUID(TestCase):
+ @skipUnlessDBFeature("supports_uuid4_function")
+ def test_uuid4(self):
+ m1 = UUIDModel.objects.create()
+ m2 = UUIDModel.objects.create()
+ UUIDModel.objects.update(uuid=UUID4())
+ m1.refresh_from_db()
+ m2.refresh_from_db()
+ self.assertIsInstance(m1.uuid, uuid.UUID)
+ self.assertEqual(m1.uuid.version, 4)
+ self.assertNotEqual(m1.uuid, m2.uuid)
+
+ @skipUnlessDBFeature("supports_uuid7_function")
+ def test_uuid7(self):
+ m1 = UUIDModel.objects.create()
+ m2 = UUIDModel.objects.create()
+ UUIDModel.objects.update(uuid=UUID7())
+ m1.refresh_from_db()
+ m2.refresh_from_db()
+ self.assertIsInstance(m1.uuid, uuid.UUID)
+ self.assertEqual(m1.uuid.version, 7)
+ self.assertNotEqual(m1.uuid, m2.uuid)
+
+ @skipIfDBFeature("supports_uuid4_function")
+ def test_uuid4_unsupported(self):
+ if connection.vendor == "mysql":
+ if connection.mysql_is_mariadb:
+ msg = "UUID4 requires MariaDB version 11.7 or later."
+ else:
+ msg = "UUID4 is not supported on MySQL."
+ elif connection.vendor == "oracle":
+ msg = "UUID4 requires Oracle version 23ai/26ai (23.9) or later."
+ else:
+ msg = "UUID4 is not supported on this database backend."
+
+ with self.assertRaisesMessage(NotSupportedError, msg):
+ UUIDModel.objects.update(uuid=UUID4())
+
+ @skipIfDBFeature("supports_uuid7_function")
+ def test_uuid7_unsupported(self):
+ if connection.vendor == "mysql":
+ if connection.mysql_is_mariadb:
+ msg = "UUID7 requires MariaDB version 11.7 or later."
+ else:
+ msg = "UUID7 is not supported on MySQL."
+ elif connection.vendor == "postgresql":
+ msg = "UUID7 requires PostgreSQL version 18 or later."
+ elif connection.vendor == "sqlite":
+ msg = "UUID7 on SQLite requires Python version 3.14 or later."
+ else:
+ msg = "UUID7 is not supported on this database backend."
+
+ with self.assertRaisesMessage(NotSupportedError, msg):
+ UUIDModel.objects.update(uuid=UUID7())