brain/scripts/test/speaker-matcher.test.js

72 lines
2.9 KiB
JavaScript

const { describe, it } = require('node:test');
const assert = require('node:assert/strict');
const { matchSpeakers, replaceSpeakerNames } = require('../lib/speaker-matcher.js');
describe('matchSpeakers', () => {
const persons = [
{ file: 'Christian Kauer (KRAH).md', fm: { vorname: 'Christian', nachname: 'Kauer', email: 'c.kauer@krah-gruppe.de' } },
{ file: 'Frank Herberg.md', fm: { vorname: 'Frank', nachname: 'Herberg', email: 'f.herberg@krah-gruppe.de' } },
{ file: 'Stefan Theile-Ochel.md', fm: { vorname: 'Stefan', nachname: 'Theile-Ochel', email: 's.theile-ochel@krah-gruppe.de' } }
];
it('matches by email when available', () => {
const speakers = [{ name: 'Christian Kauer', email: 'c.kauer@krah-gruppe.de' }];
const map = matchSpeakers(speakers, persons);
assert.equal(map.get('Christian Kauer'), '[[00 Kontext/Personen/Christian Kauer (KRAH)]]');
});
it('matches by full name when email missing', () => {
const speakers = [{ name: 'Frank Herberg' }];
const map = matchSpeakers(speakers, persons);
assert.equal(map.get('Frank Herberg'), '[[00 Kontext/Personen/Frank Herberg]]');
});
it('returns null wikilink for unmatched speaker', () => {
const speakers = [{ name: 'Unknown Person' }];
const map = matchSpeakers(speakers, persons);
assert.equal(map.get('Unknown Person'), null);
});
it('handles multiple speakers in one call', () => {
const speakers = [
{ name: 'Christian Kauer' },
{ name: 'Frank Herberg' },
{ name: 'Foo Bar' }
];
const map = matchSpeakers(speakers, persons);
assert.equal(map.size, 3);
assert.ok(map.get('Christian Kauer'));
assert.equal(map.get('Foo Bar'), null);
});
});
describe('replaceSpeakerNames', () => {
it('replaces speaker names with wikilinks in text', () => {
const map = new Map([
['Christian Kauer', '[[00 Kontext/Personen/Christian Kauer (KRAH)]]'],
['Frank Herberg', '[[00 Kontext/Personen/Frank Herberg]]']
]);
const text = 'Christian Kauer: Hallo. Frank Herberg: Hi Christian Kauer.';
const out = replaceSpeakerNames(text, map);
assert.ok(out.includes('[[00 Kontext/Personen/Christian Kauer (KRAH)]]'));
assert.ok(out.includes('[[00 Kontext/Personen/Frank Herberg]]'));
assert.ok(!out.includes('Christian Kauer:'));
});
it('skips unmatched speakers (null wikilink)', () => {
const map = new Map([['Unknown', null]]);
const out = replaceSpeakerNames('Unknown: Hello.', map);
assert.equal(out, 'Unknown: Hello.');
});
it('does longest-name first to avoid partial overlaps', () => {
const map = new Map([
['Christian Kauer', '[[Christian Kauer]]'],
['Christian', '[[Christian Hermann]]']
]);
const out = replaceSpeakerNames('Christian Kauer hat gesprochen.', map);
assert.ok(out.includes('[[Christian Kauer]] hat gesprochen.'));
assert.ok(!out.includes('[[Christian Hermann]]'));
});
});