actingAs($user); $tenant->makeCurrent(); Filament::setTenant($tenant, true); $run = OperationRun::factory()->create([ 'tenant_id' => (int) $tenant->getKey(), 'user_id' => (int) $user->getKey(), 'initiator_name' => $user->name, 'type' => 'inventory_sync', 'status' => 'queued', 'outcome' => 'pending', 'context' => [ 'reason_code' => 'missing_capability', 'blocked_by' => 'queued_execution_legitimacy', ], ]); app(OperationRunService::class)->updateRun( $run, status: 'completed', outcome: 'blocked', summaryCounts: [ 'total' => 2, 'processed' => 0, 'failed' => 0, ], failures: [[ 'code' => 'operation.blocked', 'reason_code' => 'missing_capability', 'message' => 'Operation blocked because the initiating actor no longer has the required capability.', ]], ); $this->assertDatabaseHas('notifications', [ 'notifiable_id' => $user->getKey(), 'notifiable_type' => $user->getMorphClass(), 'type' => OperationRunCompleted::class, 'data->title' => 'Inventory sync blocked by prerequisite', ]); $notification = $user->notifications()->latest('id')->first(); expect($notification)->not->toBeNull() ->and($notification->data['body'] ?? null)->toContain('Blocked by prerequisite.') ->and($notification->data['body'] ?? null)->toContain('required capability') ->and($notification->data['body'] ?? null)->toContain('Review the blocked prerequisite before retrying.') ->and($notification->data['body'] ?? null)->toContain('Total: 2'); });