39 lines
1.4 KiB
TypeScript
39 lines
1.4 KiB
TypeScript
import { describe, expect, test } from 'bun:test';
|
|
import type { ViewName } from './store';
|
|
import { canAccessView, filterSectionsForRole, filterViewsForRole, getFallbackView } from './role-access';
|
|
|
|
const mixedItems = [
|
|
{ key: 'dashboard' as const },
|
|
{ key: 'parent-portal' as ViewName },
|
|
{ key: 'classes' as const },
|
|
];
|
|
|
|
describe('role access', () => {
|
|
test('hides teacher-inaccessible views from a mixed menu', () => {
|
|
expect(filterViewsForRole('TEACHER', mixedItems).map(({ key }) => key)).toEqual(['dashboard', 'classes']);
|
|
});
|
|
|
|
test('removes empty sections for parent, student, and teacher', () => {
|
|
const sections = [
|
|
{ id: 'visible', items: [{ key: 'dashboard' as const }] },
|
|
{ id: 'hidden', items: [{ key: 'districts' as ViewName }] },
|
|
];
|
|
|
|
for (const role of ['PARENT', 'STUDENT', 'TEACHER'] as const) {
|
|
expect(filterSectionsForRole(role, sections).map(({ id }) => id)).toEqual(['visible']);
|
|
}
|
|
});
|
|
|
|
test('falls back to dashboard for an inaccessible active view', () => {
|
|
expect(canAccessView('PARENT', 'student-detail')).toBeFalse();
|
|
expect(getFallbackView('PARENT')).toBe('dashboard');
|
|
});
|
|
|
|
test('keeps every view available to administrators', () => {
|
|
for (const view of mixedItems.map(({ key }) => key)) {
|
|
expect(canAccessView('SCHOOL_ADMIN', view)).toBeTrue();
|
|
expect(canAccessView('SUPER_ADMIN', view)).toBeTrue();
|
|
}
|
|
});
|
|
});
|