from pathlib import Path from scripts.adapters.zizmor import parse_zizmor_output _FIXTURES = Path(__file__).parent / "fixtures" def test_parses_two_results(): payload = (_FIXTURES / "zizmor_sample.json").read_text() findings = parse_zizmor_output(payload) assert len(findings) == 2 def test_warning_maps_to_medium(): payload = (_FIXTURES / "zizmor_sample.json").read_text() findings = parse_zizmor_output(payload) unpinned = next(f for f in findings if f.rule_id == "unpinned-uses") assert unpinned.tool == "zizmor" assert unpinned.severity == "medium" assert unpinned.file == ".github/workflows/ci.yml" assert unpinned.line == 12 assert unpinned.end_line == 12 assert "actions/checkout" in unpinned.message def test_error_maps_to_high(): payload = (_FIXTURES / "zizmor_sample.json").read_text() findings = parse_zizmor_output(payload) perms = next(f for f in findings if f.rule_id == "excessive-permissions") assert perms.severity == "high" assert perms.line == 5 def test_cwe_extracted_from_rule_tags(): payload = (_FIXTURES / "zizmor_sample.json").read_text() findings = parse_zizmor_output(payload) unpinned = next(f for f in findings if f.rule_id == "unpinned-uses") assert unpinned.cwe == "CWE-829" def test_no_cwe_when_tags_empty(): payload = (_FIXTURES / "zizmor_sample.json").read_text() findings = parse_zizmor_output(payload) perms = next(f for f in findings if f.rule_id == "excessive-permissions") assert perms.cwe is None def test_handles_empty_runs(): findings = parse_zizmor_output('{"version": "2.1.0", "runs": []}') assert findings == [] def test_handles_invalid_json(): findings = parse_zizmor_output("not json") assert findings == []