Implements Spec 114 System Console Control Tower pages, widgets, triage actions, directory views, and enterprise polish (badges, repair workspace owners table, health indicator).
74 lines
2.3 KiB
PHP
74 lines
2.3 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
use App\Models\OperationRun;
|
|
use App\Models\PlatformUser;
|
|
use App\Support\Auth\PlatformCapabilities;
|
|
use App\Support\OperationRunOutcome;
|
|
use App\Support\OperationRunStatus;
|
|
use Carbon\CarbonImmutable;
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
|
|
uses(RefreshDatabase::class);
|
|
|
|
afterEach(function () {
|
|
CarbonImmutable::setTestNow();
|
|
});
|
|
|
|
it('forbids stuck page when platform.operations.view is missing', function () {
|
|
$platformUser = PlatformUser::factory()->create([
|
|
'capabilities' => [
|
|
PlatformCapabilities::ACCESS_SYSTEM_PANEL,
|
|
],
|
|
'is_active' => true,
|
|
]);
|
|
|
|
$this->actingAs($platformUser, 'platform')
|
|
->get('/system/ops/stuck')
|
|
->assertForbidden();
|
|
});
|
|
|
|
it('shows only queued/running runs that cross stuck thresholds', function () {
|
|
config()->set('tenantpilot.system_console.stuck_thresholds.queued_minutes', 10);
|
|
config()->set('tenantpilot.system_console.stuck_thresholds.running_minutes', 20);
|
|
|
|
CarbonImmutable::setTestNow(CarbonImmutable::parse('2026-02-27 10:00:00'));
|
|
|
|
$stuckQueued = OperationRun::factory()->create([
|
|
'status' => OperationRunStatus::Queued->value,
|
|
'outcome' => OperationRunOutcome::Pending->value,
|
|
'created_at' => now()->subMinutes(30),
|
|
'started_at' => null,
|
|
]);
|
|
|
|
$stuckRunning = OperationRun::factory()->create([
|
|
'status' => OperationRunStatus::Running->value,
|
|
'outcome' => OperationRunOutcome::Pending->value,
|
|
'created_at' => now()->subMinutes(25),
|
|
'started_at' => now()->subMinutes(21),
|
|
]);
|
|
|
|
$freshQueued = OperationRun::factory()->create([
|
|
'status' => OperationRunStatus::Queued->value,
|
|
'outcome' => OperationRunOutcome::Pending->value,
|
|
'created_at' => now()->subMinutes(5),
|
|
'started_at' => null,
|
|
]);
|
|
|
|
$platformUser = PlatformUser::factory()->create([
|
|
'capabilities' => [
|
|
PlatformCapabilities::ACCESS_SYSTEM_PANEL,
|
|
PlatformCapabilities::OPERATIONS_VIEW,
|
|
],
|
|
'is_active' => true,
|
|
]);
|
|
|
|
$this->actingAs($platformUser, 'platform')
|
|
->get('/system/ops/stuck')
|
|
->assertSuccessful()
|
|
->assertSee('#'.(int) $stuckQueued->getKey())
|
|
->assertSee('#'.(int) $stuckRunning->getKey())
|
|
->assertDontSee('#'.(int) $freshQueued->getKey());
|
|
});
|