from __future__ import annotations import unittest from claridoc.models import Brief, LintReport from claridoc.prompts import drafting_prompt, planning_prompt, review_prompt, revision_prompt from claridoc.structures import create_outline from tests.helpers import brief_dict, make_sources class PromptTests(unittest.TestCase): def _brief( self, document_type: str = "technical_blog", *, language: str = "ko-KR", style_profile: str = "woowahan_tech_blog_ko", ) -> Brief: data = brief_dict(document_type) data["title"] = "기술적 선택을 설명하는 글" data["language"] = language data["reader_goal"] = "안전한 구현 방식을 선택한다" data["core_message"] = "기술 선택은 문제와 비용을 함께 설명해야 한다." data["constraints"]["style_profile"] = style_profile return Brief.from_dict(data) def _prompts(self, brief: Brief) -> dict[str, str]: sources = make_sources() outline = create_outline(brief, sources) lint_report = LintReport(score=100.0, word_count=0, issues=[], metrics={}) return { "planning": planning_prompt(brief, outline, sources), "drafting": drafting_prompt(brief, outline, sources), "review": review_prompt( brief, outline, sources, "# draft", lint_report, "editor", ), "revision": revision_prompt( brief, outline, sources, "# draft", lint_report, [], ), } def test_korean_blog_prompts_share_experience_prose_contract(self) -> None: prompts = self._prompts(self._brief()) for stage, prompt in prompts.items(): with self.subTest(stage=stage): self.assertIn("korean_first_person_experience_v1", prompt) self.assertIn("저는", prompt) self.assertIn("제가", prompt) self.assertIn("했습니다", prompt) self.assertIn("현재 동작과 기술 설명", prompt) self.assertIn( "semantic order, never as a sentence template", prompts["drafting"], ) self.assertIn("실제 관찰", prompts["review"]) self.assertIn("문서 전체", prompts["revision"]) def test_korean_readme_prompts_share_experience_prose_contract(self) -> None: prompts = self._prompts(self._brief("readme", style_profile="auto")) for prompt in prompts.values(): self.assertIn("korean_first_person_experience_v1", prompt) self.assertIn("저는", prompt) self.assertIn("했습니다", prompt) def test_unrelated_document_types_do_not_receive_experience_contract(self) -> None: briefs = [ self._brief(language="en-US"), self._brief("tutorial", style_profile="auto"), ] for brief in briefs: for prompt in self._prompts(brief).values(): self.assertNotIn("korean_first_person_experience_v1", prompt) if __name__ == "__main__": unittest.main()