From 535db5ac7d331225d30861cbbdcd1c6e485af195 Mon Sep 17 00:00:00 2001 From: Ben Challis Date: Wed, 29 Jul 2026 03:30:36 +0100 Subject: [PATCH 1/2] test(integrations): cover parallel cleanup failure --- tests/Acceptance/IntegrationFixtureRunTest.php | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/tests/Acceptance/IntegrationFixtureRunTest.php b/tests/Acceptance/IntegrationFixtureRunTest.php index 19689a5c..a2514987 100644 --- a/tests/Acceptance/IntegrationFixtureRunTest.php +++ b/tests/Acceptance/IntegrationFixtureRunTest.php @@ -88,15 +88,18 @@ public function partialProvisioningFailureCleansAndFailsBeforeTestsStart(): void } #[Test] - public function cleanupFailureFailsAnOtherwiseSuccessfulRun(): void + #[DataSet('workerCounts')] + public function cleanupFailureFailsAnOtherwiseSuccessfulRun(int $workers): void { - $project = $this->writeProject('cleanup-failure', workers: 1, failCleanup: true); + $project = $this->writeProject('cleanup-failure-' . $workers, workers: $workers, failCleanup: true); $result = GreenlightCli::run($project->directory, ['run', '--reporter=plain']); Expect::that($result->exitCode)->toBe(1) ->and($result->output())->toContain('Integration fixture teardown failed.') ->and($result->output())->toContain('intentional fixture cleanup failure') - ->and($this->matches($project->path('markers/resource-*')))->toBe([]); + ->not()->toContain('fixture-secret') + ->and($this->matches($project->path('markers/resource-*')))->toBe([]) + ->and($this->lines($project->path('markers/cleaned.log')))->toBe(['cleaned']); } #[Test] @@ -175,6 +178,15 @@ public static function workerModes(): iterable yield 'parallel' => [2, 2]; } + /** + * @return iterable + */ + public static function workerCounts(): iterable + { + yield 'in-process' => [1]; + yield 'parallel' => [2]; + } + /** * @return list */ From 1fc8f5c0968eaa9c85538df1cc0f7fc721aaf437 Mon Sep 17 00:00:00 2001 From: Ben Challis Date: Thu, 30 Jul 2026 15:57:53 +0100 Subject: [PATCH 2/2] test(integrations): cover failed provisioning rollback (#904) --- .../Acceptance/IntegrationFixtureRunTest.php | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/tests/Acceptance/IntegrationFixtureRunTest.php b/tests/Acceptance/IntegrationFixtureRunTest.php index a2514987..0d32ea51 100644 --- a/tests/Acceptance/IntegrationFixtureRunTest.php +++ b/tests/Acceptance/IntegrationFixtureRunTest.php @@ -87,6 +87,32 @@ public function partialProvisioningFailureCleansAndFailsBeforeTestsStart(): void ->and($this->lines($project->path('markers/cleaned.log')))->toBe(['cleaned']); } + #[Test] + #[DataSet('workerCounts')] + public function provisioningAndRollbackFailuresAreBothReported(int $workers): void + { + $project = $this->writeProject( + 'provisioning-and-rollback-failure-' . $workers, + workers: $workers, + failProvisioning: true, + failCleanup: true, + ); + $result = GreenlightCli::run($project->directory, ['run', '--reporter=plain']); + + Expect::that($result->exitCode)->toBe(1) + ->and($result->output()) + ->because('the provisioning failure MUST remain the primary run failure') + ->toContain('intentional fixture provisioning failure') + ->and($result->output()) + ->because('rollback failures MUST remain visible after a provisioning failure') + ->toContain('Additionally, cleanup for integration fixture "probe" failed') + ->toContain('intentional fixture cleanup failure') + ->not()->toContain('tests,') + ->not()->toContain('fixture-secret') + ->and($this->matches($project->path('markers/resource-*')))->toBe([]) + ->and($this->lines($project->path('markers/cleaned.log')))->toBe(['cleaned']); + } + #[Test] #[DataSet('workerCounts')] public function cleanupFailureFailsAnOtherwiseSuccessfulRun(int $workers): void