generated from coulomb/repo-seed
Add render export adapter contract
This commit is contained in:
107
tests/test_render_export_contract.py
Normal file
107
tests/test_render_export_contract.py
Normal file
@@ -0,0 +1,107 @@
|
||||
from markitect_tool.diagnostics import has_error
|
||||
from markitect_tool.render import (
|
||||
RENDER_EXPORT_ADAPTER_ENTRY_POINT_GROUP,
|
||||
RENDER_EXPORT_SCHEMA_VERSION,
|
||||
RenderExportAdapterDescriptor,
|
||||
RenderExportAdapterRegistry,
|
||||
RenderExportRequest,
|
||||
default_render_export_adapter_registry,
|
||||
render_capability_diagnostics,
|
||||
render_export_registry_descriptor,
|
||||
render_with_adapter,
|
||||
)
|
||||
|
||||
|
||||
def test_render_export_registry_lists_fake_adapter_and_serializes_descriptor():
|
||||
registry = default_render_export_adapter_registry()
|
||||
|
||||
descriptor = registry.get("render.fake")
|
||||
data = descriptor.to_dict()
|
||||
|
||||
assert data["kind"] == "render-export"
|
||||
assert data["operations"] == ["inspect-profile", "export-source", "render-artifact"]
|
||||
assert "pdf" in data["output_profiles"]
|
||||
assert registry.to_dict()["count"] >= 1
|
||||
|
||||
|
||||
def test_fake_render_export_adapter_exports_source_and_provenance():
|
||||
request = RenderExportRequest(
|
||||
source="# Demo\n\nBody.",
|
||||
operation="export-source",
|
||||
profile="docs",
|
||||
source_path="docs/demo.md",
|
||||
)
|
||||
|
||||
result = render_with_adapter(request)
|
||||
|
||||
assert result.valid
|
||||
assert result.schema_version == RENDER_EXPORT_SCHEMA_VERSION
|
||||
assert result.exported_source.startswith("<!-- render.fake profile=docs")
|
||||
assert result.artifacts[0].role == "renderer-source"
|
||||
assert result.artifacts[0].media_type == "text/markdown"
|
||||
assert result.provenance[0].source_path == "docs/demo.md"
|
||||
assert result.provenance[0].artifact_id == result.artifacts[0].artifact_id
|
||||
|
||||
|
||||
def test_fake_render_export_adapter_renders_artifact_without_external_renderer():
|
||||
request = RenderExportRequest(source="# Demo", operation="render-artifact", profile="pdf")
|
||||
|
||||
result = render_with_adapter(request)
|
||||
|
||||
assert result.valid
|
||||
assert result.artifacts[0].role == "rendered-artifact"
|
||||
assert result.artifacts[0].digest.startswith("sha256:")
|
||||
assert result.metadata["external_renderer_invoked"] is False
|
||||
|
||||
|
||||
def test_render_export_request_validation_reports_unsupported_profile():
|
||||
request = RenderExportRequest(source="# Demo", operation="render-artifact", profile="epub")
|
||||
|
||||
result = render_with_adapter(request)
|
||||
|
||||
assert not result.valid
|
||||
assert result.diagnostics[0].code == "render.profile_unsupported"
|
||||
|
||||
|
||||
def test_render_capability_policy_blocks_declared_safety_flags():
|
||||
descriptor = RenderExportAdapterDescriptor(
|
||||
id="render.external",
|
||||
version="1",
|
||||
name="External Renderer",
|
||||
operations=["render-artifact"],
|
||||
input_contracts=["Markdown"],
|
||||
output_profiles=["pdf"],
|
||||
artifact_media_types=["application/pdf"],
|
||||
factory=lambda: object(),
|
||||
safety={"external_process": True, "filesystem_write": True},
|
||||
)
|
||||
request = RenderExportRequest(
|
||||
source="# Demo",
|
||||
operation="render-artifact",
|
||||
profile="pdf",
|
||||
policy={"external_process": False, "filesystem_write": False},
|
||||
)
|
||||
|
||||
diagnostics = render_capability_diagnostics(descriptor, request)
|
||||
|
||||
assert len(diagnostics) == 1
|
||||
assert diagnostics[0].code == "render.capability_blocked"
|
||||
assert diagnostics[0].details["capabilities"] == ["external_process", "filesystem_write"]
|
||||
|
||||
|
||||
def test_render_export_registry_descriptor_points_to_entry_point_group():
|
||||
descriptor = render_export_registry_descriptor()
|
||||
|
||||
assert descriptor.id == "render.export-registry"
|
||||
assert descriptor.kind == "render-export-registry"
|
||||
assert descriptor.metadata["entry_point_group"] == RENDER_EXPORT_ADAPTER_ENTRY_POINT_GROUP
|
||||
assert descriptor.metadata["concrete_renderer_execution_required"] is False
|
||||
|
||||
|
||||
def test_render_result_validity_tracks_error_diagnostics():
|
||||
request = RenderExportRequest(source="", operation="render-artifact", profile="plain")
|
||||
|
||||
result = render_with_adapter(request)
|
||||
|
||||
assert has_error(result.diagnostics)
|
||||
assert not result.valid
|
||||
Reference in New Issue
Block a user