summaryrefslogtreecommitdiff
path: root/tests/migrations/test_executor.py
diff options
context:
space:
mode:
authorSimon Charette <charette.s@gmail.com>2021-01-20 20:59:20 -0500
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2021-01-21 07:35:33 +0100
commit900b2ce92bd68fb4b17e923cffdbde30eb24f7d2 (patch)
treef7d5986300a8b463c9d192c81eb6bd29ae462dca /tests/migrations/test_executor.py
parent41405a0b8e527e9eef18c8dd1170932c3d585186 (diff)
[3.2.x] Refs #29721 -- Simplified migration used to test atomic recording.
This makes sure atomic recording of migration application is used when the schema editor doesn't defer any statement. Backport of 533a5835784b95335c8373b6d0b9495b3834e96e from master
Diffstat (limited to 'tests/migrations/test_executor.py')
-rw-r--r--tests/migrations/test_executor.py24
1 files changed, 20 insertions, 4 deletions
diff --git a/tests/migrations/test_executor.py b/tests/migrations/test_executor.py
index 5a122bc6b6..8cab8732c4 100644
--- a/tests/migrations/test_executor.py
+++ b/tests/migrations/test_executor.py
@@ -1,11 +1,12 @@
from unittest import mock
from django.apps.registry import apps as global_apps
-from django.db import DatabaseError, connection
+from django.db import DatabaseError, connection, migrations, models
from django.db.migrations.exceptions import InvalidMigrationPlan
from django.db.migrations.executor import MigrationExecutor
from django.db.migrations.graph import MigrationGraph
from django.db.migrations.recorder import MigrationRecorder
+from django.db.migrations.state import ProjectState
from django.test import (
SimpleTestCase, modify_settings, override_settings, skipUnlessDBFeature,
)
@@ -655,18 +656,33 @@ class ExecutorTests(MigrationTestBase):
# When the feature is False, the operation and the record won't be
# performed in a transaction and the test will systematically pass.
@skipUnlessDBFeature('can_rollback_ddl')
- @override_settings(MIGRATION_MODULES={'migrations': 'migrations.test_migrations'})
def test_migrations_applied_and_recorded_atomically(self):
"""Migrations are applied and recorded atomically."""
+ class Migration(migrations.Migration):
+ operations = [
+ migrations.CreateModel('model', [
+ ('id', models.AutoField(primary_key=True)),
+ ]),
+ ]
+
executor = MigrationExecutor(connection)
with mock.patch('django.db.migrations.executor.MigrationExecutor.record_migration') as record_migration:
record_migration.side_effect = RuntimeError('Recording migration failed.')
with self.assertRaisesMessage(RuntimeError, 'Recording migration failed.'):
+ executor.apply_migration(
+ ProjectState(),
+ Migration('0001_initial', 'record_migration'),
+ )
executor.migrate([('migrations', '0001_initial')])
# The migration isn't recorded as applied since it failed.
migration_recorder = MigrationRecorder(connection)
- self.assertFalse(migration_recorder.migration_qs.filter(app='migrations', name='0001_initial').exists())
- self.assertTableNotExists('migrations_author')
+ self.assertIs(
+ migration_recorder.migration_qs.filter(
+ app='record_migration', name='0001_initial',
+ ).exists(),
+ False,
+ )
+ self.assertTableNotExists('record_migration_model')
class FakeLoader: