diff --git a/bootstrap/helpers/docker.php b/bootstrap/helpers/docker.php index b44714a8b0..143118c584 100644 --- a/bootstrap/helpers/docker.php +++ b/bootstrap/helpers/docker.php @@ -304,7 +304,7 @@ function getCurrentApplicationContainerStatus(Server $server, Application $appli if ($includePullrequests) { return $container; } - if ($pullRequestId !== null && $pullRequestId !== 0 && str($labels)->contains("coolify.pullRequestId={$pullRequestId}")) { + if ($pullRequestId !== null && $pullRequestId !== 0 && (int) $prLabelValue === $pullRequestId) { return $container; } diff --git a/tests/Feature/PreviewContainerStatusMatchTest.php b/tests/Feature/PreviewContainerStatusMatchTest.php new file mode 100644 index 0000000000..a154314aa5 --- /dev/null +++ b/tests/Feature/PreviewContainerStatusMatchTest.php @@ -0,0 +1,77 @@ + 0, 'fqdn' => 'https://coolify.test']); + + $team = Team::factory()->create(); + $privateKey = PrivateKey::factory()->create(['team_id' => $team->id]); + $this->server = Server::factory()->create(['team_id' => $team->id, 'private_key_id' => $privateKey->id]); + $this->server->settings()->update(['is_reachable' => true, 'is_usable' => true]); + $destination = StandaloneDocker::where('server_id', $this->server->id)->firstOrFail(); + $project = Project::factory()->create(['team_id' => $team->id]); + $environment = $project->environments()->first() + ?? Environment::factory()->create(['project_id' => $project->id]); + $this->application = Application::factory()->create([ + 'environment_id' => $environment->id, + 'destination_id' => $destination->id, + 'destination_type' => $destination->getMorphClass(), + ]); + + $uuid = $this->application->uuid; + $container = fn (string $name, ?int $pullRequestId) => json_encode([ + 'ID' => $name, + 'Names' => $name, + 'State' => 'running', + 'Labels' => $pullRequestId === null + ? "coolify.applicationUuid={$uuid},coolify.managed=true" + : "coolify.applicationUuid={$uuid},coolify.pullRequestId={$pullRequestId},coolify.managed=true", + ]); + $output = implode(PHP_EOL, [ + $container("{$uuid}-base", 0), + $container("{$uuid}-legacy", null), + $container("{$uuid}-pr-1", 1), + $container("{$uuid}-pr-12", 12), + $container("{$uuid}-pr-13", 13), + $container("{$uuid}-pr-100", 100), + ]); + + Process::fake(fn () => Process::result(output: $output)); +}); + +function previewContainerStatusNames(Server $server, Application $application, ?int $pullRequestId, bool $includePullrequests = false): array +{ + return getCurrentApplicationContainerStatus($server->fresh(), $application, $pullRequestId, $includePullrequests) + ->pluck('Names') + ->values() + ->all(); +} + +test('a preview lookup returns only the containers of that exact pull request', function () { + $uuid = $this->application->uuid; + + expect(previewContainerStatusNames($this->server, $this->application, 1))->toBe(["{$uuid}-pr-1"]) + ->and(previewContainerStatusNames($this->server, $this->application, 12))->toBe(["{$uuid}-pr-12"]) + ->and(previewContainerStatusNames($this->server, $this->application, 10))->toBe([]); +}); + +test('a base lookup still returns only base containers, or every container when previews are included', function () { + $uuid = $this->application->uuid; + + expect(previewContainerStatusNames($this->server, $this->application, 0))->toBe(["{$uuid}-base", "{$uuid}-legacy"]) + ->and(previewContainerStatusNames($this->server, $this->application, null))->toBe(["{$uuid}-base", "{$uuid}-legacy"]) + ->and(previewContainerStatusNames($this->server, $this->application, 0, true))->toHaveCount(6); +});