import test from 'node:test'; import assert from 'node:assert/strict'; import { readFile } from 'node:fs/promises'; import { historyActionLabel } from '../react/admin/schedule-versions-service.js'; import { versionStatusLabel } from '../react/admin/schedule-quality-service.js'; import { chooseScheduleVersion } from '../react/admin/schedule-service.js'; test('журнал версий переводит системные действия на русский язык', () => { assert.equal(historyActionLabel('CREATED'), 'Создан черновик'); assert.equal(historyActionLabel('PUBLISHED'), 'Опубликовано'); assert.equal(historyActionLabel('RESTORED'), 'Восстановлено'); }); test('анализ качества различает черновик, публикацию и архив', () => { assert.equal(versionStatusLabel('DRAFT'), 'Черновик'); assert.equal(versionStatusLabel('PUBLISHED'), 'Опубликована'); assert.equal(versionStatusLabel('ARCHIVED'), 'Архив'); }); test('конструктор по умолчанию открывает опубликованное расписание выбранного семестра', () => { const versions = [ { id: 1, semesterId: 10, status: 'DRAFT' }, { id: 2, semesterId: 10, status: 'PUBLISHED' }, { id: 3, semesterId: 20, status: 'PUBLISHED' }, { id: 4, semesterId: 10, status: 'ARCHIVED' } ]; assert.equal(chooseScheduleVersion(versions, 10).id, 2); assert.equal(chooseScheduleVersion(versions, 20).id, 3); assert.equal(chooseScheduleVersion(versions, 10, 1).id, 1); assert.equal(chooseScheduleVersion(versions, 10, 4).id, 2); }); test('контур версий подключён к SPA, а профильные вкладки имеют локальный выбор периода', async () => { const [reactTabs, roles, constructorTab, quality, service, scheduleService, versionsService, qualityTab, versionsTab, scheduleViewTab] = await Promise.all([ readFile(new URL('../react/admin/react-tabs.js', import.meta.url), 'utf8'), readFile(new URL('../admin/js/role-capabilities.js', import.meta.url), 'utf8'), readFile(new URL('../react/admin/tabs/ScheduleTab.jsx', import.meta.url), 'utf8'), readFile(new URL('../react/admin/schedule-quality-service.js', import.meta.url), 'utf8'), readFile(new URL('../react/admin/admin-service.js', import.meta.url), 'utf8'), readFile(new URL('../react/admin/schedule-service.js', import.meta.url), 'utf8'), readFile(new URL('../react/admin/schedule-versions-service.js', import.meta.url), 'utf8'), readFile(new URL('../react/admin/tabs/ScheduleQualityTab.jsx', import.meta.url), 'utf8'), readFile(new URL('../react/admin/tabs/ScheduleVersionsTab.jsx', import.meta.url), 'utf8'), readFile(new URL('../react/admin/tabs/ScheduleViewTab.jsx', import.meta.url), 'utf8') ]); assert.match(reactTabs, /'schedule-versions':\s*\{\s*Component/); assert.match(roles, /schedule-versions/); assert.match(service, /Версии расписания/); assert.match(scheduleService, /scheduleVersionId:\s*Number\(versionId\)/); assert.match(constructorTab, /basedOnVersionId:\s*Number\(base\.id\)/); assert.match(versionsService, /magistr\.schedule\.openVersionId/); assert.match(versionsService, /magistr\.schedule\.openRuleId/); assert.match(constructorTab, /SCHEDULE_OPEN_VERSION_STORAGE_KEY/); assert.match(constructorTab, /SCHEDULE_OPEN_RULE_STORAGE_KEY/); assert.match(constructorTab, /formatLocalDate\(new Date\(\)\)/); assert.match(constructorTab, /data-slot-id/); assert.match(constructorTab, /id="schedule-version-create-draft"/); assert.match(constructorTab, /id="schedule-version-year"/); assert.match(constructorTab, /id="schedule-version-semester"/); assert.match(qualityTab, /id="quality-year"/); assert.match(qualityTab, /id="quality-version"/); assert.match(versionsTab, /id="version-year"/); assert.match(scheduleViewTab, /id="schedule-view-year"/); assert.match(quality, /versionId=.*encodeURIComponent\(versionId\)/); });