diff --git a/tests/migrations/test_operations.py b/tests/migrations/test_operations.py index 2373ef34696..890af778dbe 100644 --- a/tests/migrations/test_operations.py +++ b/tests/migrations/test_operations.py @@ -2489,10 +2489,7 @@ class OperationTests(OperationTestBase): """ Tests the RenameField operation. """ - project_state = self.set_up_test_model( - "test_rnfl", unique_together=True, index_together=True - ) - # Test the state alteration + project_state = self.set_up_test_model("test_rnfl") operation = migrations.RenameField("Pony", "pink", "blue") self.assertEqual(operation.describe(), "Rename field pink on Pony to blue") self.assertEqual(operation.migration_name_fragment, "rename_pink_pony_blue") @@ -2500,46 +2497,19 @@ class OperationTests(OperationTestBase): operation.state_forwards("test_rnfl", new_state) self.assertIn("blue", new_state.models["test_rnfl", "pony"].fields) self.assertNotIn("pink", new_state.models["test_rnfl", "pony"].fields) - # Make sure the unique_together has the renamed column too - self.assertIn( - "blue", new_state.models["test_rnfl", "pony"].options["unique_together"][0] - ) - self.assertNotIn( - "pink", new_state.models["test_rnfl", "pony"].options["unique_together"][0] - ) - # Make sure the index_together has the renamed column too - self.assertIn( - "blue", new_state.models["test_rnfl", "pony"].options["index_together"][0] - ) - self.assertNotIn( - "pink", new_state.models["test_rnfl", "pony"].options["index_together"][0] - ) - # Test the database alteration + # Rename field. self.assertColumnExists("test_rnfl_pony", "pink") self.assertColumnNotExists("test_rnfl_pony", "blue") with connection.schema_editor() as editor: operation.database_forwards("test_rnfl", editor, project_state, new_state) self.assertColumnExists("test_rnfl_pony", "blue") self.assertColumnNotExists("test_rnfl_pony", "pink") - # Ensure the unique constraint has been ported over - with connection.cursor() as cursor: - cursor.execute("INSERT INTO test_rnfl_pony (blue, weight) VALUES (1, 1)") - with self.assertRaises(IntegrityError): - with atomic(): - cursor.execute( - "INSERT INTO test_rnfl_pony (blue, weight) VALUES (1, 1)" - ) - cursor.execute("DELETE FROM test_rnfl_pony") - # Ensure the index constraint has been ported over - self.assertIndexExists("test_rnfl_pony", ["weight", "blue"]) - # And test reversal + # Reversal. with connection.schema_editor() as editor: operation.database_backwards("test_rnfl", editor, new_state, project_state) self.assertColumnExists("test_rnfl_pony", "pink") self.assertColumnNotExists("test_rnfl_pony", "blue") - # Ensure the index constraint has been reset - self.assertIndexExists("test_rnfl_pony", ["weight", "pink"]) - # And deconstruction + # Deconstruction. definition = operation.deconstruct() self.assertEqual(definition[0], "RenameField") self.assertEqual(definition[1], []) @@ -2548,6 +2518,74 @@ class OperationTests(OperationTestBase): {"model_name": "Pony", "old_name": "pink", "new_name": "blue"}, ) + def test_rename_field_unique_together(self): + project_state = self.set_up_test_model("test_rnflut", unique_together=True) + operation = migrations.RenameField("Pony", "pink", "blue") + new_state = project_state.clone() + operation.state_forwards("test_rnflut", new_state) + # unique_together has the renamed column. + self.assertIn( + "blue", + new_state.models["test_rnflut", "pony"].options["unique_together"][0], + ) + self.assertNotIn( + "pink", + new_state.models["test_rnflut", "pony"].options["unique_together"][0], + ) + # Rename field. + self.assertColumnExists("test_rnflut_pony", "pink") + self.assertColumnNotExists("test_rnflut_pony", "blue") + with connection.schema_editor() as editor: + operation.database_forwards("test_rnflut", editor, project_state, new_state) + self.assertColumnExists("test_rnflut_pony", "blue") + self.assertColumnNotExists("test_rnflut_pony", "pink") + # The unique constraint has been ported over. + with connection.cursor() as cursor: + cursor.execute("INSERT INTO test_rnflut_pony (blue, weight) VALUES (1, 1)") + with self.assertRaises(IntegrityError): + with atomic(): + cursor.execute( + "INSERT INTO test_rnflut_pony (blue, weight) VALUES (1, 1)" + ) + cursor.execute("DELETE FROM test_rnflut_pony") + # Reversal. + with connection.schema_editor() as editor: + operation.database_backwards( + "test_rnflut", editor, new_state, project_state + ) + self.assertColumnExists("test_rnflut_pony", "pink") + self.assertColumnNotExists("test_rnflut_pony", "blue") + + def test_rename_field_index_together(self): + project_state = self.set_up_test_model("test_rnflit", index_together=True) + operation = migrations.RenameField("Pony", "pink", "blue") + new_state = project_state.clone() + operation.state_forwards("test_rnflit", new_state) + self.assertIn("blue", new_state.models["test_rnflit", "pony"].fields) + self.assertNotIn("pink", new_state.models["test_rnflit", "pony"].fields) + # index_together has the renamed column. + self.assertIn( + "blue", new_state.models["test_rnflit", "pony"].options["index_together"][0] + ) + self.assertNotIn( + "pink", new_state.models["test_rnflit", "pony"].options["index_together"][0] + ) + # Rename field. + self.assertColumnExists("test_rnflit_pony", "pink") + self.assertColumnNotExists("test_rnflit_pony", "blue") + with connection.schema_editor() as editor: + operation.database_forwards("test_rnflit", editor, project_state, new_state) + self.assertColumnExists("test_rnflit_pony", "blue") + self.assertColumnNotExists("test_rnflit_pony", "pink") + # The index constraint has been ported over. + self.assertIndexExists("test_rnflit_pony", ["weight", "blue"]) + # Reversal. + with connection.schema_editor() as editor: + operation.database_backwards( + "test_rnflit", editor, new_state, project_state + ) + self.assertIndexExists("test_rnflit_pony", ["weight", "pink"]) + def test_rename_field_with_db_column(self): project_state = self.apply_operations( "test_rfwdbc",