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' => 'queued', 'outcome' => 'pending', 'context' => ['scope' => 'all'], ]); /** @var OperationRunService $service */ $service = app(OperationRunService::class); $service->updateRun( $run, status: 'completed', outcome: 'succeeded', summaryCounts: ['total' => 1], failures: [], ); $notification = $user->notifications()->latest('id')->first(); expect($notification)->not->toBeNull(); expect($notification->data['actions'][0]['url'] ?? null) ->toBe(OperationRunLinks::view($run, $tenant)); })->group('ops-ux'); it('does not link to legacy bulk run resources in status-change notifications', function (): void { [$user, $tenant] = createUserWithTenant(role: 'owner'); $run = OperationRun::factory()->create([ 'tenant_id' => $tenant->getKey(), 'user_id' => $user->getKey(), 'initiator_name' => $user->name, 'type' => 'policy.delete', 'status' => 'queued', 'outcome' => 'pending', 'context' => ['operation' => ['type' => 'policy.delete']], ]); $user->notify(new RunStatusChangedNotification([ 'tenant_id' => (int) $tenant->getKey(), 'run_type' => 'bulk_operation', 'run_id' => (int) $run->getKey(), 'status' => 'completed', ])); $notification = $user->notifications()->latest('id')->first(); expect($notification)->not->toBeNull(); $url = $notification->data['actions'][0]['url'] ?? null; expect($url)->toBe(OperationRunLinks::view($run, $tenant)); expect((string) $url)->not->toContain('bulk-operation-runs'); })->group('ops-ux');