TenantAtlas/apps/platform/tests/Unit/Filament/RestoreRunCreatePresenterDeterminismTest.php
Ahmed Darrazi a7897fa064
Some checks failed
PR Fast Feedback / fast-feedback (pull_request) Failing after 3m49s
Add product process flow for restore create
2026-05-26 02:03:14 +02:00

194 lines
6.2 KiB
PHP

<?php
declare(strict_types=1);
use App\Filament\Resources\RestoreRunResource\Presenters\RestoreRunCreatePresenter;
use App\Models\BackupItem;
use App\Models\BackupSet;
use App\Models\Policy;
use Illuminate\Foundation\Testing\RefreshDatabase;
uses(RefreshDatabase::class);
it('recomputes the restore create presenter contract from current database state', function (): void {
[$user, $tenant] = createUserWithTenant(role: 'owner');
$this->actingAs($user);
ensureDefaultProviderConnection($tenant, 'microsoft');
$policy = Policy::create([
'managed_environment_id' => (int) $tenant->getKey(),
'external_id' => 'spec332-presenter-policy',
'policy_type' => 'deviceConfiguration',
'display_name' => 'Spec332 Presenter Policy',
'platform' => 'windows',
'metadata' => [],
]);
$backupSet = BackupSet::factory()->create([
'managed_environment_id' => (int) $tenant->getKey(),
'name' => 'Spec332 Presenter Backup',
'status' => 'completed',
'item_count' => 1,
]);
$backupItem = BackupItem::factory()->create([
'managed_environment_id' => (int) $tenant->getKey(),
'backup_set_id' => (int) $backupSet->getKey(),
'policy_id' => (int) $policy->getKey(),
'policy_identifier' => $policy->external_id,
'policy_type' => $policy->policy_type,
'platform' => $policy->platform,
'payload' => [],
'assignments' => [],
'metadata' => [
'displayName' => 'Spec332 Metadata Only Policy',
'snapshot_source' => 'metadata_only',
'warnings' => ['metadata only fallback'],
],
]);
$wizardData = [
'backup_set_id' => (int) $backupSet->getKey(),
'scope_mode' => 'all',
'backup_item_ids' => [],
'group_mapping' => [],
];
$first = RestoreRunCreatePresenter::contract(
data: $wizardData,
currentStep: 1,
compactFlow: false,
tenant: $tenant,
user: $user,
);
$firstSummary = data_get($first, 'processFlow.steps.0.summary');
expect($firstSummary)
->toBeString()
->toContain('does not contain a usable captured item yet');
$backupItem->update([
'payload' => [
'id' => 'spec332-presenter-policy',
'displayName' => 'Spec332 Presenter Policy',
'settings' => ['foo' => 'bar'],
],
'metadata' => [
'displayName' => 'Spec332 Presenter Policy',
],
]);
$second = RestoreRunCreatePresenter::contract(
data: $wizardData,
currentStep: 1,
compactFlow: false,
tenant: $tenant,
user: $user,
);
$secondSummary = data_get($second, 'processFlow.steps.0.summary');
expect($secondSummary)
->toBeString()
->toContain('A usable source backup is selected for this restore draft.')
->not->toContain('does not contain a usable captured item yet');
});
it('does not leak presenter state between independent restore draft contracts', function (): void {
[$user, $tenant] = createUserWithTenant(role: 'owner');
$this->actingAs($user);
ensureDefaultProviderConnection($tenant, 'microsoft');
$policy = Policy::create([
'managed_environment_id' => (int) $tenant->getKey(),
'external_id' => 'spec332-presenter-policy-b',
'policy_type' => 'deviceConfiguration',
'display_name' => 'Spec332 Presenter Policy B',
'platform' => 'windows',
'metadata' => [],
]);
$metadataOnlyBackup = BackupSet::factory()->create([
'managed_environment_id' => (int) $tenant->getKey(),
'name' => 'Spec332 Presenter Metadata Backup',
'status' => 'completed',
'item_count' => 1,
]);
BackupItem::factory()->create([
'managed_environment_id' => (int) $tenant->getKey(),
'backup_set_id' => (int) $metadataOnlyBackup->getKey(),
'policy_id' => (int) $policy->getKey(),
'policy_identifier' => $policy->external_id,
'policy_type' => $policy->policy_type,
'platform' => $policy->platform,
'payload' => [],
'assignments' => [],
'metadata' => [
'displayName' => 'Spec332 Metadata Only Policy',
'snapshot_source' => 'metadata_only',
],
]);
$first = RestoreRunCreatePresenter::contract(
data: [
'backup_set_id' => (int) $metadataOnlyBackup->getKey(),
'scope_mode' => 'all',
'backup_item_ids' => [],
'group_mapping' => [],
],
currentStep: 1,
compactFlow: false,
tenant: $tenant,
user: $user,
);
expect(data_get($first, 'processFlow.steps.0.summary'))
->toBeString()
->toContain('does not contain a usable captured item yet');
$usableBackup = BackupSet::factory()->create([
'managed_environment_id' => (int) $tenant->getKey(),
'name' => 'Spec332 Presenter Usable Backup',
'status' => 'completed',
'item_count' => 1,
]);
BackupItem::factory()->create([
'managed_environment_id' => (int) $tenant->getKey(),
'backup_set_id' => (int) $usableBackup->getKey(),
'policy_id' => (int) $policy->getKey(),
'policy_identifier' => $policy->external_id,
'policy_type' => $policy->policy_type,
'platform' => $policy->platform,
'payload' => [
'id' => 'spec332-presenter-policy-b',
'displayName' => 'Spec332 Presenter Policy B',
'settings' => ['foo' => 'bar'],
],
'assignments' => [],
'metadata' => [
'displayName' => 'Spec332 Presenter Policy B',
],
]);
$second = RestoreRunCreatePresenter::contract(
data: [
'backup_set_id' => (int) $usableBackup->getKey(),
'scope_mode' => 'all',
'backup_item_ids' => [],
'group_mapping' => [],
],
currentStep: 1,
compactFlow: false,
tenant: $tenant,
user: $user,
);
expect(data_get($second, 'processFlow.steps.0.summary'))
->toBeString()
->toContain('A usable source backup is selected for this restore draft.')
->not->toContain('does not contain a usable captured item yet');
});