import pytest from types import SimpleNamespace from docx import Document from genesis.data_models import ParsedTemplate, ChapterMarker from genesis.writer.orchestrator import WriteOrchestrator from genesis.writer.models import ChapterContent class FakeEngine: def chat_structured(self, *, session_id, prompt, variables, schema, retry_count=2): # 返回一个固定章节内容(title + 一个段落块) return SimpleNamespace( data={"title": variables["title"], "blocks": [{"type": "paragraph", "text": "自动生成的内容"}]}, status="ok", ) def _make_template(path): doc = Document() doc.add_paragraph("はじめに", style="Heading 1") doc.add_paragraph("{{section:introduction}}") doc.save(path) def _ss(template_path): parsed = ParsedTemplate( file_name=template_path, sections=[ ChapterMarker(type="heading", name="はじめに", level=1), ChapterMarker(type="placeholder", name="section:introduction", level=0), ], placeholders={}, styles={"defined": ["Heading 1"], "used": ["Heading 1"]}, ) return SimpleNamespace(template=parsed) def test_generate_produces_filled_docx(tmp_path): tpl = tmp_path / "tpl.docx" out = tmp_path / "out.docx" _make_template(str(tpl)) orch = WriteOrchestrator() contents = orch.generate(_ss(str(tpl)), str(out), samples_dir="nonexistent_dir_xyz", engine=FakeEngine()) assert isinstance(contents, list) and len(contents) == 1 # 输出 docx 含注入文本且无残留异常 loaded = Document(str(out)) joined = "\n".join(p.text for p in loaded.paragraphs) assert "自动生成的内容" in joined