diff --git a/src/Support/Migrator.php b/src/Support/Migrator.php index 333e7fef..3d0cc2c8 100644 --- a/src/Support/Migrator.php +++ b/src/Support/Migrator.php @@ -221,6 +221,6 @@ protected function runSuccess(ActionableContract $migration): void */ protected function runFailed(ActionableContract $migration): void { - //$migration->failed(); + $migration->failed(); } } diff --git a/tests/Commands/MigrateTest.php b/tests/Commands/MigrateTest.php index 405bcf5c..0dd07407 100644 --- a/tests/Commands/MigrateTest.php +++ b/tests/Commands/MigrateTest.php @@ -39,22 +39,22 @@ public function testOnce() $this->artisan('migrate:actions')->run(); $this->assertDatabaseCount($table, 1); - $this->assertDatabaseCount($this->table, 7); + $this->assertDatabaseCount($this->table, 8); $this->assertDatabaseMigrationDoesntLike($this->table, $table); $this->artisan('migrate:actions')->run(); $this->assertDatabaseCount($table, 2); - $this->assertDatabaseCount($this->table, 7); + $this->assertDatabaseCount($this->table, 8); $this->assertDatabaseMigrationDoesntLike($this->table, $table); $this->artisan('migrate:actions')->run(); $this->assertDatabaseCount($table, 3); - $this->assertDatabaseCount($this->table, 7); + $this->assertDatabaseCount($this->table, 8); $this->assertDatabaseMigrationDoesntLike($this->table, $table); $this->artisan('migrate:actions')->run(); $this->assertDatabaseCount($table, 4); - $this->assertDatabaseCount($this->table, 7); + $this->assertDatabaseCount($this->table, 8); $this->assertDatabaseMigrationDoesntLike($this->table, $table); } @@ -118,7 +118,7 @@ public function testSingleEnvironment() $this->artisan('migrate:actions')->run(); $this->assertDatabaseCount($table, 5); - $this->assertDatabaseCount($this->table, 7); + $this->assertDatabaseCount($this->table, 8); $this->assertDatabaseMigrationHas($this->table, 'run_on_all'); $this->assertDatabaseMigrationDoesntLike($this->table, 'run_on_production'); $this->assertDatabaseMigrationHas($this->table, 'run_on_testing'); @@ -127,7 +127,7 @@ public function testSingleEnvironment() $this->artisan('migrate:actions')->run(); $this->assertDatabaseCount($table, 5); - $this->assertDatabaseCount($this->table, 7); + $this->assertDatabaseCount($this->table, 8); $this->assertDatabaseMigrationHas($this->table, 'run_on_all'); $this->assertDatabaseMigrationDoesntLike($this->table, 'run_on_production'); $this->assertDatabaseMigrationHas($this->table, 'run_on_testing'); @@ -155,7 +155,7 @@ public function testManyEnvironments() $this->artisan('migrate:actions')->run(); $this->assertDatabaseCount($table, 5); - $this->assertDatabaseCount($this->table, 7); + $this->assertDatabaseCount($this->table, 8); $this->assertDatabaseMigrationHas($this->table, 'run_on_all'); $this->assertDatabaseMigrationDoesntLike($this->table, 'run_on_production'); $this->assertDatabaseMigrationHas($this->table, 'run_on_testing'); @@ -166,7 +166,7 @@ public function testManyEnvironments() $this->artisan('migrate:actions')->run(); $this->assertDatabaseCount($table, 5); - $this->assertDatabaseCount($this->table, 7); + $this->assertDatabaseCount($this->table, 8); $this->assertDatabaseMigrationHas($this->table, 'run_on_all'); $this->assertDatabaseMigrationDoesntLike($this->table, 'run_on_production'); $this->assertDatabaseMigrationHas($this->table, 'run_on_testing'); @@ -191,13 +191,13 @@ public function testAllow() $this->artisan('migrate:actions')->run(); $this->assertDatabaseCount($table, 5); - $this->assertDatabaseCount($this->table, 7); + $this->assertDatabaseCount($this->table, 8); $this->assertDatabaseMigrationHas($this->table, 'run_allow'); $this->assertDatabaseMigrationDoesntLike($this->table, 'run_disallow'); $this->artisan('migrate:actions')->run(); $this->assertDatabaseCount($table, 5); - $this->assertDatabaseCount($this->table, 7); + $this->assertDatabaseCount($this->table, 8); $this->assertDatabaseMigrationHas($this->table, 'run_allow'); $this->assertDatabaseMigrationDoesntLike($this->table, 'run_disallow'); } @@ -216,11 +216,11 @@ public function testUpSuccess() $this->artisan('migrate:actions')->run(); $this->assertDatabaseCount($table, 2); - $this->assertDatabaseCount($this->table, 7); + $this->assertDatabaseCount($this->table, 8); $this->assertDatabaseMigrationHas($this->table, 'run_success'); } - public function testUpFailed() + public function testUpSuccessOnFailed() { $this->copyFiles(); @@ -234,11 +234,11 @@ public function testUpFailed() $this->artisan('migrate:actions')->run(); $this->assertDatabaseCount($table, 2); - $this->assertDatabaseCount($this->table, 7); + $this->assertDatabaseCount($this->table, 8); $this->assertDatabaseMigrationDoesntLike($this->table, 'run_success_on_failed'); try { - $this->copyFiles(true); + $this->copySuccessFailureMethod(); $this->artisan('migrate:actions')->run(); } catch (Throwable $e) { @@ -250,10 +250,62 @@ public function testUpFailed() } $this->assertDatabaseCount($table, 2); - $this->assertDatabaseCount($this->table, 7); + $this->assertDatabaseCount($this->table, 8); $this->assertDatabaseMigrationDoesntLike($this->table, 'run_success_on_failed'); } + public function testUpFailed() + { + $this->copyFiles(); + + $table = 'failed'; + + $this->artisan('migrate:actions:install')->run(); + + $this->assertDatabaseCount($table, 0); + $this->assertDatabaseCount($this->table, 0); + $this->assertDatabaseMigrationDoesntLike($this->table, 'run_failed'); + $this->artisan('migrate:actions')->run(); + + $this->assertDatabaseCount($table, 0); + $this->assertDatabaseCount($this->table, 8); + $this->assertDatabaseMigrationHas($this->table, 'run_failed'); + } + + public function testUpFailedOnException() + { + $this->copyFiles(); + + $table = 'failed'; + + $this->artisan('migrate:actions:install')->run(); + + $this->assertDatabaseCount($table, 0); + $this->assertDatabaseCount($this->table, 0); + $this->assertDatabaseMigrationDoesntLike($this->table, 'run_failed_failure'); + $this->artisan('migrate:actions')->run(); + + $this->assertDatabaseCount($table, 0); + $this->assertDatabaseCount($this->table, 8); + $this->assertDatabaseMigrationDoesntLike($this->table, 'run_failed_failure'); + + try { + $this->copyFailedMethod(); + + $this->artisan('migrate:actions')->run(); + } catch (Throwable $e) { + $this->assertInstanceOf(Exception::class, $e); + + $this->assertSame('Custom exception', $e->getMessage()); + + $this->assertTrue(Str::contains($e->getFile(), 'run_failed_failure')); + } + + $this->assertDatabaseCount($table, 1); + $this->assertDatabaseCount($this->table, 8); + $this->assertDatabaseMigrationDoesntLike($this->table, 'run_failed_failure'); + } + public function testPathAsFileWithExtension() { $this->copyFiles(); diff --git a/tests/Commands/RollbackTest.php b/tests/Commands/RollbackTest.php index 1cc47bd5..d12a6169 100644 --- a/tests/Commands/RollbackTest.php +++ b/tests/Commands/RollbackTest.php @@ -63,7 +63,7 @@ public function testEnvironment() $this->artisan('migrate:actions')->run(); $this->assertDatabaseCount($table, 5); - $this->assertDatabaseCount($this->table, 7); + $this->assertDatabaseCount($this->table, 8); $this->assertDatabaseMigrationHas($this->table, 'run_on_all'); $this->assertDatabaseMigrationDoesntLike($this->table, 'run_on_production'); $this->assertDatabaseMigrationHas($this->table, 'run_on_testing'); @@ -79,7 +79,7 @@ public function testEnvironment() $this->assertDatabaseMigrationDoesntLike($this->table, 'run_on_many_environments'); } - public function testUpSuccess() + public function testDownSuccess() { $this->copyFiles(); @@ -93,7 +93,7 @@ public function testUpSuccess() $this->artisan('migrate:actions')->run(); $this->assertDatabaseCount($table, 2); - $this->assertDatabaseCount($this->table, 7); + $this->assertDatabaseCount($this->table, 8); $this->assertDatabaseMigrationHas($this->table, 'run_success'); $this->artisan('migrate:actions:rollback')->run(); @@ -102,7 +102,7 @@ public function testUpSuccess() $this->assertDatabaseMigrationDoesntLike($this->table, 'run_success'); } - public function testUpFailed() + public function testDownSuccessOnFailed() { $this->copyFiles(); @@ -116,13 +116,13 @@ public function testUpFailed() $this->artisan('migrate:actions')->run(); $this->assertDatabaseCount($table, 2); - $this->assertDatabaseCount($this->table, 7); + $this->assertDatabaseCount($this->table, 8); $this->assertDatabaseMigrationDoesntLike($this->table, 'run_success_on_failed'); try { - $this->copyFiles(true); + $this->copySuccessFailureMethod(); - $this->table()->insert(['migration' => 'run_success_on_failed', 'batch' => 999]); + $this->table()->insert(['migration' => '2021_12_23_165048_run_success_on_failed', 'batch' => 999]); $this->artisan('migrate:actions:rollback')->run(); } catch (Throwable $e) { @@ -134,7 +134,66 @@ public function testUpFailed() } $this->assertDatabaseCount($table, 2); - $this->assertDatabaseCount($this->table, 8); + $this->assertDatabaseCount($this->table, 9); $this->assertDatabaseMigrationHas($this->table, 'run_success_on_failed'); } + + public function testDownFailed() + { + $this->copyFiles(); + + $table = 'failed'; + + $this->artisan('migrate:actions:install')->run(); + + $this->assertDatabaseCount($table, 0); + $this->assertDatabaseCount($this->table, 0); + $this->assertDatabaseMigrationDoesntLike($this->table, 'run_failed'); + $this->artisan('migrate:actions')->run(); + + $this->assertDatabaseCount($table, 0); + $this->assertDatabaseCount($this->table, 8); + $this->assertDatabaseMigrationHas($this->table, 'run_failed'); + + $this->artisan('migrate:actions:rollback')->run(); + $this->assertDatabaseCount($table, 0); + $this->assertDatabaseCount($this->table, 0); + $this->assertDatabaseMigrationDoesntLike($this->table, 'run_failed'); + } + + public function testUpFailedOnException() + { + $this->copyFiles(); + + $table = 'failed'; + + $this->artisan('migrate:actions:install')->run(); + + $this->assertDatabaseCount($table, 0); + $this->assertDatabaseCount($this->table, 0); + $this->assertDatabaseMigrationDoesntLike($this->table, 'run_failed_failure'); + $this->artisan('migrate:actions')->run(); + + $this->assertDatabaseCount($table, 0); + $this->assertDatabaseCount($this->table, 8); + $this->assertDatabaseMigrationDoesntLike($this->table, 'run_failed_failure'); + + try { + $this->copyFailedMethod(); + + $this->table()->insert(['migration' => '2021_12_23_184029_run_failed_failure', 'batch' => 999]); + + $this->artisan('migrate:actions:rollback')->run(); + } catch (Throwable $e) { + $this->assertInstanceOf(Exception::class, $e); + + $this->assertSame('Custom exception', $e->getMessage()); + + $this->assertTrue(Str::contains($e->getFile(), 'run_failed_failure')); + } + + $this->assertDatabaseCount($table, 1); + $this->assertDatabaseCount($this->table, 9); + $this->assertDatabaseMigrationHas($this->table, 'run_failed_failure'); + } } diff --git a/tests/Concerns/Files.php b/tests/Concerns/Files.php index a390032a..6440b5c4 100644 --- a/tests/Concerns/Files.php +++ b/tests/Concerns/Files.php @@ -13,13 +13,25 @@ protected function freshFiles(): void ); } - protected function copyFiles(bool $failed = false): void + protected function copyFiles(): void { - $source = $failed - ? __DIR__ . '/../fixtures/actions_failed' - : __DIR__ . '/../fixtures/actions'; + File::copyDirectory(__DIR__ . '/../fixtures/actions', $this->targetDirectory()); + } - File::copyDirectory($source, $this->targetDirectory()); + protected function copySuccessFailureMethod() + { + File::copy( + __DIR__ . '/../fixtures/actions_failed/2021_12_23_165048_run_success_on_failed.php', + $this->targetDirectory('2021_12_23_165048_run_success_on_failed.php') + ); + } + + protected function copyFailedMethod() + { + File::copy( + __DIR__ . '/../fixtures/actions_failed/2021_12_23_184029_run_failed_failure.php', + $this->targetDirectory('2021_12_23_184029_run_failed_failure.php') + ); } protected function copySuccessTransaction(): void diff --git a/tests/fixtures/actions/2021_12_23_184029_run_failed.php b/tests/fixtures/actions/2021_12_23_184029_run_failed.php new file mode 100644 index 00000000..ef9f224a --- /dev/null +++ b/tests/fixtures/actions/2021_12_23_184029_run_failed.php @@ -0,0 +1,29 @@ +table()->insert([ + 'value' => Uuid::uuid4(), + ]); + } + + protected function table(): Builder + { + return DB::table('success'); + } +} diff --git a/tests/fixtures/actions_failed/2021_12_23_184029_run_failed_failure.php b/tests/fixtures/actions_failed/2021_12_23_184029_run_failed_failure.php new file mode 100644 index 00000000..75c09925 --- /dev/null +++ b/tests/fixtures/actions_failed/2021_12_23_184029_run_failed_failure.php @@ -0,0 +1,31 @@ +table()->insert([ + 'value' => Uuid::uuid4(), + ]); + } + + protected function table(): Builder + { + return DB::table('failed'); + } +} diff --git a/tests/fixtures/migrations/2021_12_23_184434_create_failed_table.php b/tests/fixtures/migrations/2021_12_23_184434_create_failed_table.php new file mode 100644 index 00000000..50173f00 --- /dev/null +++ b/tests/fixtures/migrations/2021_12_23_184434_create_failed_table.php @@ -0,0 +1,20 @@ +string('value'); + }); + } + + public function down() + { + Schema::dropIfExists('failed'); + } +}