import { test } from 'node:test' import assert from 'node:assert/strict' import { createHash } from 'node:crypto' import { hashToken, neuerToken } from '../server/services/auftraege/token.js' const TAG_MS = 24 * 60 * 60 * 1000 test('neuerToken: 32 Zufallsbytes als base64url (43 Zeichen), Hash = SHA-256 in Hex, gültig 60 Tage ab jetzt', () => { const jetzt = new Date('2026-10-06T10:00:00.000Z') const { token, hash, gueltigBis } = neuerToken(jetzt) assert.match(token, /^[A-Za-z0-9_-]{43}$/) assert.equal(hash, createHash('sha256').update(token).digest('hex')) assert.ok(gueltigBis instanceof Date) assert.equal(gueltigBis.toISOString(), '2026-12-05T10:00:00.000Z') assert.equal(jetzt.toISOString(), '2026-10-06T10:00:00.000Z', 'das übergebene Datum bleibt unverändert') }) test('neuerToken: jedes Token ist neu; ohne Argument zählt die aktuelle Zeit; ein ungültiger Zeitpunkt wirft', () => { const vorher = Date.now() const a = neuerToken() const b = neuerToken() const nachher = Date.now() assert.notEqual(a.token, b.token) assert.notEqual(a.hash, b.hash) assert.ok(a.gueltigBis.getTime() >= vorher + 60 * TAG_MS && a.gueltigBis.getTime() <= nachher + 60 * TAG_MS) assert.throws(() => neuerToken(new Date('kein Datum')), TypeError) assert.throws(() => neuerToken('2026-10-06'), TypeError) }) test('hashToken: gleicher Hash wie neuerToken, null bei falschem Format', () => { const { token, hash } = neuerToken() assert.equal(hashToken(token), hash) const falsch = [undefined, null, 42, {}, [], '', 'kurz', `${token}x`, token.slice(1), ` ${token.slice(0, 42)}`, `${token.slice(0, 42)}+`, `${token.slice(0, 42)}=`, `../${token.slice(3)}`, `${token.slice(0, 42)}\n`] for (const wert of falsch) assert.equal(hashToken(wert), null, JSON.stringify(wert)) })