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' => 0, 'quiet_hours_enabled' => true, 'quiet_hours_start' => '22:00', 'quiet_hours_end' => '06:00', 'quiet_hours_timezone' => 'UTC', ]); $rule->destinations()->syncWithPivotValues([(int) $destination->getKey()], ['workspace_id' => $workspaceId]); /** @var AlertDispatchService $dispatch */ $dispatch = app(AlertDispatchService::class); $dispatch->dispatchEvent($rule->workspace, [ 'event_type' => AlertRule::EVENT_HIGH_DRIFT, 'tenant_id' => (int) $tenant->getKey(), 'severity' => 'critical', 'fingerprint_key' => 'finding:quiet-1', 'title' => 'High drift detected', 'body' => 'Quiet hours test', ]); $delivery = AlertDelivery::query()->where('workspace_id', $workspaceId)->first(); expect($delivery)->not->toBeNull(); expect($delivery->status)->toBe(AlertDelivery::STATUS_DEFERRED); expect($delivery->send_after)->not->toBeNull(); expect($delivery->send_after?->greaterThan($now))->toBeTrue(); } finally { CarbonImmutable::setTestNow(); } });