Files
schulos/src/lib/role-access.test.ts
T
2026-08-02 12:55:40 +02:00

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();
}
});
});