61 lines
2.3 KiB
Python
61 lines
2.3 KiB
Python
from types import SimpleNamespace
|
|
|
|
from src.models.approval import ApprovalStatus, RiskLevel
|
|
from src.services.approval_db import build_approval_created_timeline_event
|
|
|
|
|
|
def test_pending_approval_timeline_event_exposes_operator_gate() -> None:
|
|
record = SimpleNamespace(
|
|
id="approval-pending-1",
|
|
action="kubectl rollout restart deployment/api",
|
|
status=ApprovalStatus.PENDING,
|
|
risk_level=RiskLevel.MEDIUM,
|
|
required_signatures=1,
|
|
current_signatures=0,
|
|
requested_by="openclaw",
|
|
incident_id="INC-20260604-TEST01",
|
|
)
|
|
|
|
event = build_approval_created_timeline_event(record)
|
|
|
|
assert event.event_type == "human"
|
|
assert event.status == "warning"
|
|
assert event.title == "Approval gate waiting for human decision"
|
|
assert event.actor == "openclaw"
|
|
assert event.actor_role == "approval_gate"
|
|
assert event.risk_level == "medium"
|
|
assert event.approval_id == "approval-pending-1"
|
|
assert event.incident_id == "INC-20260604-TEST01"
|
|
assert "stage=approval_required" in event.description
|
|
assert "next_action=operator_approve_or_reject" in event.description
|
|
assert "blocked_reason=waiting_for_required_signatures" in event.description
|
|
assert "auto_or_manual=manual" in event.description
|
|
assert "needs_human=yes" in event.description
|
|
assert "signatures=0/1" in event.description
|
|
|
|
|
|
def test_low_risk_auto_approved_timeline_event_exposes_auto_gate() -> None:
|
|
record = SimpleNamespace(
|
|
id="approval-auto-1",
|
|
action="collect read-only diagnostics",
|
|
status=ApprovalStatus.APPROVED,
|
|
risk_level=RiskLevel.LOW,
|
|
required_signatures=0,
|
|
current_signatures=0,
|
|
requested_by="openclaw",
|
|
incident_id="INC-20260604-TEST02",
|
|
)
|
|
|
|
event = build_approval_created_timeline_event(record)
|
|
|
|
assert event.event_type == "human"
|
|
assert event.status == "success"
|
|
assert event.title == "Approval gate passed"
|
|
assert event.risk_level == "low"
|
|
assert "stage=approval_auto_approved" in event.description
|
|
assert "next_action=execute_or_verify" in event.description
|
|
assert "blocked_reason=none" in event.description
|
|
assert "auto_or_manual=auto" in event.description
|
|
assert "needs_human=no" in event.description
|
|
assert "signatures=0/0" in event.description
|