Ejemplo n.º 1
0
    def test_detect_soft_applied_add_field_manytomanyfield(self):
        """
        executor.detect_soft_applied() detects ManyToManyField tables from an
        AddField operation. This checks the case of AddField in a migration
        with other operations (0001) and the case of AddField in its own
        migration (0002).
        """
        tables = [
            # from 0001
            "migrations_project",
            "migrations_task",
            "migrations_project_tasks",
            # from 0002
            "migrations_task_projects",
        ]
        executor = MigrationExecutor(connection)
        # Create the tables for 0001 but make it look like the migration hasn't
        # been applied.
        executor.migrate([("migrations", "0001_initial")])
        executor.migrate([("migrations", None)], fake=True)
        for table in tables[:3]:
            self.assertTableExists(table)
        # Table detection sees 0001 is applied but not 0002.
        migration = executor.loader.get_migration("migrations", "0001_initial")
        self.assertEqual(
            executor.detect_soft_applied(None, migration)[0], True)
        migration = executor.loader.get_migration("migrations", "0002_initial")
        self.assertEqual(
            executor.detect_soft_applied(None, migration)[0], False)

        # Create the tables for both migrations but make it look like neither
        # has been applied.
        executor.loader.build_graph()
        executor.migrate([("migrations", "0001_initial")], fake=True)
        executor.migrate([("migrations", "0002_initial")])
        executor.loader.build_graph()
        executor.migrate([("migrations", None)], fake=True)
        # Table detection sees 0002 is applied.
        migration = executor.loader.get_migration("migrations", "0002_initial")
        self.assertEqual(
            executor.detect_soft_applied(None, migration)[0], True)

        # Leave the tables for 0001 except the many-to-many table. That missing
        # table should cause detect_soft_applied() to return False.
        with connection.schema_editor() as editor:
            for table in tables[2:]:
                editor.execute(editor.sql_delete_table % {"table": table})
        migration = executor.loader.get_migration("migrations", "0001_initial")
        self.assertEqual(
            executor.detect_soft_applied(None, migration)[0], False)

        # Cleanup by removing the remaining tables.
        with connection.schema_editor() as editor:
            for table in tables[:2]:
                editor.execute(editor.sql_delete_table % {"table": table})
        for table in tables:
            self.assertTableNotExists(table)
Ejemplo n.º 2
0
    def test_detect_soft_applied_add_field_manytomanyfield(self):
        """
        executor.detect_soft_applied() detects ManyToManyField tables from an
        AddField operation. This checks the case of AddField in a migration
        with other operations (0001) and the case of AddField in its own
        migration (0002).
        """
        tables = [
            # from 0001
            "migrations_project",
            "migrations_task",
            "migrations_project_tasks",
            # from 0002
            "migrations_task_projects",
        ]
        executor = MigrationExecutor(connection)
        # Create the tables for 0001 but make it look like the migration hasn't
        # been applied.
        executor.migrate([("migrations", "0001_initial")])
        executor.migrate([("migrations", None)], fake=True)
        for table in tables[:3]:
            self.assertTableExists(table)
        # Table detection sees 0001 is applied but not 0002.
        migration = executor.loader.get_migration("migrations", "0001_initial")
        self.assertEqual(executor.detect_soft_applied(None, migration)[0], True)
        migration = executor.loader.get_migration("migrations", "0002_initial")
        self.assertEqual(executor.detect_soft_applied(None, migration)[0], False)

        # Create the tables for both migrations but make it look like neither
        # has been applied.
        executor.loader.build_graph()
        executor.migrate([("migrations", "0001_initial")], fake=True)
        executor.migrate([("migrations", "0002_initial")])
        executor.loader.build_graph()
        executor.migrate([("migrations", None)], fake=True)
        # Table detection sees 0002 is applied.
        migration = executor.loader.get_migration("migrations", "0002_initial")
        self.assertEqual(executor.detect_soft_applied(None, migration)[0], True)

        # Leave the tables for 0001 except the many-to-many table. That missing
        # table should cause detect_soft_applied() to return False.
        with connection.schema_editor() as editor:
            for table in tables[2:]:
                editor.execute(editor.sql_delete_table % {"table": table})
        migration = executor.loader.get_migration("migrations", "0001_initial")
        self.assertEqual(executor.detect_soft_applied(None, migration)[0], False)

        # Cleanup by removing the remaining tables.
        with connection.schema_editor() as editor:
            for table in tables[:2]:
                editor.execute(editor.sql_delete_table % {"table": table})
        for table in tables:
            self.assertTableNotExists(table)
Ejemplo n.º 3
0
 def test_custom_user(self):
     """
     Regression test for #22325 - references to a custom user model defined in the
     same app are not resolved correctly.
     """
     executor = MigrationExecutor(connection)
     self.assertTableNotExists("migrations_author")
     self.assertTableNotExists("migrations_tribble")
     # Migrate forwards
     executor.migrate([("migrations", "0001_initial")])
     self.assertTableExists("migrations_author")
     self.assertTableExists("migrations_tribble")
     # Make sure the soft-application detection works (#23093)
     # Change table_names to not return auth_user during this as
     # it wouldn't be there in a normal run, and ensure migrations.Author
     # exists in the global app registry temporarily.
     old_table_names = connection.introspection.table_names
     connection.introspection.table_names = lambda c: [x for x in old_table_names(c) if x != "auth_user"]
     migrations_apps = executor.loader.project_state(("migrations", "0001_initial")).apps
     global_apps.get_app_config("migrations").models["author"] = migrations_apps.get_model("migrations", "author")
     try:
         migration = executor.loader.get_migration("auth", "0001_initial")
         self.assertEqual(executor.detect_soft_applied(None, migration)[0], True)
     finally:
         connection.introspection.table_names = old_table_names
         del global_apps.get_app_config("migrations").models["author"]
     # And migrate back to clean up the database
     executor.loader.build_graph()
     executor.migrate([("migrations", None)])
     self.assertTableNotExists("migrations_author")
     self.assertTableNotExists("migrations_tribble")
Ejemplo n.º 4
0
 def test_custom_user(self):
     """
     Regression test for #22325 - references to a custom user model defined in the
     same app are not resolved correctly.
     """
     executor = MigrationExecutor(connection)
     self.assertTableNotExists("migrations_author")
     self.assertTableNotExists("migrations_tribble")
     # Migrate forwards
     executor.migrate([("migrations", "0001_initial")])
     self.assertTableExists("migrations_author")
     self.assertTableExists("migrations_tribble")
     # Make sure the soft-application detection works (#23093)
     # Change get_table_list to not return auth_user during this as
     # it wouldn't be there in a normal run, and ensure migrations.Author
     # exists in the global app registry temporarily.
     old_get_table_list = connection.introspection.get_table_list
     connection.introspection.get_table_list = lambda c: [x for x in old_get_table_list(c) if x != "auth_user"]
     migrations_apps = executor.loader.project_state(("migrations", "0001_initial")).render()
     global_apps.get_app_config("migrations").models["author"] = migrations_apps.get_model("migrations", "author")
     try:
         migration = executor.loader.get_migration("auth", "0001_initial")
         self.assertEqual(executor.detect_soft_applied(migration), True)
     finally:
         connection.introspection.get_table_list = old_get_table_list
         del global_apps.get_app_config("migrations").models["author"]
     # And migrate back to clean up the database
     executor.loader.build_graph()
     executor.migrate([("migrations", None)])
     self.assertTableNotExists("migrations_author")
     self.assertTableNotExists("migrations_tribble")
Ejemplo n.º 5
0
 def test_custom_user(self):
     """
     Regression test for #22325 - references to a custom user model defined in the
     same app are not resolved correctly.
     """
     with isolate_lru_cache(global_apps.get_swappable_settings_name):
         executor = MigrationExecutor(connection)
         self.assertTableNotExists("migrations_author")
         self.assertTableNotExists("migrations_tribble")
         # Migrate forwards
         executor.migrate([("migrations", "0001_initial")])
         self.assertTableExists("migrations_author")
         self.assertTableExists("migrations_tribble")
         # The soft-application detection works.
         # Change table_names to not return auth_user during this as it
         # wouldn't be there in a normal run, and ensure migrations.Author
         # exists in the global app registry temporarily.
         old_table_names = connection.introspection.table_names
         connection.introspection.table_names = lambda c: [
             x for x in old_table_names(c) if x != "auth_user"
         ]
         migrations_apps = executor.loader.project_state(
             ("migrations", "0001_initial"), ).apps
         global_apps.get_app_config(
             "migrations").models["author"] = migrations_apps.get_model(
                 "migrations", "author")
         try:
             migration = executor.loader.get_migration(
                 "auth", "0001_initial")
             self.assertIs(
                 executor.detect_soft_applied(None, migration)[0], True)
         finally:
             connection.introspection.table_names = old_table_names
             del global_apps.get_app_config("migrations").models["author"]
             # Migrate back to clean up the database.
             executor.loader.build_graph()
             executor.migrate([("migrations", None)])
             self.assertTableNotExists("migrations_author")
             self.assertTableNotExists("migrations_tribble")