Files
markitect-tool/tests/test_render_export_contract.py

108 lines
3.8 KiB
Python

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