## Summary - replace the legacy Tenant and TenantMembership core models with ManagedEnvironment and ManagedEnvironmentMembership - propagate the managed environment naming and key changes across Filament resources, pages, controllers, jobs, models, and supporting runtime paths - add feature 279 spec artifacts and focused managed-environment test coverage for model behavior, route binding, panel context, authorization, and legacy guardrails ## Validation - `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/ManagedEnvironment/LegacyTenantCoreGuardTest.php tests/Feature/ManagedEnvironment/ManagedEnvironmentAuthorizationTest.php tests/Feature/ManagedEnvironment/ManagedEnvironmentPanelContextTest.php tests/Feature/ManagedEnvironment/ManagedEnvironmentRouteBindingTest.php tests/Unit/ManagedEnvironment/ManagedEnvironmentContextResolverTest.php tests/Unit/ManagedEnvironment/ManagedEnvironmentModelTest.php` - `cd apps/platform && ./vendor/bin/sail bin pint --dirty --format agent` ## Notes - branch pushed from commit `1123b122` - browser smoke test file was added but not run in this pass Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de> Reviewed-on: #335
58 lines
1.9 KiB
PHP
58 lines
1.9 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
use App\Models\AlertDelivery;
|
|
use App\Models\AlertDestination;
|
|
use App\Models\AlertRule;
|
|
use App\Services\Alerts\AlertDispatchService;
|
|
use App\Support\Workspaces\WorkspaceContext;
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
|
|
uses(RefreshDatabase::class);
|
|
|
|
it('writes a suppressed delivery when cooldown fingerprint matches', function (): void {
|
|
[, $tenant] = createUserWithTenant(role: 'owner');
|
|
|
|
$workspaceId = (int) $tenant->workspace_id;
|
|
session()->put(WorkspaceContext::SESSION_KEY, $workspaceId);
|
|
|
|
$destination = AlertDestination::factory()->create([
|
|
'workspace_id' => $workspaceId,
|
|
'type' => AlertDestination::TYPE_TEAMS_WEBHOOK,
|
|
'config' => ['webhook_url' => 'https://example.invalid/hook'],
|
|
]);
|
|
|
|
$rule = AlertRule::factory()->create([
|
|
'workspace_id' => $workspaceId,
|
|
'event_type' => AlertRule::EVENT_HIGH_DRIFT,
|
|
'minimum_severity' => 'high',
|
|
'cooldown_seconds' => 3600,
|
|
]);
|
|
$rule->destinations()->syncWithPivotValues([(int) $destination->getKey()], ['workspace_id' => $workspaceId]);
|
|
|
|
/** @var AlertDispatchService $dispatch */
|
|
$dispatch = app(AlertDispatchService::class);
|
|
|
|
$event = [
|
|
'event_type' => AlertRule::EVENT_HIGH_DRIFT,
|
|
'managed_environment_id' => (int) $tenant->getKey(),
|
|
'severity' => 'critical',
|
|
'fingerprint_key' => 'finding:123',
|
|
'title' => 'High drift detected',
|
|
'body' => 'Test drift',
|
|
];
|
|
|
|
$dispatch->dispatchEvent($rule->workspace, $event);
|
|
$dispatch->dispatchEvent($rule->workspace, $event);
|
|
|
|
$deliveries = AlertDelivery::query()
|
|
->where('workspace_id', $workspaceId)
|
|
->orderBy('id')
|
|
->get();
|
|
|
|
expect($deliveries)->toHaveCount(2);
|
|
expect($deliveries[0]->status)->toBe(AlertDelivery::STATUS_QUEUED);
|
|
expect($deliveries[1]->status)->toBe(AlertDelivery::STATUS_SUPPRESSED);
|
|
});
|