- Implemented LiveMapPage with vehicle tracking using Leaflet and real-time updates. - Added vehicle icons, status labels, and filtering options for routes. - Created ScheduleCenterPage to display schedule versions, conflicts, and gaps. - Introduced responsive design for both pages with dedicated CSS styles. - Integrated API calls for fetching routes and vehicle data.
37 lines
2.4 KiB
JavaScript
37 lines
2.4 KiB
JavaScript
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);
|
|
});
|