Files
gameno-api/utils/classSchedule.test.js
T
kavehhn 4d60755a95 feat(classes): store weekdays and meeting times on the class
Keep the class schedule on the class itself so SMS and listings do not have to infer days and hours from sessions.
2026-08-15 23:59:07 +03:30

99 lines
3.2 KiB
JavaScript

'use strict';
const { describe, it } = require('node:test');
const assert = require('node:assert/strict');
const {
formatCourseTime,
formatClassDays,
formatClassStartDate,
formatClassDaysFromIndexes,
normalizeWeekdays,
normalizeClockTime,
buildClassScheduleContext
} = require('./classSchedule');
describe('class schedule SMS helpers', () => {
it('formats course time as an hour range', () => {
assert.equal(formatCourseTime('19:00', '21:00'), 'از 19 تا 21');
assert.equal(formatCourseTime('19:30', '21:00'), 'از 19:30 تا 21');
});
it('joins class weekdays in Persian week order', () => {
const atNoon = (year, month, day) => new Date(year, month - 1, day, 12, 0, 0);
const monday = atNoon(2026, 8, 17);
const saturday = atNoon(2026, 8, 15);
const wednesday = atNoon(2026, 8, 19);
assert.equal(
formatClassDays([
{ day: monday },
{ day: saturday },
{ day: wednesday },
{ day: saturday }
]),
'شنبه، دوشنبه و چهارشنبه'
);
});
it('builds start date, days, and course time from class and sessions', () => {
const atNoon = (year, month, day) => new Date(year, month - 1, day, 12, 0, 0);
const context = buildClassScheduleContext(
{ startDate: atNoon(2026, 8, 15) },
[
{ day: atNoon(2026, 8, 15), startTime: '19:00', endTime: '21:00' },
{ day: atNoon(2026, 8, 17), startTime: '19:00', endTime: '21:00' }
]
);
assert.ok(context.classStartDate);
assert.equal(context.classDays, 'شنبه و دوشنبه');
assert.equal(context.courseTime, 'از 19 تا 21');
});
it('uses the current session for course time when provided', () => {
const context = buildClassScheduleContext(
{ startDate: new Date('2026-08-15T00:00:00Z') },
[{ day: new Date('2026-08-15T00:00:00Z'), startTime: '19:00', endTime: '21:00' }],
{ startTime: '10:00', endTime: '12:00' }
);
assert.equal(context.courseTime, 'از 10 تا 12');
});
it('prefers stored class days and times over inferred sessions', () => {
const atNoon = (year, month, day) => new Date(year, month - 1, day, 12, 0, 0);
const context = buildClassScheduleContext(
{
startDate: atNoon(2026, 8, 15),
days: [6, 1],
startTime: '18:00',
endTime: '20:00'
},
[
{ day: atNoon(2026, 8, 16), startTime: '19:00', endTime: '21:00' }
]
);
assert.equal(context.classDays, 'شنبه و دوشنبه');
assert.equal(context.courseTime, 'از 18 تا 20');
});
});
describe('class weekday and time normalization', () => {
it('deduplicates weekdays and sorts them in Iran week order', () => {
assert.deepEqual(normalizeWeekdays([1, 6, 1, 3, 9, '2']), [6, 1, 2, 3]);
});
it('normalizes clock times to HH:mm', () => {
assert.equal(normalizeClockTime('19'), '19:00');
assert.equal(normalizeClockTime('9:5'), '09:05');
assert.equal(normalizeClockTime('19:00'), '19:00');
assert.equal(normalizeClockTime('25:00'), '');
assert.equal(normalizeClockTime(''), '');
});
it('formats stored weekday indexes as Persian day names', () => {
assert.equal(formatClassDaysFromIndexes([1, 6]), 'شنبه و دوشنبه');
});
});