2443909362
---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).
85 lines
3.6 KiB
Python
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" |