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'); +});