import { test } from 'node:test'; import assert from 'node:assert/strict'; import { classify, buildPath, compareEntries } from '../src/collections.js'; import openbureau from '../../examples/openbureau.config.js'; import kgva from '../../examples/kgva.config.js'; const ob = openbureau.collections; const kg = kgva.collections; // --- openbureau: must reproduce the original hard-coded classify() 1:1 --- test('classify (openbureau): Beitrag = archiv/
/', () => { assert.deepEqual(classify('archiv/software/stack.md', ob), { kind: 'beitrag', section: 'software' }); assert.deepEqual(classify('archiv/buerofuehrung/x.md', ob), { kind: 'beitrag', section: 'buerofuehrung' }); }); test('classify (openbureau): Library = library/, section konstant', () => { assert.deepEqual(classify('library/stack.md', ob), { kind: 'biblio', section: 'library' }); }); test('classify (openbureau): _index.md = Rubrik, section = Elternordner|home', () => { assert.deepEqual(classify('_index.md', ob), { kind: 'rubrik', section: 'home' }); assert.deepEqual(classify('software/_index.md', ob), { kind: 'rubrik', section: 'software' }); }); test('classify (openbureau): alles andere = Seite (fallback)', () => { assert.deepEqual(classify('manifest.md', ob), { kind: 'seite', section: null }); // _index hat Vorrang vor jedem Pfad-Pattern (wie im Original) assert.deepEqual(classify('library/_index.md', ob), { kind: 'rubrik', section: 'library' }); // archiv strikt drei-tief: tiefer faellt auf Seite (Original: len !== 3) assert.deepEqual(classify('archiv/software/a/b.md', ob), { kind: 'seite', section: null }); }); test('buildPath (openbureau): aus Pfad-Pattern + Formulardaten', () => { assert.equal(buildPath('beitrag', { section: 'software', slug: 'neu' }, ob), 'archiv/software/neu.md'); assert.equal(buildPath('biblio', { slug: 'stack' }, ob), 'library/stack.md'); assert.equal(buildPath('seite', { slug: 'impressum' }, ob), 'impressum.md'); assert.equal(buildPath('beitrag', { section: 'software', slug: '' }, ob), ''); }); test('compareEntries (openbureau): Reihenfolge Beitrag { const items = [ { kind: 'rubrik', date: null, title: 'R' }, { kind: 'seite', date: null, title: 'S' }, { kind: 'beitrag', date: '2024-01-01', title: 'B' }, { kind: 'biblio', date: null, title: 'L' }, ]; const sorted = [...items].sort(compareEntries(ob)).map((e) => e.kind); assert.deepEqual(sorted, ['beitrag', 'biblio', 'seite', 'rubrik']); }); test('compareEntries: gleiche kind -> Datum absteigend, dann Titel', () => { const items = [ { kind: 'beitrag', date: '2023-05-01', title: 'B' }, { kind: 'beitrag', date: '2024-05-01', title: 'A' }, { kind: 'beitrag', date: '2024-05-01', title: 'C' }, ]; const sorted = [...items].sort(compareEntries(ob)).map((e) => e.title); assert.deepEqual(sorted, ['A', 'C', 'B']); }); // --- kgva: a different content model, same engine --- test('classify (kgva): Portfolio / Fallback-Page / Index-Section', () => { assert.deepEqual(classify('portfolio/projekt.md', kg), { kind: 'project', section: 'portfolio' }); assert.deepEqual(classify('ueber.md', kg), { kind: 'page', section: null }); assert.deepEqual(classify('_index.md', kg), { kind: 'section', section: 'home' }); assert.deepEqual(classify('arbeiten/_index.md', kg), { kind: 'section', section: 'arbeiten' }); }); test('buildPath (kgva)', () => { assert.equal(buildPath('project', { slug: 'haus' }, kg), 'portfolio/haus.md'); assert.equal(buildPath('page', { slug: 'ueber' }, kg), 'ueber.md'); }); import { contentStats } from '../src/collections.js'; test('contentStats (openbureau): statKey-Zähler + entwuerfe = Beitrag-Entwürfe', () => { const entries = [ { kind: 'beitrag', draft: false }, { kind: 'beitrag', draft: true }, { kind: 'beitrag', draft: true }, { kind: 'biblio', draft: true }, // Library-Entwurf zählt NICHT als entwuerfe { kind: 'seite', draft: false }, { kind: 'rubrik', draft: false }, ]; assert.deepEqual(contentStats(entries, ob), { beitraege: 3, entwuerfe: 2, library: 1, rubriken: 1, seiten: 1, }); }); test('contentStats (kgva): nur deklarierte statKeys, kein entwuerfe', () => { const entries = [ { kind: 'project', draft: true }, { kind: 'project', draft: false }, { kind: 'page', draft: false }, // page hat keinen statKey { kind: 'section', draft: false }, // section hat keinen statKey ]; assert.deepEqual(contentStats(entries, kg), { projects: 2 }); });