test_cli.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. """VendorGuard 命令行入口测试。"""
  2. from __future__ import annotations
  3. import unittest
  4. from vendor_guard.cli import (
  5. _approval_outcome_message,
  6. _build_utf8_reexec_command,
  7. _read_approval_decision,
  8. _run_utf8_child,
  9. _should_reexec_utf8,
  10. )
  11. class CliTests(unittest.TestCase):
  12. def test_windows_without_utf8_mode_requires_reexec(self) -> None:
  13. self.assertTrue(_should_reexec_utf8("nt", 0))
  14. self.assertFalse(_should_reexec_utf8("nt", 1))
  15. self.assertFalse(_should_reexec_utf8("posix", 0))
  16. def test_reexec_command_enables_utf8_and_preserves_arguments(self) -> None:
  17. command = _build_utf8_reexec_command(["ACME"])
  18. self.assertEqual(command[1:5], ["-X", "utf8", "-m", "vendor_guard.cli"])
  19. self.assertEqual(command[5:], ["ACME"])
  20. def test_parent_utf8_wrapper_converts_ctrl_c_to_exit_130(self) -> None:
  21. def interrupted_runner(*_args, **_kwargs):
  22. raise KeyboardInterrupt
  23. exit_code = _run_utf8_child(
  24. ["ACME"],
  25. {"PYTHONUTF8": "1"},
  26. runner=interrupted_runner,
  27. )
  28. self.assertEqual(exit_code, 130)
  29. def test_rejected_approval_is_reported_as_completed(self) -> None:
  30. message = _approval_outcome_message(
  31. vendor_name="ACME",
  32. proposed_decision="conditional",
  33. approved=False,
  34. report_path="reports/ACME/onboarding-report.md",
  35. )
  36. self.assertIn("人工审批已完成", message)
  37. self.assertIn("未批准执行", message)
  38. self.assertIn("准入建议未提交", message)
  39. self.assertNotIn("如需提交", message)
  40. self.assertNotIn("等待", message)
  41. def test_approved_approval_is_reported_as_executed(self) -> None:
  42. message = _approval_outcome_message(
  43. vendor_name="ACME",
  44. proposed_decision="conditional",
  45. approved=True,
  46. report_path="reports/ACME/onboarding-report.md",
  47. )
  48. self.assertIn("人工审批已完成", message)
  49. self.assertIn("已批准执行", message)
  50. self.assertIn("提交工具已执行", message)
  51. def test_ctrl_c_cancels_approval_without_treating_it_as_reject(self) -> None:
  52. def interrupted_input(_prompt: str) -> str:
  53. raise KeyboardInterrupt
  54. self.assertEqual(
  55. _read_approval_decision(interrupted_input),
  56. "cancel",
  57. )
  58. def test_eof_cancels_approval_without_treating_it_as_reject(self) -> None:
  59. def closed_input(_prompt: str) -> str:
  60. raise EOFError
  61. self.assertEqual(
  62. _read_approval_decision(closed_input),
  63. "cancel",
  64. )
  65. if __name__ == "__main__":
  66. unittest.main()