diff options
| author | Andrei Kulakov <andrei.avk@gmail.com> | 2015-03-31 16:30:39 -0400 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2015-07-13 15:57:40 -0400 |
| commit | db97a8849519a3933bf4abd2184efd68ebc21965 (patch) | |
| tree | 456edbf87bf6084e3345723b96492c7cd48a6a3a /tests | |
| parent | a2b999dfcac9bc92513a36ec6b3033ded1561c66 (diff) | |
Fixed #24375 -- Added Migration.initial attribute
The new attribute is checked when the `migrate --fake-initial` option
is used. initial will be set to True for all initial migrations (this
is particularly useful when initial migrations are split) as well as
for squashed migrations.
Diffstat (limited to 'tests')
8 files changed, 147 insertions, 0 deletions
diff --git a/tests/migrations/test_autodetector.py b/tests/migrations/test_autodetector.py index c7c775ae30..7afce3d20b 100644 --- a/tests/migrations/test_autodetector.py +++ b/tests/migrations/test_autodetector.py @@ -877,6 +877,9 @@ class AutodetectorTests(TestCase): self.assertOperationTypes(changes, 'otherapp', 1, ["AddField"]) self.assertMigrationDependencies(changes, 'otherapp', 0, []) self.assertMigrationDependencies(changes, 'otherapp', 1, [("otherapp", "auto_1"), ("testapp", "auto_1")]) + # both split migrations should be `initial` + self.assertTrue(changes['otherapp'][0].initial) + self.assertTrue(changes['otherapp'][1].initial) def test_same_app_circular_fk_dependency(self): """ diff --git a/tests/migrations/test_commands.py b/tests/migrations/test_commands.py index d1bef38716..f50a1820ae 100644 --- a/tests/migrations/test_commands.py +++ b/tests/migrations/test_commands.py @@ -50,6 +50,30 @@ class MigrateTests(MigrationTestBase): self.assertTableNotExists("migrations_tribble") self.assertTableNotExists("migrations_book") + @override_settings(MIGRATION_MODULES={"migrations": "migrations.test_migrations_initial_false"}) + def test_migrate_initial_false(self): + """ + `Migration.initial = False` skips fake-initial detection. + """ + # Make sure no tables are created + self.assertTableNotExists("migrations_author") + self.assertTableNotExists("migrations_tribble") + # Run the migrations to 0001 only + call_command("migrate", "migrations", "0001", verbosity=0) + # Fake rollback + call_command("migrate", "migrations", "zero", fake=True, verbosity=0) + # Make sure fake-initial detection does not run + with self.assertRaises(DatabaseError): + call_command("migrate", "migrations", "0001", fake_initial=True, verbosity=0) + + call_command("migrate", "migrations", "0001", fake=True, verbosity=0) + # Real rollback + call_command("migrate", "migrations", "zero", verbosity=0) + # Make sure it's all gone + self.assertTableNotExists("migrations_author") + self.assertTableNotExists("migrations_tribble") + self.assertTableNotExists("migrations_book") + @override_settings(MIGRATION_MODULES={"migrations": "migrations.test_migrations"}) def test_migrate_fake_initial(self): """ @@ -109,6 +133,24 @@ class MigrateTests(MigrationTestBase): self.assertTableNotExists("migrations_tribble") self.assertTableNotExists("migrations_book") + @override_settings(MIGRATION_MODULES={"migrations": "migrations.test_migrations_fake_split_initial"}) + def test_migrate_fake_split_initial(self): + """ + Split initial migrations can be faked with --fake-initial. + """ + call_command("migrate", "migrations", "0002", verbosity=0) + call_command("migrate", "migrations", "zero", fake=True, verbosity=0) + out = six.StringIO() + with mock.patch('django.core.management.color.supports_color', lambda *args: False): + call_command("migrate", "migrations", "0002", fake_initial=True, stdout=out, verbosity=1) + value = out.getvalue().lower() + self.assertIn("migrations.0001_initial... faked", value) + self.assertIn("migrations.0002_second... faked", value) + # Fake an apply + call_command("migrate", "migrations", fake=True, verbosity=0) + # Unmigrate everything + call_command("migrate", "migrations", "zero", verbosity=0) + @override_settings(MIGRATION_MODULES={"migrations": "migrations.test_migrations_conflict"}) def test_migrate_conflict_exit(self): """ @@ -409,6 +451,7 @@ class MakeMigrationsTests(MigrationTestBase): content = fp.read() self.assertIn('# -*- coding: utf-8 -*-', content) self.assertIn('migrations.CreateModel', content) + self.assertIn('initial = True', content) if six.PY3: self.assertIn('úñí©óðé µóðéø', content) # Meta.verbose_name @@ -882,6 +925,15 @@ class SquashMigrationsTests(MigrationTestBase): squashed_migration_file = os.path.join(migration_dir, "0001_squashed_0002_second.py") self.assertTrue(os.path.exists(squashed_migration_file)) + def test_squashmigrations_initial_attribute(self): + with self.temporary_migration_module(module="migrations.test_migrations") as migration_dir: + call_command("squashmigrations", "migrations", "0002", interactive=False, verbosity=0) + + squashed_migration_file = os.path.join(migration_dir, "0001_squashed_0002_second.py") + with codecs.open(squashed_migration_file, "r", encoding="utf-8") as fp: + content = fp.read() + self.assertIn("initial = True", content) + def test_squashmigrations_optimizes(self): """ Tests that squashmigrations optimizes operations. diff --git a/tests/migrations/test_migrations/0001_initial.py b/tests/migrations/test_migrations/0001_initial.py index 9286d0f02b..7a18c10c0d 100644 --- a/tests/migrations/test_migrations/0001_initial.py +++ b/tests/migrations/test_migrations/0001_initial.py @@ -6,6 +6,8 @@ from django.db import migrations, models class Migration(migrations.Migration): + initial = True + operations = [ migrations.CreateModel( diff --git a/tests/migrations/test_migrations_fake_split_initial/0001_initial.py b/tests/migrations/test_migrations_fake_split_initial/0001_initial.py new file mode 100644 index 0000000000..1f42af2fb8 --- /dev/null +++ b/tests/migrations/test_migrations_fake_split_initial/0001_initial.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + operations = [ + migrations.CreateModel( + "Author", + [ + ("id", models.AutoField(primary_key=True)), + ("name", models.CharField(max_length=255)), + ("slug", models.SlugField(null=True)), + ("age", models.IntegerField(default=0)), + ("silly_field", models.BooleanField(default=False)), + ], + ), + migrations.CreateModel( + "Tribble", + [ + ("id", models.AutoField(primary_key=True)), + ("fluffy", models.BooleanField(default=True)), + ], + ), + migrations.AlterUniqueTogether( + name='author', + unique_together=set([('name', 'slug')]), + ), + ] diff --git a/tests/migrations/test_migrations_fake_split_initial/0002_second.py b/tests/migrations/test_migrations_fake_split_initial/0002_second.py new file mode 100644 index 0000000000..786b77a654 --- /dev/null +++ b/tests/migrations/test_migrations_fake_split_initial/0002_second.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ("migrations", "0001_initial"), + ] + + operations = [ + migrations.AddField("Author", "rating", models.IntegerField(default=0)), + migrations.CreateModel( + "Book", + [ + ("id", models.AutoField(primary_key=True)), + ("author", models.ForeignKey("migrations.Author", null=True)), + ], + ), + ] diff --git a/tests/migrations/test_migrations_fake_split_initial/__init__.py b/tests/migrations/test_migrations_fake_split_initial/__init__.py new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/tests/migrations/test_migrations_fake_split_initial/__init__.py diff --git a/tests/migrations/test_migrations_initial_false/0001_not_initial.py b/tests/migrations/test_migrations_initial_false/0001_not_initial.py new file mode 100644 index 0000000000..9345321776 --- /dev/null +++ b/tests/migrations/test_migrations_initial_false/0001_not_initial.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = False + + operations = [ + migrations.CreateModel( + "Author", + [ + ("id", models.AutoField(primary_key=True)), + ("name", models.CharField(max_length=255)), + ("slug", models.SlugField(null=True)), + ("age", models.IntegerField(default=0)), + ("silly_field", models.BooleanField(default=False)), + ], + ), + migrations.CreateModel( + "Tribble", + [ + ("id", models.AutoField(primary_key=True)), + ("fluffy", models.BooleanField(default=True)), + ], + ), + migrations.AlterUniqueTogether( + name='author', + unique_together=set([('name', 'slug')]), + ), + ] diff --git a/tests/migrations/test_migrations_initial_false/__init__.py b/tests/migrations/test_migrations_initial_false/__init__.py new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/tests/migrations/test_migrations_initial_false/__init__.py |
