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
88 lines
2.6 KiB
PHP
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',
|
|
]);
|
|
});
|