browser()->timeout(20_000); uses(RefreshDatabase::class); function spec202SmokeLoginUrl(User $user, Tenant $tenant, string $redirect = ''): string { return route('admin.local.smoke-login', array_filter([ 'email' => $user->email, 'tenant' => $tenant->external_id, 'workspace' => $tenant->workspace->slug, 'redirect' => $redirect, ], static fn (?string $value): bool => filled($value))); } it('smokes governance subject scope create, edit, and view surfaces', function (): void { [$user, $tenant] = createUserWithTenant( role: 'owner', workspaceRole: 'manager', ensureDefaultMicrosoftProviderConnection: false, ); $legacyProfile = BaselineProfile::factory()->active()->create([ 'workspace_id' => (int) $tenant->workspace_id, 'name' => 'Spec202 Legacy Browser Baseline', ]); DB::table('baseline_profiles') ->where('id', (int) $legacyProfile->getKey()) ->update([ 'scope_jsonb' => json_encode([ 'policy_types' => ['deviceConfiguration'], 'foundation_types' => ['assignmentFilter'], ], JSON_THROW_ON_ERROR), 'updated_at' => now(), ]); $captureProfile = BaselineProfile::factory()->active()->create([ 'workspace_id' => (int) $tenant->workspace_id, 'name' => 'Spec202 Capture Browser Baseline', 'scope_jsonb' => ['policy_types' => ['deviceConfiguration'], 'foundation_types' => []], ]); $compareProfile = BaselineProfile::factory()->active()->create([ 'workspace_id' => (int) $tenant->workspace_id, 'name' => 'Spec202 Compare Browser Baseline', 'scope_jsonb' => ['policy_types' => ['deviceConfiguration'], 'foundation_types' => []], ]); $snapshot = BaselineSnapshot::factory()->complete()->create([ 'workspace_id' => (int) $tenant->workspace_id, 'baseline_profile_id' => (int) $compareProfile->getKey(), ]); $compareProfile->update(['active_snapshot_id' => (int) $snapshot->getKey()]); BaselineTenantAssignment::factory()->create([ 'workspace_id' => (int) $tenant->workspace_id, 'tenant_id' => (int) $tenant->getKey(), 'baseline_profile_id' => (int) $compareProfile->getKey(), ]); visit(spec202SmokeLoginUrl($user, $tenant)) ->waitForText('Dashboard') ->assertNoJavaScriptErrors() ->assertNoConsoleLogs(); visit(BaselineProfileResource::getUrl('create', panel: 'admin')) ->waitForText('Governed subject summary') ->assertNoJavaScriptErrors() ->assertNoConsoleLogs() ->assertSee('Support readiness') ->assertSee('Selection feedback'); visit(BaselineProfileResource::getUrl('edit', ['record' => $legacyProfile], panel: 'admin')) ->waitForText('Governed subject summary') ->assertNoJavaScriptErrors() ->assertNoConsoleLogs() ->assertSee('Support readiness') ->assertSee('Device Configuration') ->assertSee('Assignment Filter') ->assertSee('This Intune-first selection will be saved forward as canonical governed-subject scope V2.'); visit(BaselineProfileResource::getUrl('view', ['record' => $captureProfile], panel: 'admin')) ->waitForText('Governed subject summary') ->assertNoJavaScriptErrors() ->assertNoConsoleLogs() ->assertSee('Support readiness') ->assertSee('Capture baseline') ->click('Capture baseline') ->waitForText('Source Tenant') ->click('Cancel') ->assertSee('Capture baseline'); visit(BaselineProfileResource::getUrl('view', ['record' => $compareProfile], panel: 'admin')) ->waitForText('Governed subject summary') ->assertNoJavaScriptErrors() ->assertNoConsoleLogs() ->assertSee('Support readiness') ->assertSee('Normalization lineage') ->assertSee('Canonical governed-subject scope V2 is already stored for this baseline profile.') ->assertSee('Compare now') ->click('Compare now') ->waitForText('Target Tenant') ->click('Cancel') ->assertSee('Compare now'); }); it('smokes tolerant invalid scope rendering on the baseline detail surface', function (): void { [$user, $tenant] = createUserWithTenant( role: 'owner', workspaceRole: 'manager', ensureDefaultMicrosoftProviderConnection: false, ); $invalidProfile = BaselineProfile::factory()->active()->create([ 'workspace_id' => (int) $tenant->workspace_id, 'name' => 'Spec202 Invalid Browser Baseline', ]); DB::table('baseline_profiles') ->where('id', (int) $invalidProfile->getKey()) ->update([ 'scope_jsonb' => json_encode([ 'version' => 2, 'entries' => [ [ 'domain_key' => 'platform_foundation', 'subject_class' => 'configuration_resource', 'subject_type_keys' => ['intuneRoleAssignment'], 'filters' => [], ], ], ], JSON_THROW_ON_ERROR), 'updated_at' => now(), ]); visit(spec202SmokeLoginUrl($user, $tenant)) ->waitForText('Dashboard') ->assertNoJavaScriptErrors() ->assertNoConsoleLogs(); visit(BaselineProfileResource::getUrl('view', ['record' => $invalidProfile], panel: 'admin')) ->waitForText('Governed subject summary') ->assertNoJavaScriptErrors() ->assertNoConsoleLogs() ->assertSee('Invalid governed subject selection.') ->assertSee('Support readiness') ->assertSee('Capture: blocked. Compare: blocked.') ->assertSee('Stored scope is invalid and must be repaired before capture or compare can continue.'); });