import assert from 'node:assert/strict'; import { test } from 'node:test'; import { createLoginLimiter, createToken, pinMatches, verifyToken } from '../server/auth.js'; test('Token ist mit Geheimnis und PIN gültig', () => { const token = createToken('geheim', '1234'); assert.equal(verifyToken('geheim', '1234', token), true); }); test('Token wird nach PIN-Wechsel ungültig', () => { const token = createToken('geheim', '1234'); assert.equal(verifyToken('geheim', '9999', token), false); }); test('Token mit fremdem Geheimnis oder manipuliertem Ablauf ist ungültig', () => { const token = createToken('geheim', '1234'); assert.equal(verifyToken('anderes', '1234', token), false); const [, signature] = token.split('.'); assert.equal(verifyToken('geheim', '1234', `${Date.now() + 1e12}.${signature}`), false); }); test('Abgelaufenes Token ist ungültig', () => { const token = createToken('geheim', '1234', 0); assert.equal(verifyToken('geheim', '1234', token), false); }); test('Ohne gesetzte PIN gilt kein Token und keine Eingabe', () => { assert.equal(verifyToken('geheim', '', createToken('geheim', '')), false); assert.equal(pinMatches('', ''), false); }); test('PIN-Vergleich', () => { assert.equal(pinMatches('1234', '1234'), true); assert.equal(pinMatches('1234', '1235'), false); assert.equal(pinMatches('1234', undefined), false); }); test('Sperre nach zu vielen Fehlversuchen läuft ab', () => { const limiter = createLoginLimiter({ maxFailures: 2, windowMs: 1000 }); limiter.recordFailure(0); limiter.recordFailure(10); assert.equal(limiter.isBlocked(500), true); assert.equal(limiter.isBlocked(1500), false); });