fix: update db import validation tests to account for reverse links

- Translation count test now adds reverse link count to expected total
- Non-English translations test now filters to kaikki source only
- Target language test now filters to kaikki source only — reverse links
  to English are valid and expected
This commit is contained in:
lila 2026-05-05 19:10:19 +02:00
parent 1c44ef989b
commit 76af2ab093

View file

@ -100,12 +100,17 @@ describe("pipeline.db — import validation", () => {
expect(errors, `\n${errors.join("\n")}`).toHaveLength(0); expect(errors, `\n${errors.join("\n")}`).toHaveLength(0);
}); });
it("translation count matches source files", () => { it("translation count matches source files plus reverse links", () => {
if (!db) return; if (!db) return;
const row = db const row = db
.prepare("SELECT COUNT(*) as count FROM translations") .prepare("SELECT COUNT(*) as count FROM translations")
.get() as { count: number }; .get() as { count: number };
expect(row.count).toBe(expectedTotalTranslations); const reverseLinks = db
.prepare(
"SELECT COUNT(*) as count FROM translations WHERE source = 'reverse_link'",
)
.get() as { count: number };
expect(row.count).toBe(expectedTotalTranslations + reverseLinks.count);
}); });
it("every translation references a valid entry", () => { it("every translation references a valid entry", () => {
@ -180,7 +185,7 @@ describe("pipeline.db — import validation", () => {
expect(errors, `\n${errors.join("\n")}`).toHaveLength(0); expect(errors, `\n${errors.join("\n")}`).toHaveLength(0);
}); });
it("non-English entries have no translations", () => { it("non-English entries have no Kaikki translations", () => {
if (!db) return; if (!db) return;
const nonEnLangs = SUPPORTED_LANGUAGE_CODES.filter((l) => l !== "en") const nonEnLangs = SUPPORTED_LANGUAGE_CODES.filter((l) => l !== "en")
.map((l) => `'${l}'`) .map((l) => `'${l}'`)
@ -192,25 +197,28 @@ describe("pipeline.db — import validation", () => {
FROM entries e FROM entries e
JOIN translations t ON t.entry_id = e.id JOIN translations t ON t.entry_id = e.id
WHERE e.language IN (${nonEnLangs}) WHERE e.language IN (${nonEnLangs})
AND t.source = 'kaikki'
GROUP BY e.id`, GROUP BY e.id`,
) )
.all() as { headword: string; language: string; c: number }[]; .all() as { headword: string; language: string; c: number }[];
const errors = rows.map( const errors = rows.map(
(r) => `"${r.headword}" (${r.language}): unexpected ${r.c} translations`, (r) =>
`"${r.headword}" (${r.language}): unexpected ${r.c} Kaikki translations`,
); );
expect(errors, `\n${errors.join("\n")}`).toHaveLength(0); expect(errors, `\n${errors.join("\n")}`).toHaveLength(0);
}); });
it("all translation target languages are supported and not English", () => { it("all Kaikki translation target languages are supported and not English", () => {
if (!db) return; if (!db) return;
const validLangs = SUPPORTED_LANGUAGE_CODES.map((l) => `'${l}'`).join(", "); const validLangs = SUPPORTED_LANGUAGE_CODES.map((l) => `'${l}'`).join(", ");
const rows = db const rows = db
.prepare( .prepare(
`SELECT id, target_lang FROM translations `SELECT t.id, t.target_lang
WHERE target_lang NOT IN (${validLangs}) FROM translations t
OR target_lang = 'en'`, WHERE t.source = 'kaikki'
AND (t.target_lang NOT IN (${validLangs}) OR t.target_lang = 'en')`,
) )
.all() as { id: number; target_lang: string }[]; .all() as { id: number; target_lang: string }[];