168 lines
6.5 KiB
Python
168 lines
6.5 KiB
Python
from __future__ import annotations
|
|
|
|
import unittest
|
|
|
|
from govoplan_core.core.modules import (
|
|
CapabilityDocumentation,
|
|
DocumentationTopic,
|
|
MigrationSpec,
|
|
ModuleManifest,
|
|
PermissionDefinition,
|
|
RoleTemplate,
|
|
)
|
|
from govoplan_core.core.registry import PlatformRegistry
|
|
from govoplan_core.core.provider_governance import (
|
|
ExternalProviderDeclaration,
|
|
ModuleArchitectureDeclaration,
|
|
ModuleArchitectureDocumentation,
|
|
ModuleMaturityEvidence,
|
|
ProviderBehaviorDeclaration,
|
|
ProviderObjectDeclaration,
|
|
)
|
|
|
|
from govoplan_ops.backend.api.v1.routes import _governance_inventory
|
|
|
|
|
|
class GovernanceInventoryTests(unittest.TestCase):
|
|
def test_inventory_projects_manifest_governance_without_provider_internals(self) -> None:
|
|
registry = PlatformRegistry()
|
|
registry.register(ModuleManifest(
|
|
id="example",
|
|
name="Example",
|
|
version="1.2.3",
|
|
permissions=(
|
|
PermissionDefinition(
|
|
scope="example:item:read",
|
|
label="Read examples",
|
|
description="Read example records.",
|
|
category="Examples",
|
|
level="tenant",
|
|
module_id="example",
|
|
resource="item",
|
|
action="read",
|
|
),
|
|
),
|
|
role_templates=(
|
|
RoleTemplate(
|
|
slug="example_reader",
|
|
name="Example reader",
|
|
description="Reads examples.",
|
|
permissions=("example:item:read",),
|
|
),
|
|
),
|
|
capability_factories={
|
|
"example.lookup": lambda _context: object(),
|
|
"policy.example": lambda _context: object(),
|
|
},
|
|
capability_documentation={
|
|
"example.lookup": CapabilityDocumentation(
|
|
label="Example lookup",
|
|
summary="Resolves examples.",
|
|
),
|
|
},
|
|
documentation=(
|
|
DocumentationTopic(
|
|
id="example.reference",
|
|
title="Example reference",
|
|
summary="Documents the example module.",
|
|
),
|
|
),
|
|
migration_spec=MigrationSpec(module_id="example"),
|
|
architecture=ModuleArchitectureDeclaration(
|
|
layer="governance_accountability",
|
|
kind="governance",
|
|
maturity="vertical_slice",
|
|
evidence=(
|
|
ModuleMaturityEvidence(
|
|
kind="test",
|
|
reference="tests/test_governance_inventory.py",
|
|
summary="Exercises the governance projection.",
|
|
),
|
|
ModuleMaturityEvidence(
|
|
kind="documentation",
|
|
reference="example.reference",
|
|
summary="Documents the example provider.",
|
|
),
|
|
),
|
|
known_limits=("The example has no runtime implementation.",),
|
|
supported_authority_modes=("external_mirror",),
|
|
owned_concepts=("example projections",),
|
|
documentation=ModuleArchitectureDocumentation(
|
|
operations=("example.reference",),
|
|
),
|
|
),
|
|
external_providers=(
|
|
ExternalProviderDeclaration(
|
|
id="example.read",
|
|
module_id="example",
|
|
label="Example reader",
|
|
maturity="read",
|
|
operations=("read", "search"),
|
|
objects=(
|
|
ProviderObjectDeclaration(
|
|
object_type="example.record",
|
|
field_groups=("identity", "summary"),
|
|
authority_modes=("external_mirror",),
|
|
default_authority_mode="external_mirror",
|
|
),
|
|
),
|
|
behavior=ProviderBehaviorDeclaration(
|
|
freshness="Request-time read with a five-minute cache.",
|
|
health="Reported through example.health.",
|
|
max_read_items=100,
|
|
outage="Reads fail closed and retain the last inspected snapshot.",
|
|
classifications=("internal",),
|
|
purposes=("operations",),
|
|
retention="No provider-owned payload is retained.",
|
|
),
|
|
documentation_topic_ids=("example.reference",),
|
|
),
|
|
),
|
|
))
|
|
|
|
payload = _governance_inventory(
|
|
registry,
|
|
external_provider_states={
|
|
"example.read": {
|
|
"configured": True,
|
|
"active": True,
|
|
"health": "warning",
|
|
"freshness": "stale",
|
|
"recovery": "attention",
|
|
}
|
|
},
|
|
)
|
|
|
|
self.assertEqual(payload["summary"]["module_count"], 1)
|
|
self.assertEqual(payload["summary"]["permission_count"], 1)
|
|
self.assertEqual(payload["summary"]["role_template_count"], 1)
|
|
self.assertEqual(payload["summary"]["capability_count"], 2)
|
|
self.assertEqual(payload["summary"]["policy_count"], 1)
|
|
self.assertEqual(payload["summary"]["documented_module_count"], 1)
|
|
self.assertEqual(payload["summary"]["migration_module_count"], 1)
|
|
self.assertEqual(payload["summary"]["architecture_declared_module_count"], 1)
|
|
self.assertEqual(payload["summary"]["external_provider_count"], 1)
|
|
self.assertEqual(
|
|
payload["summary"]["configured_external_provider_count"],
|
|
1,
|
|
)
|
|
self.assertEqual(payload["summary"]["provider_attention_count"], 1)
|
|
self.assertEqual(payload["modules"][0]["architecture"]["maturity"], "vertical_slice")
|
|
self.assertEqual(payload["modules"][0]["external_providers"][0]["id"], "example.read")
|
|
self.assertEqual(
|
|
payload["modules"][0]["external_providers"][0]["runtime_state"][
|
|
"freshness"
|
|
],
|
|
"stale",
|
|
)
|
|
self.assertEqual(payload["modules"][0]["module_id"], "example")
|
|
self.assertNotIn("capability_factories", payload["modules"][0])
|
|
self.assertFalse(any(
|
|
callable(value)
|
|
for value in payload["modules"][0].values()
|
|
))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|