test: Ajouter les tests unitaires manquants (backend et frontend)

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.
This commit is contained in:
2026-02-15 18:44:33 +01:00
parent a0e19627a7
commit fdc26eb334
17 changed files with 4112 additions and 0 deletions

View File

@@ -0,0 +1,129 @@
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]);
});
});
});