import { test } from "node:test"; import assert from "node:assert/strict"; import { diagnose, catalogDiagnostics } from "../server/diagnostics.js"; const lesson = (raw, fields = {}) => ({ day: 1, start: "09:00", end: "10:20", subject: raw, condition: "", weekRanges: null, dates: [], date: null, groups: ["25-АРХ"], subgroups: [], raw, ...fields, }); const codes = (...lessons) => diagnose({ academicYear: "2026", groups: ["25-АРХ"], lessons }).map((p) => p.code); test("Диагностика: обычные занятия без замечаний", () => { assert.deepEqual( codes( lesson("Химия (л.) Иванов И.И. 101", { subject: "Химия" }), lesson("1-8н. Физика", { subject: "Физика", condition: "1-8н.", weekRanges: [[1, 8]] }), lesson("Единый день 07.09;14.09", { subject: "Единый день", dates: ["2026-09-07", "2026-09-14"] }), ), [], ); }); test("Диагностика: пометка недель прочитана не целиком", () => { assert.deepEqual( codes(lesson("1-4н.;6-12н. Политэкономия", { subject: "6-12н. Политэкономия", condition: "1-4н.", weekRanges: [[1, 4]] })), ["weeks_partly"], ); }); test("Диагностика: дата и время в начале ячейки", () => { assert.deepEqual(codes(lesson("24.11. Компьютерная графика")), ["date_in_subject"]); assert.deepEqual(codes(lesson("3.12 Микроконтроллеры")), ["date_in_subject"]); assert.deepEqual(codes(lesson("9.00 Информационный час")), ["time_in_subject"]); assert.deepEqual(codes(lesson("11:10-11:30 – информационный час")), ["time_in_subject"]); }); test("Диагностика: опечатка в дате, нечитаемые недели, даты не того дня", () => { assert.deepEqual( codes(lesson("19,11, 03.12, 17.12 Микроконтроллеры", { subject: "Микроконтроллеры", condition: "19,11,", weekRanges: null })), ["weeks_like_date"], ); assert.deepEqual( codes(lesson("2,6-12-16н Управление проектами", { subject: "Управление проектами", condition: "2,6-12-16н" })), ["weeks_unreadable"], ); // 2026-10-13 is a Tuesday, the row is Monday's. assert.deepEqual(codes(lesson("13.10 Информационный час", { subject: "Информационный час", date: "2026-10-13" })), [ "date_weekday", ]); assert.deepEqual(codes(lesson("15 октября Экскурсия", { subject: "Экскурсия" })), ["dates_unread"]); }); test("Диагностика каталога: фильтры по группе и коду", () => { const doc = (id, groups, lessons) => ({ id, file: { name: `${id}.docx`, faculty: "ИСФ" }, schedule: { academicYear: "2026", groups, lessons, source: {} }, }); const idx = { builtAt: "2026-10-19T00:00:00Z", failed: [], docs: [ doc("a", ["25-АРХ"], [lesson("9.00 Информационный час")]), doc("b", ["24-ДС"], [lesson("3.12 Химия", { groups: ["24-ДС"] })]), doc("c", ["23-ИТ"], [lesson("Химия", { groups: ["23-ИТ"] })]), ], }; const all = catalogDiagnostics(idx); assert.equal(all.documents, 3); assert.equal(all.problems, 2); assert.deepEqual(all.counts, { time_in_subject: 1, date_in_subject: 1 }); assert.deepEqual(catalogDiagnostics(idx, { group: "24-дс" }).items.map((i) => i.doc.id), ["b"]); assert.deepEqual(catalogDiagnostics(idx, { code: "time_in_subject" }).items.map((i) => i.doc.id), ["a"]); });