Files
border-red-post-nalati/frontend/tests/datetime.test.mjs

60 lines
2.8 KiB
JavaScript

import assert from 'node:assert/strict'
import { readFile } from 'node:fs/promises'
import test from 'node:test'
import ts from 'typescript'
const source = await readFile(new URL('../src/utils/datetime.ts', import.meta.url), 'utf8')
const { outputText } = ts.transpileModule(source, { compilerOptions: { target: ts.ScriptTarget.ES2022, module: ts.ModuleKind.ESNext } })
const { localDateTimeInput, collectedAtFromInput } = await import(`data:text/javascript;base64,${Buffer.from(outputText).toString('base64')}`)
function timezone(t, zone) {
const original = process.env.TZ
process.env.TZ = zone
t.after(() => { if (original === undefined) delete process.env.TZ; else process.env.TZ = original })
}
test('Shanghai display uses local clock and unchanged input preserves microseconds', t => {
timezone(t, 'Asia/Shanghai')
const original = '2026-10-16T04:34:56.789123Z'
const value = localDateTimeInput(original)
assert.equal(value, '2026-10-16T12:34:56.789')
assert.equal(collectedAtFromInput(value, original), original)
const offsetOriginal = '2026-10-16T12:34:56.789123+08:00'
assert.equal(collectedAtFromInput(value, offsetOriginal), offsetOriginal)
})
test('zero milliseconds are normalized like datetime-local without losing server fractions', t => {
timezone(t, 'Asia/Shanghai')
const original = '2026-10-16T04:34:00.000123Z'
assert.equal(localDateTimeInput(original), '2026-10-16T12:34')
assert.equal(collectedAtFromInput('2026-10-16T12:34', original), original)
assert.equal(localDateTimeInput('2026-10-16T04:34:56.010Z'), '2026-10-16T12:34:56.01')
})
test('explicit local time changes convert to the correct UTC instant', t => {
timezone(t, 'Asia/Shanghai')
assert.equal(collectedAtFromInput('2026-10-16T12:35:56.789', '2026-10-16T04:34:56.789123Z'), '2026-10-16T04:35:56.789Z')
assert.equal(collectedAtFromInput('2026-10-16T12:35'), '2026-10-16T04:35:00.000Z')
})
test('negative UTC offsets preserve date boundaries', t => {
timezone(t, 'America/Los_Angeles')
const original = '2026-01-01T04:34:56.789123Z'
assert.equal(localDateTimeInput(original), '2025-12-31T20:34:56.789')
assert.equal(collectedAtFromInput(localDateTimeInput(original), original), original)
})
test('unchanged repeated DST clock time keeps the original instant and precision', t => {
timezone(t, 'America/New_York')
const original = '2026-11-01T06:30:00.000123Z'
assert.equal(localDateTimeInput(original), '2026-11-01T01:30')
assert.equal(collectedAtFromInput('2026-11-01T01:30', original), original)
})
test('UTC and invalid timestamps do not invent a collection time', t => {
timezone(t, 'UTC')
assert.equal(localDateTimeInput('2026-10-16T04:34:56.789Z'), '2026-10-16T04:34:56.789')
assert.throws(() => localDateTimeInput('invalid'))
assert.throws(() => collectedAtFromInput(''))
})