diff options
| author | Simon Charette <charette.s@gmail.com> | 2018-07-14 00:32:09 -0400 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2018-07-19 17:06:01 -0400 |
| commit | 8e3f22f2513a5b64153ea9903690a38ac159031b (patch) | |
| tree | b29ee50ab8bb9f64f50e35fb45f01a93d79e96e5 /tests | |
| parent | ed7898e1b58c29cda648a799ac4bd5bc7e193b8b (diff) | |
Fixed #27731 -- Implemented CreateModel/AlterFooOperation reduction.
This should alleviate the side effects of disabling the AlterFooOperation
reduction with RemoveField to fix refs #28862 during migration squashing
because CreateModel can perform a reduction with RemoveField.
Thanks Nick Pope for the review.
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/migrations/test_autodetector.py | 6 | ||||
| -rw-r--r-- | tests/migrations/test_commands.py | 2 | ||||
| -rw-r--r-- | tests/migrations/test_optimizer.py | 67 |
3 files changed, 57 insertions, 18 deletions
diff --git a/tests/migrations/test_autodetector.py b/tests/migrations/test_autodetector.py index b181b084be..02b95b5458 100644 --- a/tests/migrations/test_autodetector.py +++ b/tests/migrations/test_autodetector.py @@ -2075,8 +2075,10 @@ class AutodetectorTests(TestCase): changes = self.get_changes([], [self.book, self.author_with_book_order_wrt]) # Right number/type of migrations? self.assertNumberMigrations(changes, 'testapp', 1) - self.assertOperationTypes(changes, 'testapp', 0, ["CreateModel", "AlterOrderWithRespectTo"]) - self.assertOperationAttributes(changes, 'testapp', 0, 1, name="author", order_with_respect_to="book") + self.assertOperationTypes(changes, 'testapp', 0, ["CreateModel"]) + self.assertOperationAttributes( + changes, 'testapp', 0, 0, name="Author", options={'order_with_respect_to': 'book'} + ) self.assertNotIn("_order", [name for name, field in changes['testapp'][0].operations[0].fields]) def test_alter_model_managers(self): diff --git a/tests/migrations/test_commands.py b/tests/migrations/test_commands.py index 3c42755917..3408f2fefa 100644 --- a/tests/migrations/test_commands.py +++ b/tests/migrations/test_commands.py @@ -1335,7 +1335,7 @@ class SquashMigrationsTests(MigrationTestBase): out = io.StringIO() with self.temporary_migration_module(module="migrations.test_migrations"): call_command("squashmigrations", "migrations", "0002", interactive=False, verbosity=1, stdout=out) - self.assertIn("Optimized from 8 operations to 4 operations.", out.getvalue()) + self.assertIn("Optimized from 8 operations to 2 operations.", out.getvalue()) def test_ticket_23799_squashmigrations_no_optimize(self): """ diff --git a/tests/migrations/test_optimizer.py b/tests/migrations/test_optimizer.py index b841b531b1..b2c7b062c6 100644 --- a/tests/migrations/test_optimizer.py +++ b/tests/migrations/test_optimizer.py @@ -594,8 +594,11 @@ class OptimizerTests(SimpleTestCase): def _test_create_alter_foo_field(self, alter): """ CreateModel, AlterFooTogether/AlterOrderWithRespectTo followed by an - add/alter/rename field should optimize to CreateModel and the Alter* + add/alter/rename field should optimize to CreateModel with options. """ + option_value = getattr(alter, alter.option_name) + options = {alter.option_name: option_value} + # AddField self.assertOptimizesTo( [ @@ -611,13 +614,12 @@ class OptimizerTests(SimpleTestCase): ("a", models.IntegerField()), ("b", models.IntegerField()), ("c", models.IntegerField()), - ]), - alter, + ], options=options), ], ) # AlterField - self.assertDoesNotOptimize( + self.assertOptimizesTo( [ migrations.CreateModel("Foo", [ ("a", models.IntegerField()), @@ -626,6 +628,12 @@ class OptimizerTests(SimpleTestCase): alter, migrations.AlterField("Foo", "b", models.CharField(max_length=255)), ], + [ + migrations.CreateModel("Foo", [ + ("a", models.IntegerField()), + ("b", models.CharField(max_length=255)), + ], options=options), + ], ) self.assertOptimizesTo( @@ -643,13 +651,20 @@ class OptimizerTests(SimpleTestCase): ("a", models.IntegerField()), ("b", models.IntegerField()), ("c", models.CharField(max_length=255)), - ]), - alter, + ], options=options), ], ) # RenameField - self.assertDoesNotOptimize( + if isinstance(option_value, str): + renamed_options = {alter.option_name: 'c'} + else: + renamed_options = { + alter.option_name: { + tuple('c' if value == 'b' else value for value in item) for item in option_value + } + } + self.assertOptimizesTo( [ migrations.CreateModel("Foo", [ ("a", models.IntegerField()), @@ -658,6 +673,12 @@ class OptimizerTests(SimpleTestCase): alter, migrations.RenameField("Foo", "b", "c"), ], + [ + migrations.CreateModel("Foo", [ + ("a", models.IntegerField()), + ("c", models.IntegerField()), + ], options=renamed_options), + ], ) self.assertOptimizesTo( @@ -673,10 +694,8 @@ class OptimizerTests(SimpleTestCase): [ migrations.CreateModel("Foo", [ ("a", models.IntegerField()), - ("b", models.IntegerField()), - ]), - alter, - migrations.RenameField("Foo", "b", "c"), + ("c", models.IntegerField()), + ], options=renamed_options), ], ) @@ -695,13 +714,20 @@ class OptimizerTests(SimpleTestCase): ("a", models.IntegerField()), ("b", models.IntegerField()), ("d", models.IntegerField()), - ]), - alter, + ], options=options), ], ) # RemoveField - self.assertDoesNotOptimize( + if isinstance(option_value, str): + removed_options = None + else: + removed_options = { + alter.option_name: { + tuple(value for value in item if value != 'b') for item in option_value + } + } + self.assertOptimizesTo( [ migrations.CreateModel("Foo", [ ("a", models.IntegerField()), @@ -710,9 +736,14 @@ class OptimizerTests(SimpleTestCase): alter, migrations.RemoveField("Foo", "b"), ], + [ + migrations.CreateModel("Foo", [ + ("a", models.IntegerField()), + ], options=removed_options), + ] ) - self.assertDoesNotOptimize( + self.assertOptimizesTo( [ migrations.CreateModel("Foo", [ ("a", models.IntegerField()), @@ -722,6 +753,12 @@ class OptimizerTests(SimpleTestCase): alter, migrations.RemoveField("Foo", "c"), ], + [ + migrations.CreateModel("Foo", [ + ("a", models.IntegerField()), + ("b", models.IntegerField()), + ], options=options), + ], ) def test_create_alter_unique_field(self): |
