create([ 'tenant_id' => null, 'external_id' => 'platform', 'name' => 'Platform', ]); }); it('computes single-tenant preflight counts', function () { $platformTenant = Tenant::query()->where('external_id', 'platform')->firstOrFail(); $tenant = Tenant::factory()->create([ 'workspace_id' => (int) $platformTenant->workspace_id, ]); Finding::factory()->create([ 'tenant_id' => (int) $tenant->getKey(), 'due_at' => null, ]); Finding::factory()->create([ 'tenant_id' => (int) $tenant->getKey(), ]); $service = app(FindingsLifecycleBackfillRunbookService::class); $result = $service->preflight(FindingsLifecycleBackfillScope::singleTenant((int) $tenant->getKey())); expect($result['total_count'])->toBe(2); expect($result['affected_count'])->toBe(1); }); it('computes all-tenants preflight counts scoped to the platform workspace', function () { $platformTenant = Tenant::query()->where('external_id', 'platform')->firstOrFail(); $tenantA = Tenant::factory()->create([ 'workspace_id' => (int) $platformTenant->workspace_id, ]); $tenantB = Tenant::factory()->create([ 'workspace_id' => (int) $platformTenant->workspace_id, ]); $otherTenant = Tenant::factory()->create(); Finding::factory()->create([ 'tenant_id' => (int) $tenantA->getKey(), 'due_at' => null, ]); Finding::factory()->create([ 'tenant_id' => (int) $tenantB->getKey(), 'sla_days' => null, ]); Finding::factory()->create([ 'tenant_id' => (int) $otherTenant->getKey(), 'due_at' => null, ]); $service = app(FindingsLifecycleBackfillRunbookService::class); $result = $service->preflight(FindingsLifecycleBackfillScope::allTenants()); expect($result['estimated_tenants'])->toBe(2); expect($result['total_count'])->toBe(2); expect($result['affected_count'])->toBe(2); });