summaryrefslogtreecommitdiff
path: root/tests/migrations
diff options
context:
space:
mode:
authorAdam Johnson <me@adamj.eu>2024-08-22 19:26:42 +0100
committerSarah Boyce <42296566+sarahboyce@users.noreply.github.com>2024-09-03 12:51:06 +0200
commitf5ddd54986172c29c32f5d835584ea237d5a3781 (patch)
treed65cc2b95640189f5c47eff618c507385b0227bd /tests/migrations
parentad7f8129f3d2de937611d72e257fb07d1306a855 (diff)
Fixed #35704 -- Fixed reduction for AddIndex subclasses.
Diffstat (limited to 'tests/migrations')
-rw-r--r--tests/migrations/test_base.py39
-rw-r--r--tests/migrations/test_optimizer.py38
2 files changed, 41 insertions, 36 deletions
diff --git a/tests/migrations/test_base.py b/tests/migrations/test_base.py
index 0ff1dda1d9..cde4063d04 100644
--- a/tests/migrations/test_base.py
+++ b/tests/migrations/test_base.py
@@ -7,9 +7,11 @@ from importlib import import_module
from django.apps import apps
from django.db import connection, connections, migrations, models
from django.db.migrations.migration import Migration
+from django.db.migrations.optimizer import MigrationOptimizer
from django.db.migrations.recorder import MigrationRecorder
+from django.db.migrations.serializer import serializer_factory
from django.db.migrations.state import ProjectState
-from django.test import TransactionTestCase
+from django.test import SimpleTestCase, TransactionTestCase
from django.test.utils import extend_sys_path
from django.utils.module_loading import module_dir
@@ -400,3 +402,38 @@ class OperationTestBase(MigrationTestBase):
)
)
return self.apply_operations(app_label, ProjectState(), operations)
+
+
+class OptimizerTestBase(SimpleTestCase):
+ """Common functions to help test the optimizer."""
+
+ def optimize(self, operations, app_label):
+ """
+ Handy shortcut for getting results + number of loops
+ """
+ optimizer = MigrationOptimizer()
+ return optimizer.optimize(operations, app_label), optimizer._iterations
+
+ def serialize(self, value):
+ return serializer_factory(value).serialize()[0]
+
+ def assertOptimizesTo(
+ self, operations, expected, exact=None, less_than=None, app_label=None
+ ):
+ result, iterations = self.optimize(operations, app_label or "migrations")
+ result = [self.serialize(f) for f in result]
+ expected = [self.serialize(f) for f in expected]
+ self.assertEqual(expected, result)
+ if exact is not None and iterations != exact:
+ raise self.failureException(
+ "Optimization did not take exactly %s iterations (it took %s)"
+ % (exact, iterations)
+ )
+ if less_than is not None and iterations >= less_than:
+ raise self.failureException(
+ "Optimization did not take less than %s iterations (it took %s)"
+ % (less_than, iterations)
+ )
+
+ def assertDoesNotOptimize(self, operations, **kwargs):
+ self.assertOptimizesTo(operations, operations, **kwargs)
diff --git a/tests/migrations/test_optimizer.py b/tests/migrations/test_optimizer.py
index 3ed30102bf..0a40b50edc 100644
--- a/tests/migrations/test_optimizer.py
+++ b/tests/migrations/test_optimizer.py
@@ -1,49 +1,17 @@
from django.db import migrations, models
from django.db.migrations import operations
from django.db.migrations.optimizer import MigrationOptimizer
-from django.db.migrations.serializer import serializer_factory
from django.db.models.functions import Abs
-from django.test import SimpleTestCase
from .models import EmptyManager, UnicodeModel
+from .test_base import OptimizerTestBase
-class OptimizerTests(SimpleTestCase):
+class OptimizerTests(OptimizerTestBase):
"""
- Tests the migration autodetector.
+ Tests the migration optimizer.
"""
- def optimize(self, operations, app_label):
- """
- Handy shortcut for getting results + number of loops
- """
- optimizer = MigrationOptimizer()
- return optimizer.optimize(operations, app_label), optimizer._iterations
-
- def serialize(self, value):
- return serializer_factory(value).serialize()[0]
-
- def assertOptimizesTo(
- self, operations, expected, exact=None, less_than=None, app_label=None
- ):
- result, iterations = self.optimize(operations, app_label or "migrations")
- result = [self.serialize(f) for f in result]
- expected = [self.serialize(f) for f in expected]
- self.assertEqual(expected, result)
- if exact is not None and iterations != exact:
- raise self.failureException(
- "Optimization did not take exactly %s iterations (it took %s)"
- % (exact, iterations)
- )
- if less_than is not None and iterations >= less_than:
- raise self.failureException(
- "Optimization did not take less than %s iterations (it took %s)"
- % (less_than, iterations)
- )
-
- def assertDoesNotOptimize(self, operations, **kwargs):
- self.assertOptimizesTo(operations, operations, **kwargs)
-
def test_none_app_label(self):
optimizer = MigrationOptimizer()
with self.assertRaisesMessage(TypeError, "app_label must be a str"):