| """Tests for the SARIF output generator.""" |
|
|
| import json |
| import os |
| import sys |
| import tempfile |
| import unittest |
|
|
| sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) |
|
|
| from shield_agents.report.sarif import SARIFGenerator |
|
|
|
|
| class TestSARIFGenerator(unittest.TestCase): |
| """Test the SARIF generator.""" |
|
|
| def setUp(self): |
| self.generator = SARIFGenerator() |
|
|
| def test_basic_sarif_structure(self): |
| findings = [ |
| {"title": "SQL Injection", "severity": "CRITICAL", "category": "injection", |
| "file": "app.py", "line": 10, "description": "SQL injection found", |
| "rule_id": "SAST-001", "source": "SAST", "agent": "SAST", "cwe": "CWE-89"} |
| ] |
| sarif = self.generator.generate(findings) |
|
|
| self.assertEqual(sarif["version"], "2.1.0") |
| self.assertIn("runs", sarif) |
| self.assertEqual(len(sarif["runs"]), 1) |
| self.assertIn("tool", sarif["runs"][0]) |
| self.assertIn("results", sarif["runs"][0]) |
|
|
| def test_sarif_severity_mapping(self): |
| findings = [ |
| {"title": "Critical Issue", "severity": "CRITICAL", "category": "x", |
| "rule_id": "R1", "source": "SAST", "agent": "SAST"}, |
| {"title": "Medium Issue", "severity": "MEDIUM", "category": "x", |
| "rule_id": "R2", "source": "SAST", "agent": "SAST"}, |
| ] |
| sarif = self.generator.generate(findings) |
| results = sarif["runs"][0]["results"] |
|
|
| self.assertEqual(results[0]["level"], "error") |
| self.assertEqual(results[1]["level"], "warning") |
|
|
| def test_sarif_file_location(self): |
| findings = [ |
| {"title": "Issue", "severity": "HIGH", "category": "x", |
| "file": "/home/user/project/app.py", "line": 42, |
| "rule_id": "R1", "source": "SAST", "agent": "SAST"} |
| ] |
| sarif = self.generator.generate(findings, target_path="/home/user/project") |
| result = sarif["runs"][0]["results"][0] |
|
|
| self.assertIn("locations", result) |
| self.assertEqual(result["locations"][0]["physicalLocation"]["artifactLocation"]["uri"], "app.py") |
| self.assertEqual(result["locations"][0]["physicalLocation"]["region"]["startLine"], 42) |
|
|
| def test_sarif_save(self): |
| findings = [ |
| {"title": "Test", "severity": "LOW", "category": "x", |
| "rule_id": "R1", "source": "SAST", "agent": "SAST"} |
| ] |
| with tempfile.NamedTemporaryFile(suffix=".sarif", delete=False) as f: |
| path = f.name |
|
|
| self.generator.save(findings, path) |
|
|
| with open(path, "r") as f: |
| sarif = json.load(f) |
|
|
| self.assertEqual(sarif["version"], "2.1.0") |
| os.unlink(path) |
|
|
|
|
| if __name__ == "__main__": |
| unittest.main() |
|
|