import { describe, expect, it } from 'vitest'; import { canWrite, groupsFromClaim, roleFromGroups } from './roles'; describe('roleFromGroups', () => { it('promotes a member of the configured group', () => { expect(roleFromGroups(['horaires-admins'], 'horaires-admins')).toBe('admin'); }); it('leaves everyone else read-only', () => { expect(roleFromGroups(['autre-groupe'], 'horaires-admins')).toBe('viewer'); expect(roleFromGroups([], 'horaires-admins')).toBe('viewer'); }); it('finds the group among several', () => { expect(roleFromGroups(['a', 'horaires-admins', 'b'], 'horaires-admins')).toBe('admin'); }); it('survives a capitalisation or spacing mismatch', () => { expect(roleFromGroups(['Horaires-Admins'], 'horaires-admins')).toBe('admin'); expect(roleFromGroups([' horaires-admins '], 'horaires-admins')).toBe('admin'); expect(roleFromGroups(['horaires-admins'], ' HORAIRES-ADMINS ')).toBe('admin'); }); it('never promotes when no group is configured', () => { // An empty variable must not turn every visitor into an administrator. expect(roleFromGroups(['horaires-admins'], '')).toBe('viewer'); expect(roleFromGroups([''], ' ')).toBe('viewer'); }); it('does not match a partial group name', () => { expect(roleFromGroups(['horaires-admins-readonly'], 'horaires-admins')).toBe('viewer'); expect(roleFromGroups(['admins'], 'horaires-admins')).toBe('viewer'); }); }); describe('groupsFromClaim', () => { it('accepts a list of strings', () => { expect(groupsFromClaim(['a', 'b'])).toEqual(['a', 'b']); }); it('drops anything that is not a string', () => { // The claim comes from an external system; it is data, not a promise. expect(groupsFromClaim(['a', 1, null, { name: 'b' }, 'c'])).toEqual(['a', 'c']); }); it('returns nothing for a missing or malformed claim', () => { expect(groupsFromClaim(undefined)).toEqual([]); expect(groupsFromClaim(null)).toEqual([]); expect(groupsFromClaim('horaires-admins')).toEqual([]); expect(groupsFromClaim({ groups: ['a'] })).toEqual([]); }); }); describe('canWrite', () => { it('is true only for an administrator', () => { expect(canWrite('admin')).toBe(true); expect(canWrite('viewer')).toBe(false); expect(canWrite(undefined)).toBe(false); }); });