Files
document-haness/tests/test_corpus.py
T

74 lines
3.0 KiB
Python

from __future__ import annotations
import tempfile
import unittest
from pathlib import Path
from claridoc.corpus import build_query_from_brief, collect_sources
from claridoc.models import Brief
from claridoc.utils import read_json
ROOT = Path(__file__).resolve().parents[1]
CORPUS = ROOT / "examples" / "corpus" / "llm-wiki-mini"
class CorpusTests(unittest.TestCase):
def test_decision_rationale_chunk_ranks_first(self) -> None:
pack = collect_sources(
CORPUS,
"application-core Spring DI 수동 Configuration 보일러플레이트 선택 이유 대안 가드레일",
top_k=8,
)
self.assertGreaterEqual(len(pack.sources), 4)
first = pack.sources[0]
self.assertEqual(first.path, "raw/branch-notes/feature-application-port-usecase-contract.md")
self.assertEqual(first.heading, "결정 사항")
self.assertIn("수동 등록", first.facts[0])
self.assertIn("D13", first.decision_ids)
def test_paths_are_repository_relative_and_line_ranges_are_recorded(self) -> None:
pack = collect_sources(CORPUS, "application-core 경계 검증", top_k=6)
self.assertTrue(pack.sources)
for source in pack.sources:
self.assertFalse(source.path.startswith("/"))
self.assertTrue(source.url.startswith("repo:///"))
self.assertIsNotNone(source.line_start)
self.assertIsNotNone(source.line_end)
self.assertGreaterEqual(source.line_end or 0, source.line_start or 0)
def test_brief_query_retrieves_rationale_and_current_state(self) -> None:
brief = Brief.from_dict(
read_json(ROOT / "examples" / "briefs" / "application-core-spring-di-blog.json")
)
pack = collect_sources(CORPUS, build_query_from_brief(brief), top_k=12)
paths = {source.path for source in pack.sources}
self.assertIn("raw/branch-notes/feature-application-port-usecase-contract.md", paths)
self.assertIn("wiki/projects/ca-tmpl/clean-architecture-package-layout.md", paths)
def test_heading_without_body_is_not_collected_as_evidence(self) -> None:
pack = collect_sources(CORPUS, "Spring component stereotype scanning", top_k=20)
self.assertFalse(
any(
source.heading == "Spring component stereotype and scanning notes"
and source.facts == ["# Spring component stereotype and scanning notes"]
for source in pack.sources
)
)
def test_missing_default_directories_are_allowed(self) -> None:
with tempfile.TemporaryDirectory() as temp:
root = Path(temp)
(root / "wiki/projects").mkdir(parents=True)
(root / "wiki/projects/example.md").write_text(
"# Example\n\n## 결정\n\n선택 이유와 대안을 기록한다.\n",
encoding="utf-8",
)
pack = collect_sources(root, "선택 이유 대안")
self.assertEqual(len(pack.sources), 1)
if __name__ == "__main__":
unittest.main()