50 lines
2.0 KiB
Python
50 lines
2.0 KiB
Python
from contextlib import redirect_stderr, redirect_stdout
|
|
from io import StringIO
|
|
import json
|
|
from pathlib import Path
|
|
import tempfile
|
|
import unittest
|
|
|
|
from aaisa.cli import main
|
|
|
|
|
|
class CliTests(unittest.TestCase):
|
|
def test_clean_scan_returns_zero(self) -> None:
|
|
with tempfile.TemporaryDirectory() as directory:
|
|
Path(directory, "safe.txt").write_text("ordinary content\n", encoding="utf-8")
|
|
output = StringIO()
|
|
with redirect_stdout(output):
|
|
result = main(["scan", directory])
|
|
self.assertEqual(result, 0)
|
|
self.assertEqual(json.loads(output.getvalue())["summary"]["finding_count"], 0)
|
|
|
|
def test_finding_returns_one(self) -> None:
|
|
with tempfile.TemporaryDirectory() as directory:
|
|
Path(directory, "requirements.txt").write_text("requests>=2\n", encoding="utf-8")
|
|
with redirect_stdout(StringIO()):
|
|
self.assertEqual(main(["scan", directory]), 1)
|
|
|
|
def test_missing_path_returns_two(self) -> None:
|
|
with redirect_stderr(StringIO()):
|
|
self.assertEqual(main(["scan", "/definitely/missing/aaisa-path"]), 2)
|
|
|
|
def test_rule_catalog_and_explanation_are_json(self) -> None:
|
|
output = StringIO()
|
|
with redirect_stdout(output):
|
|
self.assertEqual(main(["rules", "--format", "json"]), 0)
|
|
catalog = json.loads(output.getvalue())
|
|
self.assertGreaterEqual(len(catalog["rules"]), 8)
|
|
output = StringIO()
|
|
with redirect_stdout(output):
|
|
self.assertEqual(main(["explain", "AAISA-AGENT-001", "--format", "json"]), 0)
|
|
self.assertTrue(any("OWASP Agentic AI" in item for item in json.loads(output.getvalue())["standards"]))
|
|
|
|
def test_evaluation_cli_returns_zero_for_passing_corpus(self) -> None:
|
|
manifest = Path(__file__).parents[1] / "research" / "corpus-v1" / "manifest.json"
|
|
with redirect_stdout(StringIO()):
|
|
self.assertEqual(main(["evaluate", str(manifest)]), 0)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|