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