audit-labs/control-coverage
Control coverage and blind-spot analysis for audit evidence.
clone: git clone https://gitbay.org/audit-labs/control-coverage.git
v0.1.0: tests/test_catalog.py · raw
1"""Tests for loading framework catalogs."""
2
3import pytest
4
5from control_coverage import catalog
6
7
8def test_soc2_is_complete_common_criteria():
9 cat = catalog.load("soc2")
10 assert cat.framework == "SOC2"
11 assert cat.complete
12 ids = {c.id for c in cat.controls}
13 # A representative spread across every Common Criteria group.
14 for cc in ["CC1.1", "CC5.3", "CC6.8", "CC7.5", "CC8.1", "CC9.2"]:
15 assert cc in ids
16
17
18def test_soc2_has_all_five_tsc_categories():
19 cat = catalog.load("soc2")
20 families = {c.family for c in cat.controls}
21 assert {"Availability", "Confidentiality", "Processing Integrity", "Privacy"} <= families
22 ids = {c.id for c in cat.controls}
23 for cid in ["C1.1", "PI1.5", "P6.7", "P8.1"]:
24 assert cid in ids
25 assert len(cat.controls) == 61
26
27
28def test_iso_has_all_93_annex_a_controls():
29 cat = catalog.load("iso")
30 assert cat.framework == "ISO"
31 assert cat.complete
32 assert len(cat.controls) == 93
33
34
35def test_nist_is_the_moderate_baseline():
36 cat = catalog.load("nist")
37 assert cat.complete # complete relative to the moderate baseline
38 assert "Moderate" in cat.name
39 assert len(cat.controls) > 150
40 ids = {c.id for c in cat.controls}
41 # A spread across families the ecosystem's rulesets cite and beyond.
42 for cid in ["AC-6", "AU-2", "CM-6", "IA-2", "SC-7", "SI-2", "SR-3"]:
43 assert cid in ids
44
45
46def test_control_code_joins_framework_and_id():
47 cat = catalog.load("soc2")
48 ctrl = next(c for c in cat.controls if c.id == "CC6.1")
49 assert ctrl.code == "SOC2:CC6.1"
50
51
52def test_titles_with_commas_survive_parsing():
53 cat = catalog.load("soc2")
54 ctrl = next(c for c in cat.controls if c.id == "CC1.3")
55 assert "reporting lines" in ctrl.title # flow-scalar comma bug regression
56
57
58def test_aliases_resolve():
59 assert catalog.load("iso 27001").framework == "ISO"
60 assert catalog.load("800-53").framework == "NIST"
61
62
63def test_unknown_framework_raises():
64 with pytest.raises(ValueError, match="unknown framework"):
65 catalog.load("hipaa")
66
67
68def test_load_frameworks_dedupes_and_sorts():
69 cats = catalog.load_frameworks(["NIST", "SOC2", "soc 2"])
70 assert [c.framework for c in cats] == ["NIST", "SOC2"]
71
72
73def test_available_lists_bundled():
74 assert set(catalog.available()) == {"SOC2", "ISO", "NIST"}