- ReviewPackService: generate, fingerprint dedupe, signed download URL - GenerateReviewPackJob: 12-step pipeline, ZIP assembly, failure handling - ReviewPackDownloadController: signed URL streaming with SHA-256 header - ReviewPackResource: list/view pages, generate/expire/download actions - TenantReviewPackCard: dashboard widget with 5 display states - ReviewPackPolicy: RBAC via REVIEW_PACK_VIEW/MANAGE capabilities - PruneReviewPacksCommand: retention automation + hard-delete option - ReviewPackStatusNotification: database channel, ready/failed payloads - Schedule: daily prune + entra admin roles, posture:dispatch deferred - AlertRuleResource: hide sla_due from dropdown (backward compat kept) - 59 passing tests across 7 test files (1 skipped: posture deferred) - All 36 tasks completed per tasks.md
42 lines
1.6 KiB
PHP
42 lines
1.6 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
use Illuminate\Console\Scheduling\Schedule;
|
|
|
|
it('schedules review pack prune command daily without overlapping', function (): void {
|
|
/** @var Schedule $schedule */
|
|
$schedule = app(Schedule::class);
|
|
|
|
$event = collect($schedule->events())
|
|
->first(fn ($event) => str_contains($event->command ?? '', 'tenantpilot:review-pack:prune'));
|
|
|
|
expect($event)->not->toBeNull('review-pack:prune should be scheduled');
|
|
expect($event->withoutOverlapping)->toBeTrue();
|
|
});
|
|
|
|
it('schedules entra admin roles scan daily without overlapping', function (): void {
|
|
/** @var Schedule $schedule */
|
|
$schedule = app(Schedule::class);
|
|
|
|
$event = collect($schedule->events())
|
|
->first(fn ($event) => ($event->description ?? null) === 'entra-admin-roles:scan');
|
|
|
|
expect($event)->not->toBeNull('entra-admin-roles:scan should be scheduled');
|
|
expect($event->withoutOverlapping)->toBeTrue();
|
|
});
|
|
|
|
it('documents posture:dispatch deferral', function (): void {
|
|
// FR-015: tenantpilot:posture:dispatch command infrastructure does not yet exist.
|
|
// The schedule entry will be added once the command is created.
|
|
// See specs/109-review-pack-export/research.md §7 for rationale.
|
|
|
|
/** @var Schedule $schedule */
|
|
$schedule = app(Schedule::class);
|
|
|
|
$event = collect($schedule->events())
|
|
->first(fn ($event) => str_contains($event->command ?? '', 'posture:dispatch'));
|
|
|
|
expect($event)->toBeNull('posture:dispatch not yet implemented — deferred per FR-015');
|
|
})->skip('posture:dispatch command deferred — see specs/109 research.md §7');
|