53 lines
1.8 KiB
JavaScript
53 lines
1.8 KiB
JavaScript
import assert from 'node:assert/strict';
|
|
import {
|
|
ADMIN_NAVIGATION,
|
|
firstAuthorizedPath,
|
|
isNavigationAllowed,
|
|
pathForMenu,
|
|
resolveAuthorizedPath
|
|
} from '../src/navigation.mjs';
|
|
|
|
assert.deepEqual(
|
|
ADMIN_NAVIGATION.map(({ path }) => path),
|
|
['/overview', '/stores', '/orders', '/payments', '/third-party', '/people',
|
|
'/cleaning', '/devices', '/apps', '/content', '/franchise', '/system']
|
|
);
|
|
assert.equal(pathForMenu('platformApps'), '/apps');
|
|
assert.equal(pathForMenu('thirdParty'), '/third-party');
|
|
|
|
const storeOperator = {
|
|
roles: ['STORE_ADMIN'],
|
|
capabilities: ['store.operation.read'],
|
|
menus: ['overview', 'stores', 'orders', 'thirdParty']
|
|
};
|
|
assert.equal(resolveAuthorizedPath(storeOperator, 'orders'), '/orders');
|
|
assert.equal(resolveAuthorizedPath(storeOperator, 'system'), '/overview');
|
|
assert.equal(firstAuthorizedPath(storeOperator), '/overview');
|
|
|
|
const forgedSystemMenu = {
|
|
roles: ['STORE_ADMIN'],
|
|
capabilities: ['store.operation.read'],
|
|
menus: ['system']
|
|
};
|
|
const systemNavigation = ADMIN_NAVIGATION.find(({ menuKey }) => menuKey === 'system');
|
|
assert.ok(systemNavigation);
|
|
assert.equal(isNavigationAllowed(forgedSystemMenu, systemNavigation), false);
|
|
assert.equal(firstAuthorizedPath(forgedSystemMenu), null);
|
|
|
|
const cleaner = {
|
|
roles: ['CLEANER'],
|
|
capabilities: ['cleaning.task.read'],
|
|
menus: ['cleaning']
|
|
};
|
|
assert.equal(resolveAuthorizedPath(cleaner, 'cleaning'), '/cleaning');
|
|
assert.equal(resolveAuthorizedPath(cleaner, 'devices'), '/cleaning');
|
|
|
|
const platformAdmin = {
|
|
roles: ['PLATFORM_ADMIN'],
|
|
capabilities: [],
|
|
menus: ADMIN_NAVIGATION.map(({ menuKey }) => menuKey)
|
|
};
|
|
assert.equal(resolveAuthorizedPath(platformAdmin, 'system'), '/system');
|
|
|
|
console.log('PASS: M08-D-R1 deep links, menu/capability guards and refresh fallbacks are deterministic.');
|