summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaveł Tyślacki <pavel.tyslacki@gmail.com>2019-01-16 00:14:20 +0300
committerTim Graham <timograham@gmail.com>2019-01-28 13:48:04 -0500
commit2ca200a7c3dcb0ddb9fc8eeea1a0a0a2803c3dd5 (patch)
tree85c649921c26d9260394559c4302f4f12b3e2b03
parentd3b4f4b9629f24a59082b74559d131dde592f9f7 (diff)
[2.2.x] Made test table cleanup in OperationTestBase more robust.
Some non-unique constraint names were added in b69f8eb04cc8762d3dfd5af5ea1fc58e3f2ebcc3 which resulted in failures depending on the order in which tests were run. Backport of 62b8596616ea46849e29ca77a77e1196417dc1f9 from master.
-rw-r--r--tests/migrations/test_multidb.py18
-rw-r--r--tests/migrations/test_operations.py38
2 files changed, 30 insertions, 26 deletions
diff --git a/tests/migrations/test_multidb.py b/tests/migrations/test_multidb.py
index b2c4320ad3..e0c5a4d3c5 100644
--- a/tests/migrations/test_multidb.py
+++ b/tests/migrations/test_multidb.py
@@ -122,13 +122,16 @@ class MultiDBOperationTests(OperationTestBase):
self.assertEqual(Pony.objects.count(), 0)
@override_settings(DATABASE_ROUTERS=[MigrateNothingRouter()])
- def test_run_sql(self):
+ def test_run_sql_migrate_nothing_router(self):
self._test_run_sql("test_mltdb_runsql", should_run=False)
@override_settings(DATABASE_ROUTERS=[MigrateWhenFooRouter()])
- def test_run_sql2(self):
+ def test_run_sql_migrate_foo_router_without_hints(self):
self._test_run_sql("test_mltdb_runsql2", should_run=False)
- self._test_run_sql("test_mltdb_runsql2", should_run=True, hints={'foo': True})
+
+ @override_settings(DATABASE_ROUTERS=[MigrateWhenFooRouter()])
+ def test_run_sql_migrate_foo_router_with_hints(self):
+ self._test_run_sql('test_mltdb_runsql3', should_run=True, hints={'foo': True})
def _test_run_python(self, app_label, should_run, hints=None):
with override_settings(DATABASE_ROUTERS=[MigrateEverythingRouter()]):
@@ -156,10 +159,13 @@ class MultiDBOperationTests(OperationTestBase):
self.assertEqual(Pony.objects.count(), 0)
@override_settings(DATABASE_ROUTERS=[MigrateNothingRouter()])
- def test_run_python(self):
+ def test_run_python_migrate_nothing_router(self):
self._test_run_python("test_mltdb_runpython", should_run=False)
@override_settings(DATABASE_ROUTERS=[MigrateWhenFooRouter()])
- def test_run_python2(self):
+ def test_run_python_migrate_foo_router_without_hints(self):
self._test_run_python("test_mltdb_runpython2", should_run=False)
- self._test_run_python("test_mltdb_runpython2", should_run=True, hints={'foo': True})
+
+ @override_settings(DATABASE_ROUTERS=[MigrateWhenFooRouter()])
+ def test_run_python_migrate_foo_router_with_hints(self):
+ self._test_run_python('test_mltdb_runpython3', should_run=True, hints={'foo': True})
diff --git a/tests/migrations/test_operations.py b/tests/migrations/test_operations.py
index e6d0c4bce4..d5c8396596 100644
--- a/tests/migrations/test_operations.py
+++ b/tests/migrations/test_operations.py
@@ -22,6 +22,24 @@ class OperationTestBase(MigrationTestBase):
Common functions to help test operations.
"""
+ @classmethod
+ def setUpClass(cls):
+ super().setUpClass()
+ cls._initial_table_names = frozenset(connection.introspection.table_names())
+
+ def tearDown(self):
+ self.cleanup_test_tables()
+ super().tearDown()
+
+ def cleanup_test_tables(self):
+ table_names = frozenset(connection.introspection.table_names()) - self._initial_table_names
+ with connection.schema_editor() as editor:
+ with connection.constraint_checks_disabled():
+ for table_name in table_names:
+ editor.execute(editor.sql_delete_table % {
+ 'table': editor.quote_name(table_name),
+ })
+
def apply_operations(self, app_label, project_state, operations, atomic=True):
migration = Migration('name', app_label)
migration.operations = operations
@@ -51,26 +69,6 @@ class OperationTestBase(MigrationTestBase):
"""
Creates a test model state and database table.
"""
- # Delete the tables if they already exist
- table_names = [
- # Start with ManyToMany tables
- '_pony_stables', '_pony_vans',
- # Then standard model tables
- '_pony', '_stable', '_van',
- ]
- tables = [(app_label + table_name) for table_name in table_names]
- with connection.cursor() as cursor:
- table_names = connection.introspection.table_names(cursor)
- connection.disable_constraint_checking()
- sql_delete_table = connection.schema_editor().sql_delete_table
- with transaction.atomic():
- for table in tables:
- if table in table_names:
- cursor.execute(sql_delete_table % {
- "table": connection.ops.quote_name(table),
- })
- connection.enable_constraint_checking()
-
# Make the "current" state
model_options = {
"swappable": "TEST_SWAP_MODEL",