47 lines
2.3 KiB
JavaScript
47 lines
2.3 KiB
JavaScript
const assert = require('node:assert/strict')
|
|
const test = require('node:test')
|
|
const fs = require('node:fs')
|
|
const vm = require('node:vm')
|
|
const ts = require('typescript')
|
|
|
|
function loadUtility(name) {
|
|
const source = fs.readFileSync(`${__dirname}/../utils/${name}.ts`, 'utf8')
|
|
const { outputText } = ts.transpileModule(source, {
|
|
compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2021 },
|
|
})
|
|
const exports = {}
|
|
vm.runInNewContext(outputText, { exports })
|
|
return exports
|
|
}
|
|
|
|
const { timeSpanInput } = loadUtility('timeSpanInput')
|
|
const { staffTimeRows, workingMinutes } = loadUtility('staffTimeSpans')
|
|
|
|
test('editing repeated local times preserves the original instant and rejects ambiguous new inputs', () => {
|
|
assert.equal(timeSpanInput('2026-10-25T02:15', 'Europe/Berlin', '2026-10-25T01:15:00.000Z'), '2026-10-25T01:15:00.000Z');
|
|
assert.equal(timeSpanInput('2026-10-25T02:15', 'Europe/Berlin', '2026-10-25T00:15:00.000Z'), '2026-10-25T00:15:00.000Z');
|
|
assert.throws(() => timeSpanInput('2026-10-25T02:15', 'Europe/Berlin'), /zweimal/);
|
|
assert.throws(() => timeSpanInput('2026-03-29T02:15', 'Europe/Berlin'), /existiert nicht/);
|
|
assert.equal(timeSpanInput('2026-10-25T01:15', 'UTC'), '2026-10-25T01:15:00.000Z');
|
|
});
|
|
|
|
test('dashboard keeps a paused attendance active and freezes its net working duration', () => {
|
|
const attendance = {
|
|
id: 'attendance-1', user_id: 'user-1', type: 'work', status: 'factual',
|
|
started_at: '2026-10-01T06:00:00Z', ended_at: null,
|
|
breaks: [{ started_at: '2026-10-01T10:00:00Z', ended_at: null }],
|
|
}
|
|
const base = { id: attendance.id, model: 'spans-v2', attendance }
|
|
const segments = [
|
|
{ ...base, type: 'work', startedAt: attendance.started_at, endedAt: attendance.breaks[0].started_at },
|
|
{ ...base, type: 'pause', startedAt: attendance.breaks[0].started_at, endedAt: null },
|
|
]
|
|
const entries = staffTimeRows(segments, attendance.user_id, Date.parse('2026-10-01T11:00:00Z'))
|
|
assert.equal(entries.length, 1)
|
|
assert.equal(entries[0].type, 'work')
|
|
assert.equal(entries[0].paused, true)
|
|
assert.equal(entries[0].stopped_at, null)
|
|
assert.equal(entries[0].duration_minutes, 240)
|
|
assert.equal(workingMinutes(entries[0], Date.parse('2026-10-01T12:00:00Z')), 240)
|
|
})
|