Pārlūkot izejas kodu

Refs #26552 -- Added test for reloading the database with self-referential objects.

Matthijs Kooijman 5 gadi atpakaļ
vecāks
revīzija
12e6f573ad
2 mainītis faili ar 28 papildinājumiem un 1 dzēšanām
  1. 23 1
      tests/backends/base/test_creation.py
  2. 5 0
      tests/backends/models.py

+ 23 - 1
tests/backends/base/test_creation.py

@@ -7,7 +7,7 @@ from django.db.backends.base.creation import (
 )
 from django.test import SimpleTestCase, TransactionTestCase
 
-from ..models import Object, ObjectReference
+from ..models import Object, ObjectReference, ObjectSelfReference
 
 
 def get_connection_copy():
@@ -101,3 +101,25 @@ class TestDeserializeDbFromString(TransactionTestCase):
         obj_ref = ObjectReference.objects.get()
         self.assertEqual(obj.obj_ref, obj_ref)
         self.assertEqual(obj_ref.obj, obj)
+
+    def test_self_reference(self):
+        # serialize_db_to_string() and deserialize_db_from_string() handles
+        # self references.
+        obj_1 = ObjectSelfReference.objects.create(key='X')
+        obj_2 = ObjectSelfReference.objects.create(key='Y', obj=obj_1)
+        obj_1.obj = obj_2
+        obj_1.save()
+        # Serialize objects.
+        with mock.patch('django.db.migrations.loader.MigrationLoader') as loader:
+            # serialize_db_to_string() serializes only migrated apps, so mark
+            # the backends app as migrated.
+            loader_instance = loader.return_value
+            loader_instance.migrated_apps = {'backends'}
+            data = connection.creation.serialize_db_to_string()
+        ObjectSelfReference.objects.all().delete()
+        # Deserialize objects.
+        connection.creation.deserialize_db_from_string(data)
+        obj_1 = ObjectSelfReference.objects.get(key='X')
+        obj_2 = ObjectSelfReference.objects.get(key='Y')
+        self.assertEqual(obj_1.obj, obj_2)
+        self.assertEqual(obj_2.obj, obj_1)

+ 5 - 0
tests/backends/models.py

@@ -102,6 +102,11 @@ class ObjectReference(models.Model):
         return str(self.obj_id)
 
 
+class ObjectSelfReference(models.Model):
+    key = models.CharField(max_length=3, unique=True)
+    obj = models.ForeignKey('ObjectSelfReference', models.SET_NULL, null=True)
+
+
 class RawData(models.Model):
     raw_data = models.BinaryField()