test_n8n_retirement_audit.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. from app.core.orchestration.migration.retirement import (
  2. N8nRetirementChecklist,
  3. N8nRetirementGate,
  4. )
  5. def checklist(**overrides):
  6. values = {
  7. "inventory_disposition_complete": True,
  8. "all_dataflows_kestra_primary": True,
  9. "business_cycle_and_recovery_complete": True,
  10. "standby_observation_no_rollback": True,
  11. "monitoring_and_alerting_complete": True,
  12. "dependency_failures_safe": True,
  13. "secure_archive_complete": True,
  14. "independent_review_approved": True,
  15. "final_l4_passed": True,
  16. }
  17. values.update(overrides)
  18. return N8nRetirementChecklist(**values)
  19. def test_retirement_is_blocked_with_explicit_missing_evidence():
  20. decision = N8nRetirementGate.evaluate(
  21. checklist(
  22. inventory_disposition_complete=False,
  23. independent_review_approved=False,
  24. final_l4_passed=False,
  25. )
  26. )
  27. assert decision["status"] == "blocked"
  28. assert decision["retirement_approved"] is False
  29. assert decision["missing"] == [
  30. "inventory_disposition_complete",
  31. "independent_review_approved",
  32. "final_l4_passed",
  33. ]
  34. def test_retirement_approval_requires_every_gate():
  35. decision = N8nRetirementGate.evaluate(checklist())
  36. assert decision == {
  37. "status": "approved",
  38. "retirement_approved": True,
  39. "missing": [],
  40. }