import { Decimal } from 'decimal.js'; import { describe, expect, it } from 'vitest'; import { Bloc } from '../../src/domain/bloc.js'; import { Formation } from '../../src/domain/formation.js'; describe('Formation', () => { it('cree une formation valide', () => { const f = new Formation({ id: 1, nom: 'BTS SIO', heuresTotales: new Decimal(1400) }); expect(f.statut).toBe('draft'); expect(f.heuresRestantes().toNumber()).toBe(1400); }); it('throw si heuresTotales < 0', () => { expect(() => new Formation({ id: 1, nom: 'X', heuresTotales: new Decimal(-1) })).toThrow(); }); it('throw si dateFin < dateDebut', () => { expect( () => new Formation({ id: 1, nom: 'X', heuresTotales: new Decimal(100), dateDebut: new Date('2026-09-01'), dateFin: new Date('2026-08-01'), }), ).toThrow(); }); it('activer / archiver transitions', () => { const f = new Formation({ id: 1, nom: 'X', heuresTotales: new Decimal(100) }); f.activer(); expect(f.statut).toBe('actif'); f.archiver(); expect(f.statut).toBe('archive'); }); it('activer apres archive est interdit', () => { const f = new Formation({ id: 1, nom: 'X', heuresTotales: new Decimal(100) }); f.archiver(); expect(() => f.activer()).toThrow(); }); it('ajouterBloc + heuresRestantes rollup', () => { const f = new Formation({ id: 1, nom: 'X', heuresTotales: new Decimal(300) }); const b1 = new Bloc({ id: 1, formationId: 1, nom: 'B1', heuresPrevues: new Decimal(100) }); const b2 = new Bloc({ id: 2, formationId: 1, nom: 'B2', heuresPrevues: new Decimal(150) }); f.ajouterBloc(b1); f.ajouterBloc(b2); expect(f.heuresAttribuees().toNumber()).toBe(250); expect(f.heuresRestantes().toNumber()).toBe(50); }); it('throw si bloc duplique', () => { const f = new Formation({ id: 1, nom: 'X', heuresTotales: new Decimal(300) }); const b = new Bloc({ id: 1, formationId: 1, nom: 'B1', heuresPrevues: new Decimal(100) }); f.ajouterBloc(b); expect(() => f.ajouterBloc(b)).toThrow(/deja present/); }); it('throw si depassement capacite formation', () => { const f = new Formation({ id: 1, nom: 'X', heuresTotales: new Decimal(100) }); const b = new Bloc({ id: 1, formationId: 1, nom: 'B1', heuresPrevues: new Decimal(150) }); expect(() => f.ajouterBloc(b)).toThrow(/depassee/); }); });