defaultSelectionPayload(); $computed = $sync->normalizeAndHashSelection($selectionPayload); $mockSync = \Mockery::mock(InventorySyncService::class); $mockSync ->shouldReceive('executeSelection') ->once() ->andReturn([ 'status' => 'success', 'had_errors' => false, 'error_codes' => [], 'error_context' => [], 'errors_count' => 0, 'items_observed_count' => 0, 'items_upserted_count' => 0, 'skipped_policy_types' => [], 'processed_policy_types' => $computed['selection']['policy_types'], 'failed_policy_types' => [], 'selection_hash' => $computed['selection_hash'], ]); /** @var OperationRunService $operationRuns */ $operationRuns = app(OperationRunService::class); $run = $operationRuns->ensureRun( tenant: $tenant, type: 'inventory_sync', inputs: $computed['selection'], initiator: $user, ); $job = new RunInventorySyncJob( tenantId: (int) $tenant->getKey(), userId: (int) $user->getKey(), operationRun: $run, ); expect($user->notifications()->count())->toBe(0); $job->handle($mockSync, app(AuditLogger::class), $operationRuns); $run->refresh(); expect($run->status)->toBe('completed'); expect($run->outcome)->toBe('succeeded'); expect($user->notifications()->count())->toBe(1); $this->assertDatabaseHas('notifications', [ 'notifiable_id' => $user->getKey(), 'notifiable_type' => $user->getMorphClass(), 'type' => OperationRunCompleted::class, ]); })->group('ops-ux'); it('does not persist terminal notifications for system-run inventory syncs without initiator', function (): void { [, $tenant] = createUserWithTenant(role: 'owner'); $sync = app(InventorySyncService::class); $run = $sync->syncNow($tenant, $sync->defaultSelectionPayload()); expect($run->status)->toBe('completed'); expect($tenant->users()->firstOrFail()->notifications()->count())->toBe(0); $this->assertDatabaseCount('notifications', 0); })->group('ops-ux');