fix: preserve collection timestamps during catalog edits
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
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(''))
|
||||
})
|
||||
Reference in New Issue
Block a user