create(); $schedule = BackupSchedule::create([ 'tenant_id' => $tenant->id, 'name' => 'Daily', 'is_enabled' => true, 'timezone' => 'UTC', 'frequency' => 'daily', 'time_of_day' => '10:00:00', 'days_of_week' => null, 'policy_types' => ['deviceConfiguration'], 'include_foundations' => true, 'retention_keep_last' => 30, 'last_run_at' => null, 'last_run_status' => null, 'next_run_at' => null, ]); $startedAt = CarbonImmutable::parse('2026-01-01 00:00:00', 'UTC'); $finishedAt = CarbonImmutable::parse('2026-01-01 00:00:05', 'UTC'); $scheduleRun = BackupScheduleRun::create([ 'backup_schedule_id' => $schedule->id, 'tenant_id' => $tenant->id, 'scheduled_for' => CarbonImmutable::parse('2026-01-01 00:00:00', 'UTC'), 'started_at' => $startedAt, 'finished_at' => $finishedAt, 'status' => BackupScheduleRun::STATUS_SUCCESS, 'summary' => [ 'policies_total' => 5, 'policies_backed_up' => 18, 'sync_failures' => [], ], 'error_code' => null, 'error_message' => null, 'backup_set_id' => null, ]); $operationRun = OperationRun::create([ 'tenant_id' => $tenant->id, 'user_id' => null, 'initiator_name' => 'System', 'type' => 'backup_schedule.run_now', 'status' => 'queued', 'outcome' => 'pending', 'run_identity_hash' => hash('sha256', 'backup_schedule.run_now|'.$scheduleRun->id), 'summary_counts' => [], 'failure_summary' => [], 'context' => [ 'backup_schedule_id' => (int) $schedule->id, 'backup_schedule_run_id' => (int) $scheduleRun->id, ], ]); $this->artisan('tenantpilot:operation-runs:reconcile-backup-schedules', [ '--tenant' => [$tenant->id], '--older-than' => 0, ])->assertSuccessful(); $operationRun->refresh(); expect($operationRun->status)->toBe('completed'); expect($operationRun->outcome)->toBe('succeeded'); expect($operationRun->failure_summary)->toBe([]); expect($operationRun->started_at?->format('Y-m-d H:i:s'))->toBe($startedAt->format('Y-m-d H:i:s')); expect($operationRun->completed_at?->format('Y-m-d H:i:s'))->toBe($finishedAt->format('Y-m-d H:i:s')); expect($operationRun->summary_counts)->toMatchArray([ 'backup_schedule_id' => (int) $schedule->id, 'backup_schedule_run_id' => (int) $scheduleRun->id, 'policies_total' => 5, 'policies_backed_up' => 18, 'sync_failures' => 0, ]); });