feat(writer): add WriteOrchestrator.generate (vertical slice, real DocxInjector.inject)
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
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
|
||||
Reference in New Issue
Block a user