From 3414b88e0de13733e51e42162dc7ab74b55b74b0 Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Thu, 15 Oct 2026 23:33:52 +0200 Subject: [PATCH] fix(applications): ignore missing health on additional server status Closes #11892 Co-Authored-By: Claude Opus 5.5 --- app/Models/Application.php | 4 +-- .../ApplicationAdditionalServerStatusTest.php | 28 +++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 tests/Unit/ApplicationAdditionalServerStatusTest.php diff --git a/app/Models/Application.php b/app/Models/Application.php index bc64dc067f..8c575eb841 100644 --- a/app/Models/Application.php +++ b/app/Models/Application.php @@ -971,11 +971,11 @@ class Application extends BaseModel $additional_servers_status = $this->additional_servers->pluck('pivot.status'); foreach ($additional_servers_status as $status) { $server_status = str($status)->before(':')->value(); - $server_health = str($status)->after(':')->value() ?? 'unhealthy'; + $server_health = str($status)->contains(':') ? str($status)->after(':')->value() : null; if ($main_server_status !== $server_status) { $complex_status = 'degraded'; } - if ($main_server_health !== $server_health) { + if ($server_health !== null && $main_server_health !== $server_health) { $complex_health = 'unhealthy'; } } diff --git a/tests/Unit/ApplicationAdditionalServerStatusTest.php b/tests/Unit/ApplicationAdditionalServerStatusTest.php new file mode 100644 index 0000000000..71dd48bbf2 --- /dev/null +++ b/tests/Unit/ApplicationAdditionalServerStatusTest.php @@ -0,0 +1,28 @@ +setRawAttributes(['status' => $mainStatus]); + $application->setRelation('additional_servers', collect($additionalStatuses) + ->map(fn (string $status) => (object) ['pivot' => (object) ['status' => $status]])); + + return $application; +} + +it('stays healthy when an additional server status has no health segment', function () { + expect(applicationWithAdditionalServerStatuses('running:healthy', ['running'])->status) + ->toBe('running:healthy'); +}); + +it('reports unhealthy when an additional server has an explicit unhealthy status', function () { + expect(applicationWithAdditionalServerStatuses('running:healthy', ['running:unhealthy'])->status) + ->toBe('running:unhealthy'); +}); + +it('reports degraded when an additional server status without health differs', function () { + expect(applicationWithAdditionalServerStatuses('running:healthy', ['exited'])->status) + ->toBe('degraded:healthy'); +});