| """Tests for Task 3 — Action Models (10 actions).""" |
|
|
| import os |
| import sys |
|
|
| import pytest |
| from pydantic import ValidationError |
|
|
| _PROJECT_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir)) |
| if _PROJECT_ROOT not in sys.path: |
| sys.path.insert(0, _PROJECT_ROOT) |
|
|
| from models import ( |
| CorrelateAlerts, |
| EnrichIOC, |
| ScanHostVulnerabilities, |
| TriggerPlaybook, |
| SOCActionWrapper, |
| SOCObservation, |
| SOCState, |
| ) |
|
|
|
|
| def test_correlate_alerts_model(): |
| a = CorrelateAlerts(alert_ids=["A1", "A2"]) |
| assert a.type == "correlate_alerts" |
|
|
|
|
| def test_enrich_ioc_model(): |
| a = EnrichIOC(ioc_value="1.2.3.4", ioc_type="ip") |
| assert a.type == "enrich_ioc" |
|
|
|
|
| def test_scan_host_vulnerabilities_model(): |
| a = ScanHostVulnerabilities(hostname="WS-001") |
| assert a.type == "scan_host_vulnerabilities" |
|
|
|
|
| def test_trigger_playbook_valid(): |
| a = TriggerPlaybook(playbook_name="ransomware_containment", target="WS-001") |
| assert a.type == "trigger_playbook" |
|
|
|
|
| def test_trigger_playbook_invalid_name(): |
| with pytest.raises(ValidationError): |
| TriggerPlaybook(playbook_name="fake_playbook", target="WS-001") |
|
|
|
|
| def test_wrapper_routes_correlate_alerts(): |
| w = SOCActionWrapper(type="correlate_alerts", alert_ids=["A", "B"]) |
| assert isinstance(w.to_typed_action(), CorrelateAlerts) |
|
|
|
|
| def test_wrapper_routes_enrich_ioc(): |
| w = SOCActionWrapper(type="enrich_ioc", ioc_value="x", ioc_type="ip") |
| assert isinstance(w.to_typed_action(), EnrichIOC) |
|
|
|
|
| def test_observation_has_new_fields(): |
| obs = SOCObservation() |
| for attr in [ |
| "correlation_results", |
| "ioc_enrichment", |
| "vulnerability_results", |
| "playbook_result", |
| "threat_graph_summary", |
| "available_playbooks", |
| ]: |
| assert hasattr(obs, attr), f"missing {attr}" |
|
|
|
|
| def test_state_has_new_fields(): |
| st = SOCState(episode_id="e", step_count=0) |
| for attr in [ |
| "enriched_iocs", |
| "scanned_hosts", |
| "correlated_alert_pairs", |
| "triggered_playbooks", |
| "live_requirements", |
| ]: |
| assert hasattr(st, attr), f"missing {attr}" |
|
|