diff --git a/django/core/management/commands/migrate.py b/django/core/management/commands/migrate.py index ba51dd87ff..aa74c9c9c3 100644 --- a/django/core/management/commands/migrate.py +++ b/django/core/management/commands/migrate.py @@ -264,7 +264,7 @@ class Command(BaseCommand): if apps: invalid_apps = [] for app in apps: - if app_label not in loader.migrated_apps: + if app not in loader.migrated_apps: invalid_apps.append(app) if invalid_apps: raise CommandError("No migrations present for: %s" % (", ".join(invalid_apps))) diff --git a/tests/migrations/test_commands.py b/tests/migrations/test_commands.py index 93c871988e..01d11e2c0c 100644 --- a/tests/migrations/test_commands.py +++ b/tests/migrations/test_commands.py @@ -48,6 +48,28 @@ class MigrateTests(MigrationTestBase): self.assertTableNotExists("migrations_tribble") self.assertTableNotExists("migrations_book") + @override_settings(MIGRATION_MODULES={"migrations": "migrations.test_migrations"}) + def test_migrate_list(self): + """ + Tests --list output of migrate command + """ + stdout = six.StringIO() + call_command("migrate", list=True, stdout=stdout, verbosity=0) + self.assertIn("migrations", stdout.getvalue().lower()) + self.assertIn("[ ] 0001_initial", stdout.getvalue().lower()) + self.assertIn("[ ] 0002_second", stdout.getvalue().lower()) + + call_command("migrate", "migrations", "0001", verbosity=0) + + stdout = six.StringIO() + # Giving the explicit app_label tests for selective `show_migration_list` in the command + call_command("migrate", "migrations", list=True, stdout=stdout, verbosity=0) + self.assertIn("migrations", stdout.getvalue().lower()) + self.assertIn("[x] 0001_initial", stdout.getvalue().lower()) + self.assertIn("[ ] 0002_second", stdout.getvalue().lower()) + # Cleanup by unmigrating everything + call_command("migrate", "migrations", "zero", verbosity=0) + @override_settings(MIGRATION_MODULES={"migrations": "migrations.test_migrations"}) def test_sqlmigrate(self): """