feat: add deterministic preview rendering
This commit is contained in:
parent
8c75f4f44d
commit
411f417670
23 changed files with 1413 additions and 142 deletions
|
|
@ -35,7 +35,7 @@ class DocForgeMcpTests(unittest.IsolatedAsyncioTestCase):
|
|||
|
||||
names = tuple(tool.name for tool in response.tools)
|
||||
self.assertEqual(ALL_TOOLS, names)
|
||||
self.assertEqual(9, len(PROPOSAL_TOOLS))
|
||||
self.assertEqual(10, len(PROPOSAL_TOOLS))
|
||||
self.assertFalse(
|
||||
any(
|
||||
token in name
|
||||
|
|
@ -79,8 +79,11 @@ class DocForgeMcpTests(unittest.IsolatedAsyncioTestCase):
|
|||
self.assertFalse(contract["canonical_writes_allowed"])
|
||||
self.assertFalse(contract["project_switching_allowed"])
|
||||
self.assertIn("canonical_writes", contract["excluded_operations"])
|
||||
self.assertIn("arbitrary_renderer_execution", contract["excluded_operations"])
|
||||
self.assertFalse(contract["isolated_changeset_writes_allowed"])
|
||||
self.assertFalse(contract["proposal_access"]["enabled"])
|
||||
self.assertTrue(results[10].structuredContent["configured"])
|
||||
self.assertEqual("stale", results[10].structuredContent["state"])
|
||||
context = results[8].structuredContent
|
||||
self.assertLessEqual(context["estimated_tokens"], 180)
|
||||
self.assertTrue(context["omissions"])
|
||||
|
|
@ -224,6 +227,14 @@ class DocForgeMcpTests(unittest.IsolatedAsyncioTestCase):
|
|||
diff = await session.call_tool(
|
||||
"docforge_get_changeset_diff", {"changeset_id": "mcp-update"}
|
||||
)
|
||||
preview = await session.call_tool(
|
||||
"docforge_preview_changeset",
|
||||
{"changeset_id": "mcp-update", "view_id": "manual"},
|
||||
)
|
||||
undeclared = await session.call_tool(
|
||||
"docforge_preview_changeset",
|
||||
{"changeset_id": "mcp-update", "view_id": "not-declared"},
|
||||
)
|
||||
|
||||
self.assertTrue(contract.structuredContent["proposal_access"]["enabled"])
|
||||
self.assertEqual(
|
||||
|
|
@ -245,6 +256,14 @@ class DocForgeMcpTests(unittest.IsolatedAsyncioTestCase):
|
|||
["update", "create", "move", "delete"],
|
||||
[change["operation"] for change in diff.structuredContent["changes"]],
|
||||
)
|
||||
self.assertEqual("current", preview.structuredContent["state"])
|
||||
self.assertEqual(
|
||||
".docforge/previews/mcp-update/manual.html",
|
||||
preview.structuredContent["preview"]["path"],
|
||||
)
|
||||
self.assertTrue(preview.structuredContent["preview_identity"])
|
||||
self.assertEqual("error", undeclared.structuredContent["status"])
|
||||
self.assertEqual("unknown_render_view", undeclared.structuredContent["error"]["code"])
|
||||
canonical_after = {
|
||||
path.relative_to(root).as_posix(): path.read_bytes()
|
||||
for path in (root / "docs/content").glob("*")
|
||||
|
|
@ -253,6 +272,8 @@ class DocForgeMcpTests(unittest.IsolatedAsyncioTestCase):
|
|||
self.assertEqual(canonical_before, canonical_after)
|
||||
self.assertFalse((root / "docs/content/mcp-node.md").exists())
|
||||
self.assertTrue((root / ".docforge/changesets/mcp-update.json").is_file())
|
||||
self.assertTrue((root / ".docforge/previews/mcp-update/manual.html").is_file())
|
||||
self.assertFalse((root / ".docforge/rendered/manual.html").exists())
|
||||
|
||||
async def test_server_without_writer_rejects_proposal_mutation_structurally(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue