summaryrefslogtreecommitdiff
path: root/tests/migrations
diff options
context:
space:
mode:
authorDavid Wobrock <david.wobrock@gmail.com>2022-06-14 20:12:20 +0200
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2022-06-17 07:50:39 +0200
commite286ce17ff8bf72a248ce3177bbd5163c50a6ded (patch)
treed1aaed2412a29c44be845821ad5434a6aedaed2a /tests/migrations
parent3893fcdd94498da8f88ae7313b6939ab09bff509 (diff)
downloaddjango-e286ce17ff8bf72a248ce3177bbd5163c50a6ded.tar.gz
Fixed #24870 -- Added --update option to makemigrations command.
Diffstat (limited to 'tests/migrations')
-rw-r--r--tests/migrations/test_commands.py102
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):
"""