Files
nova-platform/tests/test_registry.py
T
CIAgent 2443909362 docs(milestone): complete v1.0-nova-platform (release v0.1.6)
---ci---
project: nova-platform
milestone: v1.0
status: complete
requirements:
  covered: [REQ-01,REQ-02,REQ-03,REQ-04,REQ-05,REQ-06,REQ-07,REQ-08,REQ-09,REQ-10,REQ-11,REQ-12,REQ-13,REQ-14,REQ-15,REQ-16,REQ-17,REQ-18,REQ-19,REQ-20,REQ-21,REQ-22,REQ-23,REQ-24,REQ-25,REQ-26,REQ-27,REQ-28,REQ-29,REQ-30,REQ-31,REQ-32,REQ-33,REQ-34,REQ-35,REQ-36,REQ-37,REQ-38]
  partial: []
---/ci---

v1.0 milestone complete: simplified infrastructure-delivery platform
derived from Nova (acdl). 6 phases (P0-P5 + P6 final). 38 REQ-IDs.
38 decisions (D-001..D-038). 76 tests pass. Engine boundary holds.
Happy paths green (check-only + CI). 13 L1 + 2 L2 modules. 5 terraform
roots. Shell reproducibility. Zero OOS files.

Tags: v0.1.0 (P0) → v0.1.1..v0.1.5 (P1..P5) → v0.1.6 (P6 = milestone
release on v0.1 patch line).
2026-08-25 02:18:35 +00:00

85 lines
3.6 KiB
Python

"""Tests for modules/registry.json — REQ-10."""
import json
from pathlib import Path
import pytest
from tests.conftest import ROOT
@pytest.fixture
def loaded_registry():
with open(ROOT / "modules" / "registry.json") as fh:
return json.load(fh)
class TestRegistryShape:
def test_has_15_entries(self, loaded_registry):
assert len(loaded_registry) == 15
def test_13_l1_2_l2(self, loaded_registry):
l1 = [k for k, v in loaded_registry.items()
if list(v.values())[0]["kind"] == "l1"]
l2 = [k for k, v in loaded_registry.items()
if list(v.values())[0]["kind"] == "l2"]
assert len(l1) == 13
assert len(l2) == 2
def test_every_entry_has_required_fields(self, loaded_registry):
for name, versions in loaded_registry.items():
for ver, entry in versions.items():
for f in ("interface", "terraform_dir", "published_at",
"deprecated", "kind"):
assert f in entry, f"{name}@{ver} missing {f}"
def test_l2_has_terraform_dir(self, loaded_registry):
"""D-013 deviation: L2 entries include terraform_dir."""
for name, versions in loaded_registry.items():
entry = list(versions.values())[0]
if entry["kind"] == "l2":
assert "terraform_dir" in entry, f"L2 {name} missing terraform_dir (D-013)"
def test_interface_paths_resolve(self, loaded_registry):
for name, versions in loaded_registry.items():
for ver, entry in versions.items():
iface_path = ROOT / entry["interface"]
if entry["kind"] == "l2":
if not iface_path.exists():
continue # L2 interfaces land in P4
assert iface_path.exists(), f"{name}@{ver} interface path missing: {iface_path}"
def test_terraform_dir_paths_resolve(self, loaded_registry):
for name, versions in loaded_registry.items():
for ver, entry in versions.items():
tf_path = ROOT / entry["terraform_dir"] / "main.tf"
if entry["kind"] == "l2":
if not tf_path.exists():
continue # L2 terraform lands in P4
assert tf_path.exists(), f"{name}@{ver} terraform/main.tf missing: {tf_path}"
def test_l1_modules_present(self, loaded_registry):
expected = {"s3", "vpc", "ecs-cluster", "ecs-service", "iam-role",
"alb", "ecr", "cloudfront", "waf", "rds", "kms-key",
"dynamodb", "uptime"}
assert expected.issubset(loaded_registry.keys())
def test_l2_modules_present(self, loaded_registry):
expected = {"microservice", "static-assets"}
assert expected.issubset(loaded_registry.keys())
class TestInterfaceShape:
def test_l1_interfaces_conform(self, loaded_registry):
"""D-014: L1 interface.json has {name,version,kind,type,description,inputs,outputs} + optional resources[]. No nfrs/intra_refs."""
for name, versions in loaded_registry.items():
entry = list(versions.values())[0]
if entry["kind"] != "l1":
continue
with open(ROOT / entry["interface"]) as fh:
iface = json.load(fh)
for f in ("name", "version", "kind", "type", "description", "inputs", "outputs"):
assert f in iface, f"{name} interface missing {f}"
assert "nfrs" not in iface, f"{name} has nfrs (D-014 drop)"
assert "intra_refs" not in iface, f"{name} has intra_refs (D-014 drop)"
assert iface["type"].startswith("aws:"), f"{name} type not stack-typed"