'tenant-idempotency', 'name' => 'Tenant Idempotency', 'metadata' => [], ]); $tenant->makeCurrent(); $policy = Policy::create([ 'tenant_id' => $tenant->id, 'external_id' => 'policy-1', 'policy_type' => 'unknownPreviewOnlyType', 'display_name' => 'Preview-only 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'], ]); $data = [ 'backup_set_id' => $backupSet->id, 'scope_mode' => 'selected', 'backup_item_ids' => [$backupItem->id], 'group_mapping' => [], 'is_dry_run' => false, 'check_summary' => [ 'blocking' => 0, 'warning' => 0, 'safe' => 1, 'has_blockers' => false, ], 'check_results' => [], 'checks_ran_at' => now()->toIso8601String(), 'preview_ran_at' => now()->toIso8601String(), 'acknowledged_impact' => true, 'tenant_confirm' => 'Tenant Idempotency', ]; $first = RestoreRunResource::createRestoreRun($data); $second = RestoreRunResource::createRestoreRun($data); expect($first->id)->toBe($second->id); expect(RestoreRun::count())->toBe(1); $run = RestoreRun::query()->first(); expect($run)->not->toBeNull(); expect($run->status)->toBe(RestoreRunStatus::Queued->value); Bus::assertDispatchedTimes(ExecuteRestoreRunJob::class, 1); });