diff --git a/resources/views/components/component-group.blade.php b/resources/views/components/component-group.blade.php index ddbc52ee..6e2871b1 100644 --- a/resources/views/components/component-group.blade.php +++ b/resources/views/components/component-group.blade.php @@ -12,16 +12,21 @@ {{ $componentGroup->name }} - @if ($showComponentGroupStatus) - @php($groupStatus = $componentGroup->worstComponentStatus()) - - {{ $groupStatus->getLabel() }} - - @else - - {{ trans_choice('cachet::component_group.incident_count', $componentGroup->openIncidentCount()) }} - - @endif + @php($groupStatus = $componentGroup->worstComponentStatus()) + @php($openIncidentCount = $componentGroup->openIncidentCount()) + @php($showGroupStatusLabel = $showComponentGroupStatus || $openIncidentCount === 0) + + @if ($showGroupStatusLabel) + {{ $groupStatus->getLabel() }} + @endif + + @if ($openIncidentCount > 0) + @if ($showGroupStatusLabel) + + @endif + {{ trans_choice('cachet::component_group.incident_count', $openIncidentCount) }} + @endif +
diff --git a/tests/Feature/StatusPage/StatusPageTest.php b/tests/Feature/StatusPage/StatusPageTest.php index dd3fd5d5..43a45cae 100644 --- a/tests/Feature/StatusPage/StatusPageTest.php +++ b/tests/Feature/StatusPage/StatusPageTest.php @@ -179,7 +179,80 @@ expect($page) ->toContain('Core services') ->toContain('1 Incident') - ->not->toMatch('/Core services\s*<\\/h2>\s*]*>\s*Major outage\s*<\\/span>/'); + ->not->toMatch('/Core services\s*<\\/h2>\s*]*>\s*Major outage<\\/span>/'); +}); + +it('shows the component group status alongside the open incident count', function () { + $group = ComponentGroup::factory()->create(['name' => 'Core services']); + $component = Component::factory()->create([ + 'component_group_id' => $group->id, + 'status' => ComponentStatusEnum::major_outage, + ]); + $incident = Incident::factory()->create(['status' => IncidentStatusEnum::investigating]); + $incident->components()->attach($component->id); + + $page = $this->get(route('cachet.status-page')) + ->assertOk() + ->getContent(); + + expect($page) + ->toContain('Core services') + ->toMatch('/Core services\s*<\\/h2>\s*]*>\s*Major outage<\\/span>\s*]*>·<\\/span>\s*1 Incident<\\/span>/'); +}); + +it('does not show a zero incident count on component groups', function () { + ComponentGroup::factory() + ->has(Component::factory(['status' => ComponentStatusEnum::operational])) + ->create(['name' => 'Core services']); + + $page = $this->get(route('cachet.status-page')) + ->assertOk() + ->getContent(); + + expect($page) + ->toContain('Core services') + ->toContain('Operational') + ->not->toContain('0 Incident'); +}); + +it('falls back to the group status when statuses are hidden and there are no open incidents', function () { + $settings = app(AppSettings::class); + $settings->show_component_group_status = false; + $settings->save(); + + ComponentGroup::factory() + ->has(Component::factory(['status' => ComponentStatusEnum::operational])) + ->create(['name' => 'Core services']); + + $page = $this->get(route('cachet.status-page')) + ->assertOk() + ->getContent(); + + expect($page) + ->toMatch('/Core services\s*<\\/h2>\s*]*>\s*Operational<\\/span>/') + ->not->toContain('0 Incident'); +}); + +it('colours the incident count by the worst component status when group statuses are hidden', function () { + $settings = app(AppSettings::class); + $settings->show_component_group_status = false; + $settings->save(); + + $group = ComponentGroup::factory()->create(['name' => 'Core services']); + $component = Component::factory()->create([ + 'component_group_id' => $group->id, + 'status' => ComponentStatusEnum::major_outage, + ]); + $incident = Incident::factory()->create(['status' => IncidentStatusEnum::investigating]); + $incident->components()->attach($component->id); + + $page = $this->get(route('cachet.status-page')) + ->assertOk() + ->getContent(); + + expect($page) + ->toMatch('/getTextColorClasses(), '/').'[^"]*">\s*1 Incident<\/span>/') + ->not->toMatch('/Core services\s*<\\/h2>\s*]*>\s*Major outage<\\/span>/'); }); it('can display component tags', function () {