diff options
| author | Simon Charette <charette.s@gmail.com> | 2021-01-20 20:59:20 -0500 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2021-01-21 07:35:33 +0100 |
| commit | 900b2ce92bd68fb4b17e923cffdbde30eb24f7d2 (patch) | |
| tree | f7d5986300a8b463c9d192c81eb6bd29ae462dca | |
| parent | 41405a0b8e527e9eef18c8dd1170932c3d585186 (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
| -rw-r--r-- | tests/migrations/test_executor.py | 24 |
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: |
