create([ 'tenant_id' => $tenant->getKey(), 'name' => 'Test backup', 'item_count' => 0, ]); $item = BackupItem::factory()->create([ 'tenant_id' => $tenant->getKey(), 'backup_set_id' => $backupSet->getKey(), ]); $backupSet->update(['item_count' => $backupSet->items()->count()]); $opRun = OperationRun::create([ 'tenant_id' => $tenant->getKey(), 'user_id' => $user->getKey(), 'initiator_name' => $user->name, 'type' => 'backup_set.remove_policies', 'status' => 'queued', 'outcome' => 'pending', 'run_identity_hash' => 'remove-hash-1', 'context' => [ 'backup_set_id' => (int) $backupSet->getKey(), 'backup_item_ids' => [(int) $item->getKey()], ], ]); $this->mock(AuditLogger::class, function ($mock): void { $mock->shouldReceive('log')->zeroOrMoreTimes(); }); $job = new RemovePoliciesFromBackupSetJob( backupSetId: (int) $backupSet->getKey(), backupItemIds: [(int) $item->getKey()], initiatorUserId: (int) $user->getKey(), operationRun: $opRun, ); $job->handle(app(AuditLogger::class), app(BulkOperationService::class)); $this->assertDatabaseHas('notifications', [ 'notifiable_id' => $user->getKey(), 'notifiable_type' => $user->getMorphClass(), 'type' => DatabaseNotification::class, ]); $notification = $user->notifications()->latest('id')->first(); expect($notification)->not->toBeNull(); expect($notification->data['actions'][0]['url'] ?? null) ->toBe(OperationRunLinks::view($opRun, $tenant)); });