Implements Spec 098: workspace-level settings slices for Backup retention, Drift severity mapping, and Operations retention/threshold. Spec - specs/098-settings-slices-v1-backup-drift-ops/spec.md What changed - Workspace Settings page: grouped Backup/Drift/Operations sections, unset-input UX w/ helper text, per-setting reset actions (confirmed) - Settings registry: adds/updates validation + normalization (incl. drift severity mapping normalization to lowercase) - Backup retention: adds workspace default + floor clamp; job clamps effective keep-last up to floor - Drift findings: optional workspace severity mapping; adds `critical` severity support + badge mapping - Operations pruning: retention computed per workspace via settings; scheduler unchanged; stuck threshold is storage-only Safety / Compliance notes - Filament v5 / Livewire v4: no Livewire v3 usage; relies on existing Filament v5 + Livewire v4 stack - Provider registration unchanged (Laravel 11+/12 uses bootstrap/providers.php) - Destructive actions: per-setting reset uses Filament actions with confirmation - Global search: not affected (no resource changes) - Assets: no new assets registered; no `filament:assets` changes Tests - vendor/bin/sail artisan test --compact tests/Feature/SettingsFoundation/WorkspaceSettingsManageTest.php \ tests/Feature/SettingsFoundation/WorkspaceSettingsViewOnlyTest.php \ tests/Feature/BackupScheduling/BackupScheduleLifecycleTest.php \ tests/Feature/Drift/DriftPolicySnapshotDriftDetectionTest.php \ tests/Feature/Scheduling/PruneOldOperationRunsScheduleTest.php \ tests/Unit/Badges/FindingBadgesTest.php Formatting - vendor/bin/sail bin pint --dirty Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de> Reviewed-on: #120
35 lines
1.2 KiB
PHP
35 lines
1.2 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
use App\Support\Badges\BadgeCatalog;
|
|
use App\Support\Badges\BadgeDomain;
|
|
|
|
it('maps finding severity values to canonical badge semantics', function (): void {
|
|
$low = BadgeCatalog::spec(BadgeDomain::FindingSeverity, 'low');
|
|
expect($low->label)->toBe('Low');
|
|
expect($low->color)->toBe('gray');
|
|
|
|
$medium = BadgeCatalog::spec(BadgeDomain::FindingSeverity, 'medium');
|
|
expect($medium->label)->toBe('Medium');
|
|
expect($medium->color)->toBe('warning');
|
|
|
|
$high = BadgeCatalog::spec(BadgeDomain::FindingSeverity, 'high');
|
|
expect($high->label)->toBe('High');
|
|
expect($high->color)->toBe('danger');
|
|
|
|
$critical = BadgeCatalog::spec(BadgeDomain::FindingSeverity, 'critical');
|
|
expect($critical->label)->toBe('Critical');
|
|
expect($critical->color)->toBe('danger');
|
|
});
|
|
|
|
it('maps finding status values to canonical badge semantics', function (): void {
|
|
$new = BadgeCatalog::spec(BadgeDomain::FindingStatus, 'new');
|
|
expect($new->label)->toBe('New');
|
|
expect($new->color)->toBe('warning');
|
|
|
|
$acknowledged = BadgeCatalog::spec(BadgeDomain::FindingStatus, 'acknowledged');
|
|
expect($acknowledged->label)->toBe('Acknowledged');
|
|
expect($acknowledged->color)->toBe('gray');
|
|
});
|