Couverture des processors (RefreshToken, RequestPasswordReset, ResetPassword, SwitchRole, UpdateUserRoles), des query handlers (HasGradesInPeriod, HasStudentsInClass), des messaging handlers (SendActivationConfirmation, SendPasswordResetEmail), et côté frontend des modules auth, roles, monitoring, types et E2E tokens.
130 lines
4.4 KiB
TypeScript
130 lines
4.4 KiB
TypeScript
import { describe, it, expect } from 'vitest';
|
|
import { SCHOOL_LEVELS, SCHOOL_LEVEL_OPTIONS } from '$lib/constants/schoolLevels';
|
|
import type { SchoolLevel } from '$lib/constants/schoolLevels';
|
|
|
|
/**
|
|
* Unit tests for the school levels constants (schoolLevels.ts).
|
|
*
|
|
* Verifies the complete list of levels matches the Education Nationale
|
|
* reference, the correct ordering from CP to Terminale, and the
|
|
* SCHOOL_LEVEL_OPTIONS formatting for select/dropdown components.
|
|
*/
|
|
|
|
describe('schoolLevels constants', () => {
|
|
// ==========================================================================
|
|
// SCHOOL_LEVELS
|
|
// ==========================================================================
|
|
describe('SCHOOL_LEVELS', () => {
|
|
it('should contain exactly 12 levels', () => {
|
|
expect(SCHOOL_LEVELS).toHaveLength(12);
|
|
});
|
|
|
|
it('should contain all primary school levels (CP to CM2)', () => {
|
|
expect(SCHOOL_LEVELS).toContain('CP');
|
|
expect(SCHOOL_LEVELS).toContain('CE1');
|
|
expect(SCHOOL_LEVELS).toContain('CE2');
|
|
expect(SCHOOL_LEVELS).toContain('CM1');
|
|
expect(SCHOOL_LEVELS).toContain('CM2');
|
|
});
|
|
|
|
it('should contain all college levels (6eme to 3eme)', () => {
|
|
expect(SCHOOL_LEVELS).toContain('6ème');
|
|
expect(SCHOOL_LEVELS).toContain('5ème');
|
|
expect(SCHOOL_LEVELS).toContain('4ème');
|
|
expect(SCHOOL_LEVELS).toContain('3ème');
|
|
});
|
|
|
|
it('should contain all lycee levels (2nde, 1ere, Terminale)', () => {
|
|
expect(SCHOOL_LEVELS).toContain('2nde');
|
|
expect(SCHOOL_LEVELS).toContain('1ère');
|
|
expect(SCHOOL_LEVELS).toContain('Terminale');
|
|
});
|
|
|
|
it('should be ordered from CP to Terminale', () => {
|
|
const expectedOrder = [
|
|
'CP',
|
|
'CE1',
|
|
'CE2',
|
|
'CM1',
|
|
'CM2',
|
|
'6ème',
|
|
'5ème',
|
|
'4ème',
|
|
'3ème',
|
|
'2nde',
|
|
'1ère',
|
|
'Terminale'
|
|
];
|
|
expect([...SCHOOL_LEVELS]).toEqual(expectedOrder);
|
|
});
|
|
|
|
it('should be a readonly array (as const)', () => {
|
|
// TypeScript ensures this at compile time, but we verify the runtime
|
|
// values are stable by checking identity
|
|
const firstRead = SCHOOL_LEVELS[0];
|
|
const secondRead = SCHOOL_LEVELS[0];
|
|
expect(firstRead).toBe(secondRead);
|
|
expect(firstRead).toBe('CP');
|
|
});
|
|
});
|
|
|
|
// ==========================================================================
|
|
// SchoolLevel type (compile-time check via runtime usage)
|
|
// ==========================================================================
|
|
describe('SchoolLevel type', () => {
|
|
it('should accept valid school level values', () => {
|
|
// This is a compile-time check expressed as a runtime test
|
|
const level: SchoolLevel = 'CP';
|
|
expect(level).toBe('CP');
|
|
|
|
const another: SchoolLevel = 'Terminale';
|
|
expect(another).toBe('Terminale');
|
|
});
|
|
});
|
|
|
|
// ==========================================================================
|
|
// SCHOOL_LEVEL_OPTIONS
|
|
// ==========================================================================
|
|
describe('SCHOOL_LEVEL_OPTIONS', () => {
|
|
it('should have the same number of options as SCHOOL_LEVELS', () => {
|
|
expect(SCHOOL_LEVEL_OPTIONS).toHaveLength(SCHOOL_LEVELS.length);
|
|
});
|
|
|
|
it('should have value and label properties for each option', () => {
|
|
for (const option of SCHOOL_LEVEL_OPTIONS) {
|
|
expect(option).toHaveProperty('value');
|
|
expect(option).toHaveProperty('label');
|
|
}
|
|
});
|
|
|
|
it('should use the level as both value and label', () => {
|
|
for (let i = 0; i < SCHOOL_LEVELS.length; i++) {
|
|
expect(SCHOOL_LEVEL_OPTIONS[i]!.value).toBe(SCHOOL_LEVELS[i]);
|
|
expect(SCHOOL_LEVEL_OPTIONS[i]!.label).toBe(SCHOOL_LEVELS[i]);
|
|
}
|
|
});
|
|
|
|
it('should format first option correctly (CP)', () => {
|
|
expect(SCHOOL_LEVEL_OPTIONS[0]).toEqual({ value: 'CP', label: 'CP' });
|
|
});
|
|
|
|
it('should format last option correctly (Terminale)', () => {
|
|
const last = SCHOOL_LEVEL_OPTIONS[SCHOOL_LEVEL_OPTIONS.length - 1];
|
|
expect(last).toEqual({ value: 'Terminale', label: 'Terminale' });
|
|
});
|
|
|
|
it('should format accented levels correctly', () => {
|
|
const sixieme = SCHOOL_LEVEL_OPTIONS.find((opt) => opt.value === '6ème');
|
|
expect(sixieme).toEqual({ value: '6ème', label: '6ème' });
|
|
|
|
const premiere = SCHOOL_LEVEL_OPTIONS.find((opt) => opt.value === '1ère');
|
|
expect(premiere).toEqual({ value: '1ère', label: '1ère' });
|
|
});
|
|
|
|
it('should preserve the order from SCHOOL_LEVELS', () => {
|
|
const optionValues = SCHOOL_LEVEL_OPTIONS.map((opt) => opt.value);
|
|
expect(optionValues).toEqual([...SCHOOL_LEVELS]);
|
|
});
|
|
});
|
|
});
|