import json from pathlib import Path import tempfile import unittest from aaisa.config import Config from aaisa.artifacts import classify from aaisa.models import Severity from aaisa.reporters import json_report, sarif_report from aaisa.scanner import Scanner class ScannerTests(unittest.TestCase): def test_threat_model_is_not_misclassified_as_model_metadata(self) -> None: self.assertEqual(classify(Path("THREAT_MODEL.md")), "document") self.assertEqual(classify(Path("model-card.yaml")), "model-metadata") def test_scan_hashes_artifacts_and_skips_symlinks(self) -> None: with tempfile.TemporaryDirectory() as directory: root = Path(directory) (root / "safe.txt").write_text("ordinary content\n", encoding="utf-8") try: (root / "outside-link").symlink_to(Path(directory).parent) except OSError: pass report = Scanner(Config(minimum_severity=Severity.INFO)).scan(root) self.assertEqual([item["path"] for item in report.artifacts], ["safe.txt"]) self.assertEqual(len(report.artifacts[0]["sha256"]), 64) def test_oversize_artifact_is_an_error(self) -> None: with tempfile.TemporaryDirectory() as directory: path = Path(directory) / "large.txt" path.write_text("x" * 20, encoding="utf-8") report = Scanner(Config(max_file_bytes=10)).scan(Path(directory)) self.assertEqual(report.artifacts, []) self.assertEqual(report.errors[0]["path"], "large.txt") def test_reports_are_machine_readable(self) -> None: with tempfile.TemporaryDirectory() as directory: path = Path(directory) / "requirements.txt" path.write_text("requests>=2\n", encoding="utf-8") report = Scanner().scan(Path(directory)) json_payload = json.loads(json_report(report)) sarif_payload = json.loads(sarif_report(report)) self.assertEqual(json_payload["schema_version"], "1.0.0") self.assertEqual(len(json_payload["findings"][0]["fingerprint"]), 64) self.assertEqual(sarif_payload["version"], "2.1.0") self.assertEqual(sarif_payload["runs"][0]["results"][0]["ruleId"], "AAISA-DEPENDENCY-001") self.assertEqual(len(sarif_payload["runs"][0]["results"][0]["partialFingerprints"]["aaisa/v1"]), 64) if __name__ == "__main__": unittest.main()