from __future__ import annotations from pathlib import Path import pytest import scripts.common as common def write_page(path: Path, text: str) -> None: path.parent.mkdir(parents=True, exist_ok=True) path.write_text(text, encoding="utf-8") def patch_root( monkeypatch: pytest.MonkeyPatch, root: Path, ) -> None: monkeypatch.setattr(common, "ZPWIKI_ROOT", root) monkeypatch.setattr(common, "PAGES_ROOT", root / "pages") def test_yaml_metadata_and_title_have_priority( tmp_path: Path, monkeypatch: pytest.MonkeyPatch, ) -> None: root = tmp_path / "zpwiki" page = root / "pages" / "student" / "README.md" write_page( page, """--- title: YAML názov published: true taxonomy: category: [dp2027] tag: [rag, nlp] author: Daniel Hladek --- # Markdown názov Obsah. """, ) patch_root(monkeypatch, root) document = common.load_zpwiki_page(page) assert document["path"] == "pages/student/README.md" assert document["title"] == "YAML názov" assert document["published"] is True assert document["categories"] == ["dp2027"] assert document["tags"] == ["rag", "nlp"] assert document["author"] == "Daniel Hladek" assert document["content"] == "# Markdown názov\n\nObsah." def test_first_markdown_heading_is_title_fallback( tmp_path: Path, monkeypatch: pytest.MonkeyPatch, ) -> None: root = tmp_path / "zpwiki" page = root / "pages" / "translation" / "README.md" write_page( page, """```markdown # Toto nie je názov dokumentu ``` # **Strojový** [preklad](https://example.com) Obsah. """, ) patch_root(monkeypatch, root) document = common.load_zpwiki_page(page) assert document["title"] == "Strojový preklad" def test_parent_directory_is_title_fallback( tmp_path: Path, monkeypatch: pytest.MonkeyPatch, ) -> None: root = tmp_path / "zpwiki" page = root / "pages" / "patrik_pavlisin" / "README.md" write_page(page, "Text bez YAML title a bez nadpisu.") patch_root(monkeypatch, root) document = common.load_zpwiki_page(page) assert document["title"] == "Patrik Pavlisin" @pytest.mark.parametrize( ("value", "expected"), [ (True, True), (False, False), (1, True), (0, False), ("true", True), ("ÁNO", True), ("false", False), ("nie", False), (None, None), ("neznáma hodnota", None), ], ) def test_optional_bool_normalization(value, expected) -> None: assert common.normalize_optional_bool(value) is expected def test_normalize_list_removes_empty_values_and_duplicates() -> None: assert common.normalize_list("rag, nlp, rag, ") == ["rag", "nlp"] assert common.normalize_list(["rag", "", "rag", "nlp"]) == [ "rag", "nlp", ] assert common.normalize_list(None) == [] def test_json_roundtrip(tmp_path: Path) -> None: path = tmp_path / "nested" / "data.json" value = {"text": "Ján Pták", "published": True} common.write_json(path, value) assert common.read_json(path) == value