from pathlib import Path from scripts.scrape_cis import parse_cis_page _FIXTURES = Path(__file__).parent / "fixtures" def test_parses_cis_unified_controls(): html = (_FIXTURES / "cis_sample.html").read_text() rows = parse_cis_page(html, source_url="https://docs.aws.amazon.com/.../cis.html") by_id = {r.control_id: r for r in rows} assert "CIS Account.1" in by_id a = by_id["CIS Account.1"] assert "Security contact" in a.title assert "v5.0.0 §1.2" in a.requirement assert "v1.2.0 §1.18" in a.requirement assert a.severity == "medium" def test_skips_empty_version_cells(): html = (_FIXTURES / "cis_sample.html").read_text() rows = parse_cis_page(html, source_url="https://docs.aws.amazon.com/.../cis.html") by_id = {r.control_id: r for r in rows} iam5 = by_id["CIS IAM.5"] assert "v1.4.0" not in iam5.requirement assert "v5.0.0 §1.10" in iam5.requirement assert "v1.2.0 §1.2" in iam5.requirement def test_resource_types_via_prefix_map(): html = (_FIXTURES / "cis_sample.html").read_text() rows = parse_cis_page(html, source_url="https://docs.aws.amazon.com/.../cis.html") by_id = {r.control_id: r for r in rows} assert "aws_s3_bucket" in by_id["CIS S3.5"].resource_types assert "aws_iam_user" in by_id["CIS IAM.5"].resource_types assert "aws_cloudtrail" in by_id["CIS CloudTrail.1"].resource_types