import assert from 'node:assert/strict'; import { readFileSync } from 'node:fs'; import { dirname, join } from 'node:path'; import { fileURLToPath } from 'node:url'; import { describe, it } from 'node:test'; import { parseBoard, parsePageCount } from '../src/lib/forum.js'; const here = dirname(fileURLToPath(import.meta.url)); const BOARD = readFileSync(join(here, 'fixtures', 'board.html'), 'utf8'); describe('Board-Übersicht lesen', () => { const threads = parseBoard(BOARD); it('liest die Threads der Liste', () => { assert.equal(threads.length, 3); assert.deepEqual( threads.map((t) => t.threadId), [7001, 7002, 7003], ); }); it('nimmt den Ersteller aus der Übersicht, nicht den letzten Antwortenden', () => { const first = threads.find((t) => t.threadId === 7001); assert.equal(first?.authorName, 'Antragsteller'); assert.equal(first?.authorForumId, 501, 'die Forum-ID überlebt Namensänderungen'); }); it('löst Umlaut- und Anführungszeichen-Entities auf', () => { const second = threads.find((t) => t.threadId === 7002); assert.equal(second?.title, 'Custom Character Redesign | Alt zu Neu'); }); it('erkennt einen zurückgelassenen Verweis als solchen', () => { const stub = threads.find((t) => t.threadId === 7003); assert.equal(stub?.isMovedStub, true); }); it('ignoriert Unterforen und deren letzte Beiträge', () => { // 9999 steht im wbbBoardNode-Kasten, gehoert aber nicht in dieses Board. assert.equal(threads.some((t) => t.threadId === 9999), false); }); it('liest die Seitenzahl aus der Blätterleiste', () => { assert.equal(parsePageCount(BOARD), 3); assert.equal(parsePageCount('ohne Blaetterleiste'), 1); }); it('kommt mit einer leeren Seite klar', () => { assert.deepEqual(parseBoard('nichts'), []); }); });