138 lines
4.6 KiB
Python
138 lines
4.6 KiB
Python
from __future__ import annotations
|
|
|
|
import unittest
|
|
|
|
from fastapi import FastAPI
|
|
from fastapi.testclient import TestClient
|
|
|
|
from govoplan_core.auth import get_api_principal
|
|
from govoplan_core.core.modules import (
|
|
FrontendModule,
|
|
FrontendRoute,
|
|
ModuleManifest,
|
|
ProductAreaContribution,
|
|
QuickAccessTool,
|
|
)
|
|
from govoplan_core.core.registry import PlatformRegistry, RegistryError
|
|
from govoplan_core.core.views import ViewSurface
|
|
from govoplan_core.server.platform import create_platform_router
|
|
|
|
|
|
def presentation_manifest() -> ModuleManifest:
|
|
return ModuleManifest(
|
|
id="example",
|
|
name="Example",
|
|
version="test",
|
|
frontend=FrontendModule(
|
|
module_id="example",
|
|
routes=(
|
|
FrontendRoute(
|
|
path="/example",
|
|
component="ExamplePage",
|
|
surface_id="example.route.main",
|
|
),
|
|
),
|
|
view_surfaces=(
|
|
ViewSurface(
|
|
id="example.quick.summary",
|
|
module_id="example",
|
|
kind="quick_access",
|
|
label="Example summary",
|
|
),
|
|
),
|
|
product_areas=(
|
|
ProductAreaContribution(
|
|
id="work",
|
|
module_id="example",
|
|
label="Work",
|
|
icon="list-checks",
|
|
surface_ids=("example.route.main",),
|
|
),
|
|
),
|
|
quick_access_tools=(
|
|
QuickAccessTool(
|
|
id="example.summary",
|
|
module_id="example",
|
|
category_id="work",
|
|
label="Example summary",
|
|
surface_id="example.quick.summary",
|
|
icon="list-checks",
|
|
full_page_path="/example",
|
|
required_any=("example:item:read",),
|
|
returned_reference_kinds=("example.item",),
|
|
help_context_id="example.quick.summary",
|
|
),
|
|
),
|
|
),
|
|
)
|
|
|
|
|
|
class PresentationContractTests(unittest.TestCase):
|
|
def test_registry_accepts_owned_presentation_contributions(self) -> None:
|
|
registry = PlatformRegistry()
|
|
registry.register(presentation_manifest())
|
|
|
|
snapshot = registry.validate()
|
|
|
|
self.assertEqual("example", snapshot.manifests[0].id)
|
|
|
|
def test_registry_rejects_unknown_tool_surface(self) -> None:
|
|
manifest = presentation_manifest()
|
|
frontend = manifest.frontend
|
|
assert frontend is not None
|
|
invalid = ModuleManifest(
|
|
id=manifest.id,
|
|
name=manifest.name,
|
|
version=manifest.version,
|
|
frontend=FrontendModule(
|
|
module_id="example",
|
|
routes=frontend.routes,
|
|
quick_access_tools=(
|
|
QuickAccessTool(
|
|
id="example.summary",
|
|
module_id="example",
|
|
category_id="work",
|
|
label="Example summary",
|
|
surface_id="example.missing",
|
|
icon="list-checks",
|
|
),
|
|
),
|
|
),
|
|
)
|
|
registry = PlatformRegistry()
|
|
registry.register(invalid)
|
|
|
|
with self.assertRaisesRegex(RegistryError, "unknown surface"):
|
|
registry.validate()
|
|
|
|
def test_platform_payload_exposes_presentation_catalogue(self) -> None:
|
|
registry = PlatformRegistry()
|
|
registry.register(presentation_manifest())
|
|
registry.validate()
|
|
app = FastAPI()
|
|
app.state.govoplan_registry = registry
|
|
app.include_router(create_platform_router(), prefix="/api/v1")
|
|
app.dependency_overrides[get_api_principal] = lambda: object()
|
|
|
|
with TestClient(app) as client:
|
|
response = client.get("/api/v1/platform/modules")
|
|
|
|
self.assertEqual(200, response.status_code)
|
|
frontend = response.json()["modules"][0]["frontend"]
|
|
self.assertEqual("1", frontend["presentation_contract_version"])
|
|
self.assertEqual("work", frontend["product_areas"][0]["id"])
|
|
self.assertEqual("example.summary", frontend["quick_access_tools"][0]["id"])
|
|
self.assertEqual("1", frontend["quick_access_tools"][0]["contract_version"])
|
|
self.assertEqual(
|
|
["example.item"],
|
|
frontend["quick_access_tools"][0]["returned_reference_kinds"],
|
|
)
|
|
self.assertEqual(
|
|
"example.quick.summary",
|
|
frontend["quick_access_tools"][0]["help_context_id"],
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|