Files
computer-playbook/tests/unit/python/utils/i18n/test_catalog.py
T
kevinveenbirkenbachandClaude Opus 5 bfdf3dee79 fix(test): mark the catalog test's own tempdir read as uncached
The header test writes a .po file into its tempdir and reads it back. The
shared cache is keyed by path, so a cached read answers with the content
from before the write. The marker sits on the call's own line because the
lint accepts it nowhere else, and the shorter comment survives the
formatter that had detached it once already.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-22 21:21:10 +02:00

117 lines
3.9 KiB
Python

import tempfile
import unittest
from pathlib import Path
from utils.i18n.catalog import (
build_template,
merge,
read_catalog,
translations,
write_catalog,
)
class TestMerge(unittest.TestCase):
def test_changed_source_keeps_translation_as_fuzzy(self):
catalog = merge(build_template([("a", "Hello world")], "core"), None, "de")
catalog.get("Hello world", context="a").string = "Hallo Welt"
merged = merge(build_template([("a", "Hello world!")], "core"), catalog, "de")
message = merged.get("Hello world!", context="a")
self.assertEqual(message.string, "Hallo Welt")
self.assertTrue(message.fuzzy)
def test_removed_source_disappears(self):
catalog = merge(
build_template([("a", "Keep"), ("b", "Drop")], "core"), None, "de"
)
catalog.get("Drop", context="b").string = "Weg"
merged = merge(build_template([("a", "Keep")], "core"), catalog, "de")
self.assertIsNone(merged.get("Drop", context="b"))
self.assertEqual(len(merged), 1)
def test_same_text_in_two_contexts_stays_two_entries(self):
catalog = merge(
build_template(
[("role:x:description", "Wiki"), ("menu:Wiki:title", "Wiki")], "core"
),
None,
"de",
)
self.assertEqual(len(catalog), 2)
class TestWrite(unittest.TestCase):
def test_rewriting_unchanged_catalog_changes_nothing(self):
with tempfile.TemporaryDirectory() as tmp:
path = Path(tmp) / "de" / "LC_MESSAGES" / "core.po"
template = build_template([("a", "Hello"), ("b", "World")], "core")
self.assertTrue(write_catalog(path, merge(template, None, "de")))
with path.open("rb") as handle:
first = handle.read()
self.assertFalse(
write_catalog(path, merge(template, read_catalog(path), "de"))
)
with path.open("rb") as handle:
self.assertEqual(handle.read(), first)
class TestTranslations(unittest.TestCase):
def test_every_written_catalog_names_the_author_and_no_placeholder(self):
old_header = (
"# German translations for infinito-nexus.\n"
"# Copyright (C) 2026 ORGANIZATION\n"
"# FIRST AUTHOR <EMAIL@ADDRESS>, 2026.\n"
"#\n"
'msgid ""\n'
'msgstr ""\n'
'"Report-Msgid-Bugs-To: EMAIL@ADDRESS\\n"\n'
'"Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n"\n'
'"Language-Team: de <LL@li.org>\\n"\n'
'"Language: de\\n"\n'
)
with tempfile.TemporaryDirectory() as tmp:
path = Path(tmp) / "core.po"
path.write_text(old_header, encoding="utf-8")
write_catalog(path, read_catalog(path))
text = path.read_text() # nocheck: cache-read written by this test
for expected in (
"Kevin Veen-Birkenbach <kevinveenbirkenbach@infinito.nexus>",
"https://infinito.nexus",
"Report-Msgid-Bugs-To: contact@infinito.nexus",
"# This file is distributed under the Infinito.Nexus Community License (Non-Commercial).",
):
self.assertIn(expected, text)
for placeholder in (
"ORGANIZATION",
"FIRST AUTHOR",
"EMAIL@ADDRESS",
"FULL NAME",
"LL@li.org",
):
self.assertNotIn(placeholder, text)
def test_only_final_translations_are_usable(self):
catalog = merge(
build_template([("a", "Done"), ("b", "Fuzzy"), ("c", "Empty")], "core"),
None,
"de",
)
catalog.get("Done", context="a").string = "Fertig"
fuzzy = catalog.get("Fuzzy", context="b")
fuzzy.string = "Unscharf"
fuzzy.flags.add("fuzzy")
self.assertEqual(translations(catalog), {("a", "Done"): "Fertig"})
if __name__ == "__main__":
unittest.main()