'tenant-1', 'name' => 'Tenant One', 'metadata' => [], ]); $tenant->makeCurrent(); $policy = Policy::create([ 'tenant_id' => $tenant->id, 'external_id' => 'policy-1', 'policy_type' => 'deviceConfiguration', 'display_name' => 'Device Config Policy', 'platform' => 'windows', ]); $backupSet = BackupSet::create([ 'tenant_id' => $tenant->id, 'name' => 'Backup', 'status' => 'completed', 'item_count' => 1, ]); $backupItem = BackupItem::create([ 'tenant_id' => $tenant->id, 'backup_set_id' => $backupSet->id, 'policy_id' => $policy->id, 'policy_identifier' => $policy->external_id, 'policy_type' => $policy->policy_type, 'platform' => $policy->platform, 'payload' => ['id' => $policy->external_id], 'metadata' => [ 'displayName' => 'Backup Policy', ], ]); $user = User::factory()->create([ 'email' => 'tester@example.com', 'name' => 'Tester', ]); $this->actingAs($user); $user->tenants()->syncWithoutDetaching([ $tenant->getKey() => ['role' => 'owner'], ]); Filament::setTenant($tenant, true); Livewire::test(CreateRestoreRun::class) ->fillForm([ 'backup_set_id' => $backupSet->id, ]) ->goToNextWizardStep() ->fillForm([ 'scope_mode' => 'selected', 'backup_item_ids' => [$backupItem->id], ]) ->goToNextWizardStep() ->callFormComponentAction('check_results', 'run_restore_checks') ->goToNextWizardStep() ->callFormComponentAction('preview_diffs', 'run_restore_preview') ->goToNextWizardStep() ->fillForm([ 'is_dry_run' => false, ]) ->call('create') ->assertHasFormErrors(['acknowledged_impact', 'tenant_confirm']); expect(RestoreRun::count())->toBe(0); }); test('restore run wizard queues execution when gates are satisfied', function () { Bus::fake(); $tenant = Tenant::create([ 'tenant_id' => 'tenant-2', 'name' => 'Tenant Two', 'metadata' => [], ]); $tenant->makeCurrent(); $policy = Policy::create([ 'tenant_id' => $tenant->id, 'external_id' => 'policy-2', 'policy_type' => 'deviceConfiguration', 'display_name' => 'Device Config Policy', 'platform' => 'windows', ]); $backupSet = BackupSet::create([ 'tenant_id' => $tenant->id, 'name' => 'Backup', 'status' => 'completed', 'item_count' => 1, ]); $backupItem = BackupItem::create([ 'tenant_id' => $tenant->id, 'backup_set_id' => $backupSet->id, 'policy_id' => $policy->id, 'policy_identifier' => $policy->external_id, 'policy_type' => $policy->policy_type, 'platform' => $policy->platform, 'payload' => ['id' => $policy->external_id], 'metadata' => [ 'displayName' => 'Backup Policy', ], ]); $user = User::factory()->create([ 'email' => 'executor@example.com', 'name' => 'Executor', ]); $this->actingAs($user); $user->tenants()->syncWithoutDetaching([ $tenant->getKey() => ['role' => 'owner'], ]); Filament::setTenant($tenant, true); Livewire::test(CreateRestoreRun::class) ->fillForm([ 'backup_set_id' => $backupSet->id, ]) ->goToNextWizardStep() ->fillForm([ 'scope_mode' => 'selected', 'backup_item_ids' => [$backupItem->id], ]) ->goToNextWizardStep() ->callFormComponentAction('check_results', 'run_restore_checks') ->goToNextWizardStep() ->callFormComponentAction('preview_diffs', 'run_restore_preview') ->goToNextWizardStep() ->fillForm([ 'is_dry_run' => false, 'acknowledged_impact' => true, 'tenant_confirm' => 'Tenant Two', ]) ->call('create') ->assertHasNoFormErrors(); $run = RestoreRun::query()->latest('id')->first(); expect($run)->not->toBeNull(); expect($run->status)->toBe(RestoreRunStatus::Queued->value); expect($run->is_dry_run)->toBeFalse(); expect($run->metadata['confirmed_by'] ?? null)->toBe('executor@example.com'); expect($run->metadata['confirmed_at'] ?? null)->toBeString(); Bus::assertDispatched(ExecuteRestoreRunJob::class); });