const assert = require('node:assert/strict'); const test = require('node:test'); const { buildScheduleCenter, parseDate } = require('../src/services/scheduleCenterReport'); test('schedule center separates active and future versions and detects gaps and overlaps', () => { const report = buildScheduleCenter([ { route_id: 7, route_number: '10', route_name: 'Вокзал — Центр', color: '#2563eb', schedule_id: 1, day_type: 'weekday', valid_from: null, valid_until: null, departure_count: 12 }, { route_id: 7, route_number: '10', route_name: 'Вокзал — Центр', color: '#2563eb', schedule_id: 2, day_type: 'saturday', valid_from: '2026-10-01', valid_until: null, departure_count: 6 }, { route_id: 7, route_number: '10', route_name: 'Вокзал — Центр', color: '#2563eb', schedule_id: 3, day_type: 'sunday', valid_from: null, valid_until: '2026-09-30', departure_count: 5 }, { route_id: 7, route_number: '10', route_name: 'Вокзал — Центр', color: '#2563eb', schedule_id: 4, day_type: 'sunday', valid_from: '2026-09-25', valid_until: null, departure_count: 5 }, ], '2026-09-18'); assert.deepEqual(report.summary, { routes: 1, active: 2, upcoming: 2, conflicts: 1, gaps: 1 }); assert.equal(report.window_end, '2026-12-17'); const saturday = report.routes[0].day_types.find((dayType) => dayType.value === 'saturday'); assert.equal(saturday.status, 'upcoming'); assert.deepEqual(saturday.gaps, [{ starts_on: '2026-09-18', ends_on: '2026-09-30' }]); assert.equal(report.issues.find((issue) => issue.code === 'schedule_overlap').route_id, 7); assert.deepEqual(report.issues.find((issue) => issue.code === 'schedule_overlap').version_ids, [3, 4]); }); test('schedule center reports uncovered day types for routes without versions', () => { const report = buildScheduleCenter([ { route_id: 3, route_number: '2', route_name: 'Рынок — Больница', color: '#dc2626', schedule_id: null }, ], '2026-09-18', { windowDays: 7 }); assert.equal(report.summary.gaps, 3); assert.equal(report.issues.filter((issue) => issue.code === 'schedule_gap').length, 3); assert.equal(report.routes[0].day_types.every((dayType) => dayType.status === 'gap'), true); }); test('date validation accepts calendar dates only', () => { assert.ok(parseDate('2026-02-28')); assert.equal(parseDate('2026-02-29'), null); assert.equal(parseDate('18.09.2026'), null); });