actingAs($user); Filament::setTenant($tenant, true); $run = OperationRun::factory()->create([ 'tenant_id' => $tenant->getKey(), 'user_id' => $user->getKey(), 'initiator_name' => $user->name, 'type' => 'inventory.sync', 'status' => 'running', 'outcome' => 'pending', 'context' => ['scope' => 'all'], ]); /** @var OperationRunService $service */ $service = app(OperationRunService::class); expect($user->notifications()->count())->toBe(0); $service->updateRun( $run, status: 'completed', outcome: 'succeeded', summaryCounts: ['total' => 1], failures: [], ); expect($user->notifications()->count())->toBe(1); // Even if some downstream code re-applies a terminal update, we never spam. $service->updateRun( $run, status: 'completed', outcome: 'failed', summaryCounts: ['total' => 2], failures: [['code' => 'repeat.terminal', 'message' => 'should not notify again']], ); expect($user->notifications()->count())->toBe(1); })->group('ops-ux');