audit-labs/control-coverage

Control coverage and blind-spot analysis for audit evidence.

clone: git clone https://gitbay.org/audit-labs/control-coverage.git

v1.0.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"}