Files
tudo-para-ia-mais-humana-pl…/tests/test_scanner_matrix.py
2026-04-30 06:42:00 -03:00

87 lines
3.5 KiB
Python

from __future__ import annotations
import json
import unittest
from pathlib import Path
from mais_humana.catalog import HUMAN_PROFILES, get_platform
from mais_humana.matrix import build_matrix, build_platform_report, score_cell
from mais_humana.models import EvidenceKind
from mais_humana.scanner import ScanOptions, scan_platform
from tests.helpers import make_tmp
class ScannerMatrixTests(unittest.TestCase):
def make_repo(self, root: Path, repo_name: str) -> Path:
repo = root / repo_name
repo.mkdir()
(repo / "src").mkdir()
(repo / "tests").mkdir()
(repo / "README.md").write_text(
"# Identity\n\nhealth readiness openapi RBAC credentialRef audit trace panelReady sameSource",
encoding="utf-8",
)
(repo / "package.json").write_text(
json.dumps(
{
"scripts": {
"test": "node --test",
"build": "tsc",
"smoke:local": "node src/index.js",
}
}
),
encoding="utf-8",
)
(repo / "src" / "index.ts").write_text(
"""
export function health() { return { ok: true, readiness: "ready" }; }
export const openapi = { path: "/openapi" };
export const routes = [{ path: "/identity/health" }, { path: "/identity/contracts" }];
export const security = { rbac: true, credentialRef: "safe" };
""",
encoding="utf-8",
)
(repo / "tests" / "identity.test.ts").write_text("test('health', () => true)\n", encoding="utf-8")
return repo
def test_scan_platform_collects_scripts_metrics_and_evidence(self) -> None:
root = make_tmp()
self.make_repo(root, "tudo-para-ia-identity-platform")
scan = scan_platform(root, get_platform("identity"), ScanOptions(max_file_bytes=50_000))
self.assertTrue(scan.exists)
self.assertFalse(scan.git_present)
self.assertGreater(scan.code_lines, 0)
self.assertGreaterEqual(len(scan.scripts), 3)
kinds = {evidence.kind for evidence in scan.evidence}
self.assertIn(EvidenceKind.TEST, kinds)
self.assertIn(EvidenceKind.OPENAPI, kinds)
self.assertIn(EvidenceKind.SECURITY, kinds)
self.assertIn(EvidenceKind.OBSERVABILITY, kinds)
def test_matrix_scores_expected_profile_above_unrelated_baseline(self) -> None:
root = make_tmp()
self.make_repo(root, "tudo-para-ia-identity-platform")
scan = scan_platform(root, get_platform("identity"))
admin = next(profile for profile in HUMAN_PROFILES if profile.profile_id == "administrador_empresa")
financeiro = next(profile for profile in HUMAN_PROFILES if profile.profile_id == "financeiro")
admin_cell = score_cell(scan, admin)
finance_cell = score_cell(scan, financeiro)
self.assertGreater(admin_cell.score, finance_cell.score)
self.assertTrue(admin_cell.strengths)
self.assertTrue(admin_cell.gaps)
def test_platform_report_contains_recommendations_for_missing_git(self) -> None:
root = make_tmp()
self.make_repo(root, "tudo-para-ia-identity-platform")
scan = scan_platform(root, get_platform("identity"))
cells = build_matrix((scan,))
report = build_platform_report(scan, cells)
titles = [item.title for item in report.recommendations]
self.assertIn("Inicializar Git e configurar origin correto", titles)
self.assertGreater(report.average_score, 0)
if __name__ == "__main__":
unittest.main()