TenantAtlas/tests/Unit/TenantRequiredPermissionsFilteringTest.php
ahmido 05a604cfb6 Spec 076: Tenant Required Permissions (enterprise remediation UX) (#92)
Implements Spec 076 enterprise remediation UX for tenant required permissions.

Highlights
- Above-the-fold overview (impact + counts) with missing-first experience
- Feature-based grouping, filters/search, copy-to-clipboard for missing app/delegated permissions
- Tenant-scoped deny-as-not-found semantics; DB-only viewing
- Centralized badge semantics (no ad-hoc status mapping)

Testing
- Feature tests for default filters, grouping, copy output, and non-member 404 behavior.

Integration
- Adds deep links from verification checks to the Required permissions page.

Co-authored-by: Ahmed Darrazi <ahmeddarrazi@MacBookPro.fritz.box>
Reviewed-on: #92
2026-02-05 22:08:51 +00:00

88 lines
2.6 KiB
PHP

<?php
use App\Services\Intune\TenantRequiredPermissionsViewModelBuilder;
it('filters and sorts permissions by status, type, features, and search', function (): void {
$permissions = [
[
'key' => 'alpha.read',
'type' => 'application',
'description' => 'Alpha application permission',
'features' => ['backup'],
'status' => 'missing',
'details' => null,
],
[
'key' => 'beta.read',
'type' => 'delegated',
'description' => 'Beta delegated permission',
'features' => ['restore'],
'status' => 'granted',
'details' => null,
],
[
'key' => 'gamma.manage',
'type' => 'application',
'description' => 'Gamma restore permission',
'features' => ['backup', 'restore'],
'status' => 'error',
'details' => null,
],
];
$state = TenantRequiredPermissionsViewModelBuilder::normalizeFilterState([
'status' => 'all',
'type' => 'all',
'features' => [],
'search' => '',
]);
$filtered = TenantRequiredPermissionsViewModelBuilder::applyFilterState($permissions, $state);
expect(array_column($filtered, 'key'))->toBe([
'alpha.read',
'gamma.manage',
'beta.read',
]);
$missingState = TenantRequiredPermissionsViewModelBuilder::normalizeFilterState([
'status' => 'missing',
'type' => 'all',
'features' => ['backup'],
'search' => '',
]);
$missing = TenantRequiredPermissionsViewModelBuilder::applyFilterState($permissions, $missingState);
expect(array_column($missing, 'key'))->toBe([
'alpha.read',
'gamma.manage',
]);
$presentDelegatedState = TenantRequiredPermissionsViewModelBuilder::normalizeFilterState([
'status' => 'present',
'type' => 'delegated',
'features' => [],
'search' => '',
]);
$presentDelegated = TenantRequiredPermissionsViewModelBuilder::applyFilterState($permissions, $presentDelegatedState);
expect(array_column($presentDelegated, 'key'))->toBe([
'beta.read',
]);
$searchState = TenantRequiredPermissionsViewModelBuilder::normalizeFilterState([
'status' => 'all',
'type' => 'all',
'features' => [],
'search' => 'RESTORE',
]);
$search = TenantRequiredPermissionsViewModelBuilder::applyFilterState($permissions, $searchState);
expect(array_column($search, 'key'))->toBe([
'gamma.manage',
]);
});