133 lines
3.1 KiB
Python
133 lines
3.1 KiB
Python
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
|