from __future__ import annotations import unittest from govoplan_core.core.files import ( CAPABILITY_FILES_ARTIFACT_STORE, ManagedArtifactRef, ManagedArtifactStore, ManagedArtifactWriteRequest, ) from govoplan_core.core.templates import ( CAPABILITY_TEMPLATE_CATALOG, CAPABILITY_TEMPLATE_RENDERER, TemplateCatalogProvider, TemplateRenderRequest, TemplateRendererProvider, ) class _Catalog: def list_templates(self, session, principal, **kwargs): del session, principal, kwargs return () def get_template(self, session, principal, **kwargs): del session, principal, kwargs return None def check_compatibility(self, session, principal, **kwargs): del session, principal, kwargs return None class _Renderer: def render(self, session, principal, *, request): del session, principal, request return None class _Store: def store_artifact(self, session, principal, *, request): del session, principal return ManagedArtifactRef( file_asset_id="file-1", file_version_id="version-1", filename=request.filename, display_path=request.filename, content_type=request.content_type, size_bytes=len(request.payload), sha256="0" * 64, ) class TemplateContractTests(unittest.TestCase): def test_capability_names_and_runtime_protocols_are_stable(self) -> None: self.assertEqual("templates.catalog", CAPABILITY_TEMPLATE_CATALOG) self.assertEqual("templates.renderer", CAPABILITY_TEMPLATE_RENDERER) self.assertEqual("files.artifact_store", CAPABILITY_FILES_ARTIFACT_STORE) self.assertIsInstance(_Catalog(), TemplateCatalogProvider) self.assertIsInstance(_Renderer(), TemplateRendererProvider) self.assertIsInstance(_Store(), ManagedArtifactStore) def test_requests_do_not_expose_consumer_or_files_models(self) -> None: render = TemplateRenderRequest(template_id="template-1") artifact = ManagedArtifactWriteRequest( filename="result.html", payload=b"result", content_type="text/html", ) self.assertEqual((), render.items) self.assertEqual("preview", render.mode) self.assertEqual("Generated", artifact.folder) if __name__ == "__main__": unittest.main()