feat: implement institutional governance and recovery architecture
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import hashlib
|
||||
import json
|
||||
from pathlib import Path
|
||||
import unittest
|
||||
|
||||
from govoplan_core.core.configuration_packages import (
|
||||
ConfigurationPackageManifest,
|
||||
ConfigurationPreflightContext,
|
||||
configuration_package_claim_issues,
|
||||
dry_run_configuration_package,
|
||||
)
|
||||
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
PACKAGE_ROOT = ROOT / "packages"
|
||||
|
||||
|
||||
class ConfigurationPackageArtifactTests(unittest.TestCase):
|
||||
def test_product_package_manifests_are_portable_and_evidence_backed(self) -> None:
|
||||
paths = tuple(sorted(PACKAGE_ROOT.glob("*/*/package.json")))
|
||||
self.assertGreaterEqual(len(paths), 2)
|
||||
package_ids: set[str] = set()
|
||||
|
||||
for path in paths:
|
||||
manifest = ConfigurationPackageManifest.from_mapping(
|
||||
json.loads(path.read_text(encoding="utf-8"))
|
||||
)
|
||||
self.assertNotIn(manifest.package_id, package_ids)
|
||||
package_ids.add(manifest.package_id)
|
||||
self.assertEqual((), configuration_package_claim_issues(manifest))
|
||||
for evidence in manifest.evidence:
|
||||
evidence_path = ROOT / evidence.reference
|
||||
self.assertTrue(
|
||||
evidence_path.is_file(),
|
||||
f"Missing evidence {evidence.reference} for {manifest.package_id}",
|
||||
)
|
||||
if evidence.checksum is not None:
|
||||
self.assertEqual(
|
||||
evidence.checksum,
|
||||
"sha256:" + hashlib.sha256(evidence_path.read_bytes()).hexdigest(),
|
||||
f"Stale evidence checksum for {manifest.package_id}: {evidence.reference}",
|
||||
)
|
||||
for requirement in (
|
||||
*manifest.required_modules,
|
||||
*manifest.optional_modules,
|
||||
):
|
||||
repository = ROOT.parent / (
|
||||
"govoplan-" + requirement.module_id.replace("_", "-")
|
||||
)
|
||||
self.assertTrue(
|
||||
repository.is_dir(),
|
||||
f"Missing repository for {requirement.module_id}",
|
||||
)
|
||||
|
||||
result = dry_run_configuration_package(
|
||||
manifest,
|
||||
(),
|
||||
ConfigurationPreflightContext(
|
||||
installed_modules={
|
||||
item.module_id: item.version or "workspace"
|
||||
for item in manifest.required_modules
|
||||
},
|
||||
capabilities=frozenset(manifest.required_capabilities),
|
||||
),
|
||||
)
|
||||
self.assertFalse(
|
||||
any(item.severity == "blocker" for item in result.diagnostics),
|
||||
tuple(item.to_dict() for item in result.diagnostics),
|
||||
)
|
||||
|
||||
self.assertIn("product.governed-communication", package_ids)
|
||||
self.assertIn("product.governed-data-assurance", package_ids)
|
||||
self.assertIn("product.service-to-decision", package_ids)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user