diff options
author | David Wobrock <david.wobrock@gmail.com> | 2022-06-14 20:12:20 +0200 |
---|---|---|
committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2022-06-17 07:50:39 +0200 |
commit | e286ce17ff8bf72a248ce3177bbd5163c50a6ded (patch) | |
tree | d1aaed2412a29c44be845821ad5434a6aedaed2a /tests/migrations | |
parent | 3893fcdd94498da8f88ae7313b6939ab09bff509 (diff) | |
download | django-e286ce17ff8bf72a248ce3177bbd5163c50a6ded.tar.gz |
Fixed #24870 -- Added --update option to makemigrations command.
Diffstat (limited to 'tests/migrations')
-rw-r--r-- | tests/migrations/test_commands.py | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/tests/migrations/test_commands.py b/tests/migrations/test_commands.py index a3e1efc924..3c98ddd8db 100644 --- a/tests/migrations/test_commands.py +++ b/tests/migrations/test_commands.py @@ -2584,6 +2584,108 @@ class MakeMigrationsTests(MigrationTestBase): out_value = out.getvalue() self.assertIn("0003_auto", out_value) + def test_makemigrations_update(self): + with self.temporary_migration_module( + module="migrations.test_migrations" + ) as migration_dir: + migration_file = os.path.join(migration_dir, "0002_second.py") + with open(migration_file) as fp: + initial_content = fp.read() + + with captured_stdout() as out: + call_command("makemigrations", "migrations", update=True) + self.assertFalse( + any( + filename.startswith("0003") + for filename in os.listdir(migration_dir) + ) + ) + self.assertIs(os.path.exists(migration_file), False) + new_migration_file = os.path.join( + migration_dir, + "0002_delete_tribble_author_rating_modelwithcustombase_and_more.py", + ) + with open(new_migration_file) as fp: + self.assertNotEqual(initial_content, fp.read()) + self.assertIn(f"Deleted {migration_file}", out.getvalue()) + + def test_makemigrations_update_existing_name(self): + with self.temporary_migration_module( + module="migrations.test_auto_now_add" + ) as migration_dir: + migration_file = os.path.join(migration_dir, "0001_initial.py") + with open(migration_file) as fp: + initial_content = fp.read() + + with captured_stdout() as out: + call_command("makemigrations", "migrations", update=True) + self.assertIs(os.path.exists(migration_file), False) + new_migration_file = os.path.join( + migration_dir, + "0001_initial_updated.py", + ) + with open(new_migration_file) as fp: + self.assertNotEqual(initial_content, fp.read()) + self.assertIn(f"Deleted {migration_file}", out.getvalue()) + + def test_makemigrations_update_applied_migration(self): + recorder = MigrationRecorder(connection) + recorder.record_applied("migrations", "0001_initial") + recorder.record_applied("migrations", "0002_second") + with self.temporary_migration_module(module="migrations.test_migrations"): + msg = "Cannot update applied migration 'migrations.0002_second'." + with self.assertRaisesMessage(CommandError, msg): + call_command("makemigrations", "migrations", update=True) + + def test_makemigrations_update_no_migration(self): + with self.temporary_migration_module(module="migrations.test_migrations_empty"): + msg = "App migrations has no migration, cannot update last migration." + with self.assertRaisesMessage(CommandError, msg): + call_command("makemigrations", "migrations", update=True) + + def test_makemigrations_update_squash_migration(self): + with self.temporary_migration_module( + module="migrations.test_migrations_squashed" + ): + msg = "Cannot update squash migration 'migrations.0001_squashed_0002'." + with self.assertRaisesMessage(CommandError, msg): + call_command("makemigrations", "migrations", update=True) + + def test_makemigrations_update_manual_porting(self): + with self.temporary_migration_module( + module="migrations.test_migrations_plan" + ) as migration_dir: + with captured_stdout() as out: + call_command("makemigrations", "migrations", update=True) + # Previous migration exists. + previous_migration_file = os.path.join(migration_dir, "0005_fifth.py") + self.assertIs(os.path.exists(previous_migration_file), True) + # New updated migration exists. + files = [f for f in os.listdir(migration_dir) if f.startswith("0005_auto")] + updated_migration_file = os.path.join(migration_dir, files[0]) + self.assertIs(os.path.exists(updated_migration_file), True) + self.assertIn( + f"Updated migration {updated_migration_file} requires manual porting.\n" + f"Previous migration {previous_migration_file} was kept and must be " + f"deleted after porting functions manually.", + out.getvalue(), + ) + + @override_settings( + INSTALLED_APPS=[ + "migrations.migrations_test_apps.alter_fk.author_app", + "migrations.migrations_test_apps.alter_fk.book_app", + ] + ) + def test_makemigrations_update_dependency_migration(self): + with self.temporary_migration_module(app_label="book_app"): + msg = ( + "Cannot update migration 'book_app.0001_initial' that migrations " + "'author_app.0002_alter_id' depend on." + ) + with self.assertRaisesMessage(CommandError, msg): + call_command("makemigrations", "book_app", update=True) + class SquashMigrationsTests(MigrationTestBase): """ |