import importlib.util import json from pathlib import Path from unittest.mock import patch _SKILL_ROOT = Path(__file__).resolve().parent.parent def _load_cli(): spec = importlib.util.spec_from_file_location( "refresh_controls", _SKILL_ROOT / "scripts" / "refresh-controls.py" ) mod = importlib.util.module_from_spec(spec) spec.loader.exec_module(mod) return mod _FSBP_HTML = (_SKILL_ROOT / "tests" / "fixtures" / "fsbp_index_sample.html").read_text() _CIS_HTML = (_SKILL_ROOT / "tests" / "fixtures" / "cis_sample.html").read_text() class _FakeResponse: def __init__(self, text: str, status_code: int = 200): self.text = text self.status_code = status_code def raise_for_status(self): if self.status_code >= 400: raise RuntimeError(f"HTTP {self.status_code}") def _fake_get(url, **kw): if "fsbp" in url or "foundational-security-best-practices" in url: return _FakeResponse(_FSBP_HTML) if "cis" in url: return _FakeResponse(_CIS_HTML) return _FakeResponse("") def test_refresh_writes_three_json_files(tmp_path): mod = _load_cli() out_dir = tmp_path / "data" / "controls" with patch("requests.get", side_effect=_fake_get): rc = mod.main(["--output-dir", str(out_dir)]) assert rc == 0 fsbp = json.loads((out_dir / "fsbp.json").read_text()) cis = json.loads((out_dir / "cis.json").read_text()) meta = json.loads((out_dir / "meta.json").read_text()) assert fsbp["source"] == "fsbp" assert "aws_s3_bucket" in fsbp["by_resource_type"] assert any(c["control_id"] == "FSBP S3.5" for c in fsbp["controls"]) assert cis["source"] == "cis" assert any(c["control_id"] == "CIS Account.1" for c in cis["controls"]) assert meta["fsbp"]["url"] assert meta["fsbp"]["fetched_at"] assert meta["cis"]["url"]