Ctrl K
ComunidadGuías…

tests/test_output_language.py

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
"""Output languages: settings, catalogs, fallback and validation."""

import pytest

from src import output_language as ol


@pytest.fixture(autouse=True)
def _reset(monkeypatch):
    for k in ("OUTPUT_LANGUAGES", "DEFAULT_OUTPUT_LANGUAGE", "OUTPUT_CATALOG_DIR"):
        monkeypatch.delenv(k, raising=False)
    ol.reload()
    yield
    ol.reload()


def test_default_is_english_only():
    assert ol.enabled_languages() == ("en",)
    assert ol.default_language() == "en"
    assert ol.language_choices() == [("English", "en")]


def test_german_catalog_is_built_in(monkeypatch):
    monkeypatch.setenv("OUTPUT_LANGUAGES", "de")
    ol.reload()
    assert ol.enabled_languages() == ("en", "de")        # English always offered
    assert ol.t("search.n_hits", "de", n=3) == "**3 Treffer**"
    assert ol.llm_language_name("de") == "German"


def test_default_language_setting(monkeypatch):
    monkeypatch.setenv("OUTPUT_LANGUAGES", "en,de")
    monkeypatch.setenv("DEFAULT_OUTPUT_LANGUAGE", "de")
    ol.reload()
    assert ol.default_language() == "de"
    assert ol.normalize("fr") == "de"                    # not enabled → default


def test_extra_catalog_from_directory_and_fallback(monkeypatch, tmp_path):
    (tmp_path / "nl.toml").write_text(
        '[meta]\nname = "Nederlands"\nllm_name = "Dutch"\n[strings]\n', encoding="utf-8")
    monkeypatch.setenv("OUTPUT_LANGUAGES", "en,nl")
    monkeypatch.setenv("OUTPUT_CATALOG_DIR", str(tmp_path))
    ol.reload()
    assert ("Nederlands", "nl") in ol.language_choices()
    assert ol.llm_language_name("nl") == "Dutch"
    # key missing in nl → English
    assert ol.t("search.n_hits", "nl", n=2) == "**2 hits**"


def test_unknown_language_fails_at_start(monkeypatch):
    monkeypatch.setenv("OUTPUT_LANGUAGES", "en,xx")
    ol.reload()
    with pytest.raises(ValueError, match="xx"):
        ol.enabled_languages()


def test_catalog_with_wrong_placeholder_is_rejected(monkeypatch, tmp_path):
    (tmp_path / "nl.toml").write_text(
        '[meta]\nname = "Nederlands"\n[strings]\n"search.n_hits" = "**{aantal} treffers**"\n',
        encoding="utf-8")
    monkeypatch.setenv("OUTPUT_LANGUAGES", "nl")
    monkeypatch.setenv("OUTPUT_CATALOG_DIR", str(tmp_path))
    ol.reload()
    with pytest.raises(ValueError, match="placeholders"):
        ol.enabled_languages()


def test_builtin_catalogs_are_consistent():
    """Every shipped catalog passes the same validation as a custom one."""
    core = ol._read(ol._BUILTIN_DIR / "en.toml")
    for path in ol._BUILTIN_DIR.glob("*.toml"):
        assert ol.validate_catalog(ol._read(path), core) == [], path.name


def test_orchestrator_passes_language_into_context():
    from src.pipeline.orchestrator import ResearchOrchestrator
    orch = ResearchOrchestrator(None, None, None, output_language="xx")
    assert orch.output_language == "en"                  # not enabled → default