Verified with the coordinated workspace changes by devkit full run 2026-09-08T225814-186389-0000-3e3ed7cd (all seven phases passed). This shared UI pass does not mark the individual module reviews complete.
118 lines
5.0 KiB
Python
118 lines
5.0 KiB
Python
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
import unittest
|
|
|
|
from govoplan_cases.backend.manifest import get_manifest
|
|
|
|
|
|
REPO_ROOT = Path(__file__).resolve().parents[1]
|
|
|
|
|
|
class CasesInterfaceDocumentationContractTests(unittest.TestCase):
|
|
def test_all_static_topics_have_complete_german_content(self) -> None:
|
|
for topic in get_manifest().documentation:
|
|
german = (topic.translations or {}).get("de", {})
|
|
self.assertEqual({"title", "summary", "body"}, set(german), topic.id)
|
|
self.assertTrue(
|
|
all(str(value).strip() for value in german.values()), topic.id
|
|
)
|
|
|
|
def test_backend_surfaces_and_hierarchy_remain_declared(self) -> None:
|
|
frontend = get_manifest().frontend
|
|
self.assertIsNotNone(frontend)
|
|
surfaces = {item.id: item for item in frontend.view_surfaces} # type: ignore[union-attr]
|
|
self.assertEqual(
|
|
{
|
|
"cases.navigation",
|
|
"cases.list",
|
|
"cases.list.filters",
|
|
"cases.detail",
|
|
"cases.detail.summary",
|
|
"cases.detail.editor",
|
|
"cases.detail.references",
|
|
"cases.detail.timeline",
|
|
"cases.detail.history",
|
|
"cases.detail.access",
|
|
"cases.detail.decision",
|
|
},
|
|
set(surfaces),
|
|
)
|
|
self.assertEqual("cases.list", surfaces["cases.list.filters"].parent_id)
|
|
for surface_id in (
|
|
"cases.detail.summary",
|
|
"cases.detail.editor",
|
|
"cases.detail.references",
|
|
"cases.detail.timeline",
|
|
"cases.detail.history",
|
|
"cases.detail.access",
|
|
"cases.detail.decision",
|
|
):
|
|
self.assertEqual("cases.detail", surfaces[surface_id].parent_id)
|
|
|
|
def test_help_and_consequence_metadata_remain_published(self) -> None:
|
|
topics = {topic.id: topic for topic in get_manifest().documentation}
|
|
context = topics["cases.institutional-context"]
|
|
reference = topics["cases.reference.lifecycle-access-and-evidence"]
|
|
owner_links = topics["cases.workflow.link-owner-references"]
|
|
|
|
self.assertIn("cases.state.read-only", context.metadata["help_contexts"])
|
|
self.assertIn("cases.field.access-grant", reference.metadata["help_contexts"])
|
|
self.assertIn("update_case", reference.metadata["consequence_classes"])
|
|
self.assertIn("close_case", reference.metadata["consequence_classes"])
|
|
self.assertIn("change_access", reference.metadata["consequence_classes"])
|
|
self.assertEqual("reference", reference.metadata["kind"])
|
|
self.assertIn(
|
|
"link_owner_reference",
|
|
owner_links.metadata["consequence_classes"],
|
|
)
|
|
|
|
def test_information_governance_claims_are_bounded_and_documented(self) -> None:
|
|
manifest = get_manifest()
|
|
governance = manifest.information_governance
|
|
self.assertEqual("enforced", governance.temporal_browsing.adoption)
|
|
self.assertEqual("enforced", governance.purpose_aware_access.adoption)
|
|
self.assertEqual("enforced", governance.institutional_context.adoption)
|
|
self.assertEqual("contract_only", governance.retention.adoption)
|
|
self.assertIn("legal holds", governance.retention.limitation or "")
|
|
self.assertTrue(governance.current_authorization_for_historical_reads)
|
|
topics = {topic.id: topic for topic in manifest.documentation}
|
|
purpose = topics["cases.governance.purpose-bound-access"]
|
|
self.assertIn("cases.field.access-purpose", purpose.metadata["help_contexts"])
|
|
self.assertIn("cases.field.allowed-purposes", purpose.metadata["help_contexts"])
|
|
|
|
def test_webui_uses_shared_help_guard_and_confirmation_components(self) -> None:
|
|
list_page = (REPO_ROOT / "webui/src/features/cases/CasesPage.tsx").read_text(
|
|
encoding="utf-8"
|
|
)
|
|
detail_page = (
|
|
REPO_ROOT / "webui/src/features/cases/CaseDetailPage.tsx"
|
|
).read_text(encoding="utf-8")
|
|
access_dialog = (
|
|
REPO_ROOT / "webui/src/features/cases/CaseShareDialog.tsx"
|
|
).read_text(encoding="utf-8")
|
|
|
|
self.assertIn("titleHelp={<DocumentationHelpLink reference={CASES_DOCUMENTATION} />}", list_page)
|
|
self.assertNotIn("helpAction=", list_page)
|
|
for component in (
|
|
"ActionBlockerHint",
|
|
'TextWithHelp as="div" help={<DocumentationHelpLink reference={CASES_DOCUMENTATION} />}',
|
|
"FormField",
|
|
"useUnsavedDraftGuard",
|
|
"QUICK_ACCESS_RESULT_EVENT",
|
|
"linkCaseEvidence",
|
|
"unlinkCaseEvidence",
|
|
):
|
|
self.assertIn(component, detail_page)
|
|
for component in (
|
|
"ConfirmDialog",
|
|
"titleHelp={<DocumentationHelpLink reference={CASES_FIELDS_DOCUMENTATION} />}",
|
|
"ReferenceSelect",
|
|
"useUnsavedDraftGuard",
|
|
):
|
|
self.assertIn(component, access_dialog)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|