feat: add institutional governance and recovery contracts
This commit is contained in:
@@ -0,0 +1,242 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import unittest
|
||||
|
||||
from govoplan_core.core.configuration_packages import (
|
||||
ConfigurationModuleRequirement,
|
||||
ConfigurationPackageEvidence,
|
||||
ConfigurationPackageManifest,
|
||||
ConfigurationPackageParent,
|
||||
ConfigurationPreflightContext,
|
||||
ConfigurationProviderExpectation,
|
||||
dry_run_configuration_package,
|
||||
validate_configuration_package_derivation,
|
||||
)
|
||||
|
||||
|
||||
def _evidence(*kinds: str) -> tuple[ConfigurationPackageEvidence, ...]:
|
||||
return tuple(
|
||||
ConfigurationPackageEvidence(
|
||||
kind=kind, # type: ignore[arg-type]
|
||||
reference=f"evidence/{kind}.json",
|
||||
summary=f"Evidence for {kind}.",
|
||||
checksum=f"sha256:{'a' * 64}",
|
||||
)
|
||||
for kind in kinds
|
||||
)
|
||||
|
||||
|
||||
class ConfigurationPackageArchitectureTests(unittest.TestCase):
|
||||
def test_legacy_package_defaults_to_product_and_round_trips(self) -> None:
|
||||
package = ConfigurationPackageManifest.from_mapping(
|
||||
{"package_id": "example", "name": "Example", "version": "1.0.0"}
|
||||
)
|
||||
|
||||
self.assertEqual(package.package_class, "product")
|
||||
self.assertEqual(
|
||||
ConfigurationPackageManifest.from_mapping(package.to_dict()),
|
||||
package,
|
||||
)
|
||||
|
||||
def test_reference_package_requires_operational_evidence(self) -> None:
|
||||
with self.assertRaisesRegex(ValueError, "accessibility"):
|
||||
ConfigurationPackageManifest(
|
||||
package_id="reference.example",
|
||||
name="Example reference",
|
||||
version="1.0.0",
|
||||
package_class="reference",
|
||||
evidence=_evidence("target_test", "recovery"),
|
||||
)
|
||||
|
||||
def test_reference_evidence_requires_content_checksums(self) -> None:
|
||||
with self.assertRaisesRegex(ValueError, "without checksums"):
|
||||
ConfigurationPackageManifest(
|
||||
package_id="reference.unbound",
|
||||
name="Unbound reference",
|
||||
version="1.0.0",
|
||||
package_class="reference",
|
||||
evidence=tuple(
|
||||
ConfigurationPackageEvidence(
|
||||
kind=kind, # type: ignore[arg-type]
|
||||
reference=f"evidence/{kind}.json",
|
||||
summary=f"{kind} evidence.",
|
||||
checksum=(
|
||||
None
|
||||
if kind == "target_test"
|
||||
else f"sha256:{'b' * 64}"
|
||||
),
|
||||
)
|
||||
for kind in (
|
||||
"target_test",
|
||||
"recovery",
|
||||
"security",
|
||||
"operations",
|
||||
"accessibility",
|
||||
"privacy",
|
||||
"documentation",
|
||||
)
|
||||
),
|
||||
)
|
||||
|
||||
def test_integration_package_preflight_checks_provider_contract_and_health(self) -> None:
|
||||
package = ConfigurationPackageManifest(
|
||||
package_id="integration.example",
|
||||
name="Example integration",
|
||||
version="1.0.0",
|
||||
package_class="integration",
|
||||
evidence=_evidence(
|
||||
"target_test", "recovery", "operations", "documentation"
|
||||
),
|
||||
provider_expectations=(
|
||||
ConfigurationProviderExpectation(
|
||||
provider_id="connectors.example",
|
||||
authority_mode="external_mirror",
|
||||
minimum_maturity="read",
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
healthy = dry_run_configuration_package(
|
||||
package,
|
||||
(),
|
||||
ConfigurationPreflightContext(
|
||||
external_provider_declarations={
|
||||
"connectors.example": {
|
||||
"authority_modes": ["external_mirror"],
|
||||
"maturity": "synchronize",
|
||||
}
|
||||
},
|
||||
external_provider_states={
|
||||
"connectors.example": {"health": "healthy"}
|
||||
},
|
||||
),
|
||||
)
|
||||
unhealthy = dry_run_configuration_package(
|
||||
package,
|
||||
(),
|
||||
ConfigurationPreflightContext(
|
||||
external_provider_declarations={
|
||||
"connectors.example": {
|
||||
"authority_modes": ["external_authoritative"],
|
||||
"maturity": "discover",
|
||||
}
|
||||
},
|
||||
external_provider_states={
|
||||
"connectors.example": {"health": "error"}
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
self.assertFalse(
|
||||
any(item.severity == "blocker" for item in healthy.diagnostics)
|
||||
)
|
||||
self.assertEqual(
|
||||
{
|
||||
"external_provider_authority_mode_unsupported",
|
||||
"external_provider_maturity_insufficient",
|
||||
"external_provider_unhealthy",
|
||||
},
|
||||
{item.code for item in unhealthy.diagnostics},
|
||||
)
|
||||
|
||||
def test_provider_preflight_selects_the_requested_runtime_binding(self) -> None:
|
||||
package = ConfigurationPackageManifest(
|
||||
package_id="integration.calendar",
|
||||
name="Calendar integration",
|
||||
version="1.0.0",
|
||||
package_class="integration",
|
||||
evidence=_evidence(
|
||||
"target_test", "recovery", "operations", "documentation"
|
||||
),
|
||||
provider_expectations=(
|
||||
ConfigurationProviderExpectation(
|
||||
provider_id="calendar.caldav_sync",
|
||||
authority_mode="governed_sync",
|
||||
minimum_maturity="synchronize",
|
||||
binding_ref="calendar:sync-source:required",
|
||||
freshness_expectation="current",
|
||||
recovery_expectation="ready",
|
||||
),
|
||||
),
|
||||
)
|
||||
context = ConfigurationPreflightContext(
|
||||
external_provider_declarations={
|
||||
"calendar.caldav_sync": {
|
||||
"authority_modes": ["governed_sync"],
|
||||
"maturity": "synchronize",
|
||||
"behavior": {},
|
||||
}
|
||||
},
|
||||
external_provider_states={
|
||||
"calendar.caldav_sync": {
|
||||
"health": "warning",
|
||||
"bindings": [
|
||||
{
|
||||
"binding_ref": "calendar:sync-source:other",
|
||||
"authority_mode": "governed_sync",
|
||||
"health": "error",
|
||||
"freshness": "stale",
|
||||
"recovery": "attention",
|
||||
},
|
||||
{
|
||||
"binding_ref": "calendar:sync-source:required",
|
||||
"authority_mode": "governed_sync",
|
||||
"health": "healthy",
|
||||
"freshness": "current",
|
||||
"recovery": "ready",
|
||||
},
|
||||
],
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
result = dry_run_configuration_package(package, (), context)
|
||||
|
||||
self.assertFalse(
|
||||
any(item.severity == "blocker" for item in result.diagnostics)
|
||||
)
|
||||
|
||||
def test_derived_package_may_tighten_but_not_remove_parent_constraints(self) -> None:
|
||||
parent = ConfigurationPackageManifest(
|
||||
package_id="product.base",
|
||||
name="Base",
|
||||
version="1.0.0",
|
||||
required_modules=(
|
||||
ConfigurationModuleRequirement("connectors", "1.0.0"),
|
||||
),
|
||||
required_capabilities=("connectors.profiles",),
|
||||
provider_expectations=(
|
||||
ConfigurationProviderExpectation(
|
||||
provider_id="connectors.example",
|
||||
authority_mode="external_mirror",
|
||||
minimum_maturity="read",
|
||||
),
|
||||
),
|
||||
)
|
||||
child = ConfigurationPackageManifest(
|
||||
package_id="sector.example",
|
||||
name="Sector example",
|
||||
version="1.0.0",
|
||||
package_class="sector",
|
||||
parents=(
|
||||
ConfigurationPackageParent("product.base", "1.0.0"),
|
||||
),
|
||||
evidence=_evidence("documentation"),
|
||||
)
|
||||
|
||||
codes = {
|
||||
item.code
|
||||
for item in validate_configuration_package_derivation(child, parent)
|
||||
}
|
||||
self.assertEqual(
|
||||
{
|
||||
"package_parent_module_constraint_loosened",
|
||||
"package_parent_capability_constraint_loosened",
|
||||
"package_parent_provider_constraint_removed",
|
||||
},
|
||||
codes,
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user