diff --git a/packages/database/src/Migrations/MigrationManager.php b/packages/database/src/Migrations/MigrationManager.php index 7d871d89a..6e6b18c6c 100644 --- a/packages/database/src/Migrations/MigrationManager.php +++ b/packages/database/src/Migrations/MigrationManager.php @@ -267,10 +267,9 @@ public function executeDown(MigratesDown $migration): void try { $this->database->execute( - new Query( - 'DELETE FROM Migration WHERE name = :name', - ['name' => $migration->name], - ), + query(Migration::class) + ->delete() + ->whereRaw('name = ?', $migration->name), ); } catch (QueryWasInvalid) { // @mago-expect lint:no-empty-catch-clause /** diff --git a/tests/Integration/Database/MigrationManagerTest.php b/tests/Integration/Database/MigrationManagerTest.php index 081d7e423..ec874848c 100644 --- a/tests/Integration/Database/MigrationManagerTest.php +++ b/tests/Integration/Database/MigrationManagerTest.php @@ -4,10 +4,18 @@ namespace Tests\Tempest\Integration\Database; +use Tempest\Database\MigratesDown; +use Tempest\Database\MigratesUp; +use Tempest\Database\Migrations\CreateMigrationsTable; use Tempest\Database\Migrations\Migration; use Tempest\Database\Migrations\MigrationManager; +use Tempest\Database\QueryStatement; +use Tempest\Database\QueryStatements\CreateTableStatement; +use Tempest\Database\QueryStatements\DropTableStatement; use Tests\Tempest\Integration\FrameworkIntegrationTestCase; +use function Tempest\Database\query; + /** * @internal */ @@ -29,4 +37,42 @@ public function test_migration(): void $this->assertNotEmpty($migrations); $this->assertSame($oldCount, count($migrations)); } + + public function test_execute_down_removes_rolled_back_migration_record(): void + { + $migrationManager = $this->container->get(MigrationManager::class); + $migration = new MigrationManagerTestRollbackMigration(); + + $migrationManager->executeUp(new CreateMigrationsTable()); + $migrationManager->executeUp($migration); + + $this->assertSame(1, $this->countMigrationRecords($migration)); + + $migrationManager->executeDown($migration); + + $this->assertSame(0, $this->countMigrationRecords($migration)); + } + + private function countMigrationRecords(MigrationManagerTestRollbackMigration $migration): int + { + return query(Migration::class) + ->count() + ->whereRaw('name = ?', $migration->name) + ->execute(); + } +} + +final class MigrationManagerTestRollbackMigration implements MigratesUp, MigratesDown +{ + public string $name = '0000-00-00_create_migration_manager_test_table'; + + public function up(): QueryStatement + { + return new CreateTableStatement('migration_manager_test_table')->primary(); + } + + public function down(): QueryStatement + { + return new DropTableStatement('migration_manager_test_table'); + } }