29 lines
1.8 KiB
TypeScript
29 lines
1.8 KiB
TypeScript
import assert from 'node:assert/strict'
|
|
import test from 'node:test'
|
|
import { isCalendarDate, isStatisticsDate, readStatisticsRange } from './statistics-range'
|
|
|
|
const fallback = { from: '2026-09-01', to: '2026-09-07' }
|
|
const now = Date.parse('2026-09-23T12:00:00Z')
|
|
const read = (raw: string) => readStatisticsRange(new URLSearchParams(raw), fallback, now)
|
|
|
|
test('календарные даты проверяются без нормализации несуществующего дня', () => {
|
|
for (const date of ['2024-02-29', '2000-02-29', '2026-12-31']) assert.equal(isCalendarDate(date), true)
|
|
for (const date of ['2026-02-29', '1900-02-29', '2026-04-31', '2026-13-01', '0000-01-01']) assert.equal(isCalendarDate(date), false)
|
|
assert.equal(isStatisticsDate('2026-02-30T12:00:00Z'), false)
|
|
assert.equal(isStatisticsDate('2026-09-01T24:00:00Z'), false)
|
|
assert.equal(isStatisticsDate('2026-09-01T12:00:00'), false)
|
|
})
|
|
|
|
test('пустая ссылка использует пресет, повреждённая не принимается молча', () => {
|
|
assert.deepEqual(read(''), { range: fallback, error: null })
|
|
for (const raw of ['from=', 'to=2026-09-01', 'from=bad&to=bad', 'from=2026-09-01&from=2026-09-02&to=2026-09-03', 'from=2026-09-03&to=2026-09-01', 'from=2027-01-01&to=2027-01-02']) assert.ok(read(raw).error, raw)
|
|
})
|
|
|
|
test('границы сравниваются по времени, date-only конец включён как в API', () => {
|
|
assert.equal(read('from=2026-09-01&to=2026-09-01').error, null)
|
|
const params = new URLSearchParams({ from: '2026-09-01T12:00:00+07:00', to: '2026-09-01T06:00:00Z' })
|
|
assert.equal(readStatisticsRange(params, fallback, now).error, null)
|
|
params.set('to', '2026-09-01T04:00:00Z')
|
|
assert.ok(readStatisticsRange(params, fallback, now).error)
|
|
})
|