diff options
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 |
