import assert from 'node:assert/strict'; import test from 'node:test'; import { readFile } from 'node:fs/promises'; import { academicYearDefaults, activityColorClass, activityColorCode, validateAcademicYearSemesters } from '../admin/js/views/academic-calendar.js'; test('окончание, название и границы семестров рассчитываются по году начала', () => { assert.deepEqual(academicYearDefaults('2026'), { startYear: 2026, endYear: 2027, title: '2026-2027', startDate: '2026-09-01', endDate: '2027-06-30', semesters: [ { semesterType: 'autumn', startDate: '2026-09-01', endDate: '2027-01-31' }, { semesterType: 'spring', startDate: '2027-02-01', endDate: '2027-06-30' } ] }); }); test('год начала должен состоять ровно из четырёх цифр', () => { assert.throws(() => academicYearDefaults('26'), /четырёх цифр/); assert.throws(() => academicYearDefaults('202A'), /четырёх цифр/); assert.throws(() => academicYearDefaults('9999'), /диапазоне/); }); test('учебный год нельзя подготовить без семестров', () => { assert.throws( () => validateAcademicYearSemesters([], '2026-09-01', '2027-06-30'), /Учебный год нельзя создать без семестров/ ); }); test('пересекающиеся семестры отклоняются до отправки формы', () => { assert.throws( () => validateAcademicYearSemesters([ { semesterType: 'autumn', startDate: '2026-09-01', endDate: '2027-02-10' }, { semesterType: 'spring', startDate: '2027-02-01', endDate: '2027-06-30' } ], '2026-09-01', '2027-06-30'), /Периоды семестров не должны пересекаться/ ); }); test('цвет обозначения берётся из справочника и имеет безопасный запасной вариант', () => { assert.equal(activityColorCode({ colorCode: '#f59e0b' }), '#f59e0b'); assert.equal(activityColorClass({ colorCode: '#f59e0b' }), 'calendar-activity-color-f59e0b'); assert.equal(activityColorCode({ colorCode: 'red; background: black' }), '#64748b'); }); test('форма создания не содержит поля названия и включает оба семестра', async () => { const view = await readFile(new URL('../admin/views/academic-calendar.html', import.meta.url), 'utf8'); assert.doesNotMatch(view, /id="academic-year-title"/); assert.match(view, /id="academic-year-start"[^>]+maxlength="4"[^>]+pattern="\[0-9\]\{4\}"/); assert.match(view, /id="academic-year-end"[^>]+maxlength="4"[^>]+readonly/); assert.match(view, /id="academic-year-autumn-start"/); assert.match(view, /id="academic-year-spring-start"/); assert.match(view, /Сохранить учебный год и семестры/); });