// 5.7.0 (Durchsicht 12.09.2026, F14): Der wörtliche Vergleich kennt jetzt // Akzente und den Originaltitel. Die drei Filme des Commanders (Der // Patriot, Déjà Vu, Training Day) tragen englische Labels, TMDb antwortet // auf Deutsch — vorher ein Vorschlag mit 60 %, die Automatik wartete. import { describe, expect, it } from 'vitest' import { gleichBedeutend, ohneAkzente, wortUeberlappung, zuordnen } from '../src/kern/metadaten/zuordnung' const keinOmdb = { verfuegbar: false, lookup: async () => null } function tmdb(filme: Array<{ id: number; title: string; original_title?: string }>) { return { verfuegbar: true, searchMovie: async () => filme, searchTv: async () => [], movieDetails: async (id: number) => { const f = filme.find((x) => x.id === id) return f === undefined ? null : { id, title: f.title, release_date: '2000-06-28', overview: 'Ü', vote_count: 100 } }, tvDetails: async () => null, findByImdb: async () => null, } } describe('ohneAkzente und gleichBedeutend', () => { it('Déjà Vu ist Deja Vu', () => { expect(ohneAkzente('Déjà Vu')).toBe('Deja Vu') expect(gleichBedeutend('Déjà Vu', 'Deja Vu')).toBe(true) expect(gleichBedeutend('Amélie', 'AMELIE')).toBe(true) expect(wortUeberlappung('Déjà Vu', 'Deja Vu')).toBe(1) }) it('Umlaute bleiben unterscheidbar genug (ä → a, ß → ss)', () => { expect(gleichBedeutend('Der Baader Meinhof Komplex', 'Der Baader Meinhof Komplex')).toBe(true) expect(gleichBedeutend('Das Boot', 'Das Bot')).toBe(false) }) }) describe('zuordnen mit Originaltitel', () => { it('Label „The Patriot" trifft „Der Patriot" (original_title) wörtlich — 0,95', async () => { const z = await zuordnen('The Patriot', tmdb([{ id: 8489, title: 'Der Patriot', original_title: 'The Patriot' }]), keinOmdb) expect(z.confidence).toBe(0.95) expect(z.titel).toBe('Der Patriot') }) it('Label „Deja Vu" trifft „Déjà Vu – Wettlauf gegen die Zeit" über den Originaltitel', async () => { const z = await zuordnen( 'Deja Vu', tmdb([ { id: 7551, title: 'Déjà Vu – Wettlauf gegen die Zeit', original_title: 'Deja Vu' }, { id: 1, title: 'Déjà Vu', original_title: 'Déjà Vu' }, ]), keinOmdb, ) expect(z.confidence).toBe(0.95) expect(z.titel).toBe('Déjà Vu – Wettlauf gegen die Zeit') }) it('ohne Originaltitel und ohne wörtlichen Treffer bleibt es ein Vorschlag', async () => { const z = await zuordnen('The Patriot', tmdb([{ id: 1, title: 'Der Patriot' }, { id: 2, title: 'Patriot Games' }, { id: 3, title: 'Der Patriot 2' }, { id: 4, title: 'Patrioten' }]), keinOmdb) expect(z.confidence).toBe(0.6) }) })