create(); [$owner, $tenant] = createUserWithTenant(tenant: $tenant, role: 'owner'); [$readonly] = createUserWithTenant(tenant: $tenant, user: User::factory()->create(), role: 'readonly'); $review = composeTenantReviewForTest($tenant, $owner); setTenantPanelContext($tenant); Livewire::actingAs($readonly) ->test(ViewTenantReview::class, ['record' => $review->getKey()]) ->assertActionVisible('export_executive_pack') ->assertActionDisabled('export_executive_pack'); }); it('queues the canonical executive-pack export once and records terminal summary counts on completion', function (): void { Notification::fake(); [$user, $tenant] = createUserWithTenant(role: 'owner'); $review = composeTenantReviewForTest($tenant, $user); setTenantPanelContext($tenant); $component = Livewire::actingAs($user) ->test(ViewTenantReview::class, ['record' => $review->getKey()]) ->callAction('export_executive_pack') ->assertNotified(); $pack = ReviewPack::query() ->where('tenant_review_id', (int) $review->getKey()) ->latest('id') ->firstOrFail(); $run = OperationRun::query()->findOrFail($pack->operation_run_id); expect($run->type)->toBe(OperationRunType::ReviewPackGenerate->value); $component ->callAction('export_executive_pack') ->assertNotified(); expect(ReviewPack::query()->where('tenant_review_id', (int) $review->getKey())->count())->toBe(1); $job = new GenerateReviewPackJob( reviewPackId: (int) $pack->getKey(), operationRunId: (int) $pack->operation_run_id, ); app()->call([$job, 'handle']); $run->refresh(); expect($run->status)->toBe(OperationRunStatus::Completed->value) ->and($run->outcome)->toBe(OperationRunOutcome::Succeeded->value) ->and($run->summary_counts)->toMatchArray([ 'created' => 1, 'finding_count' => (int) ($review->summary['finding_count'] ?? 0), 'report_count' => (int) ($review->summary['report_count'] ?? 0), 'operation_count' => (int) ($review->summary['operation_count'] ?? 0), ]); Notification::assertSentTo($user, OperationRunCompleted::class); });