test_cases.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import tempfile
  2. import unittest
  3. from pathlib import Path
  4. from defect_analysis.cases import (
  5. create_root_cause_case,
  6. get_audit_logs,
  7. list_cases,
  8. update_case_status,
  9. )
  10. from defect_analysis.database import init_database
  11. class CasesTest(unittest.TestCase):
  12. def setUp(self):
  13. self.tmpdir = tempfile.TemporaryDirectory()
  14. self.db_path = Path(self.tmpdir.name) / "cases.db"
  15. init_database(self.db_path)
  16. def tearDown(self):
  17. self.tmpdir.cleanup()
  18. def test_create_root_cause_case_records_audit_log(self):
  19. case_id = create_root_cause_case(
  20. self.db_path,
  21. title="LAM-A01 R2C3 气泡异常",
  22. candidate_type="equipment_seat",
  23. candidate_value="LAM-A01 / R2C3",
  24. defect_type="气泡",
  25. panel_zone="FPC/绑定区",
  26. owner="工程师A",
  27. created_by="tester",
  28. recommendation="检查贴合压力和吸嘴状态",
  29. )
  30. cases = list_cases(self.db_path)
  31. logs = get_audit_logs(self.db_path, entity_type="case", entity_id=case_id)
  32. self.assertEqual(1, len(cases))
  33. self.assertEqual("OPEN", cases.loc[0, "status"])
  34. self.assertEqual("工程师A", cases.loc[0, "owner"])
  35. self.assertEqual(1, len(logs))
  36. self.assertEqual("CREATE_CASE", logs.loc[0, "action"])
  37. def test_update_case_status_records_transition_and_audit_log(self):
  38. case_id = create_root_cause_case(
  39. self.db_path,
  40. title="治具划痕异常",
  41. candidate_type="lam_fixture_id",
  42. candidate_value="FIX-A01-03",
  43. defect_type="划痕",
  44. panel_zone="左边缘区",
  45. owner="工程师B",
  46. created_by="tester",
  47. recommendation="点检治具接触面",
  48. )
  49. update_case_status(
  50. self.db_path,
  51. case_id=case_id,
  52. status="IN_PROGRESS",
  53. actor="工程师B",
  54. note="已安排停机点检",
  55. )
  56. update_case_status(
  57. self.db_path,
  58. case_id=case_id,
  59. status="CLOSED",
  60. actor="工程师B",
  61. note="已更换治具,观察 3 天无复发",
  62. )
  63. cases = list_cases(self.db_path)
  64. logs = get_audit_logs(self.db_path, entity_type="case", entity_id=case_id)
  65. self.assertEqual("CLOSED", cases.loc[0, "status"])
  66. self.assertEqual(["CREATE_CASE", "UPDATE_STATUS", "UPDATE_STATUS"], logs["action"].tolist())
  67. self.assertIn("已更换治具", logs.iloc[-1]["details"])
  68. def test_closed_case_cannot_reopen(self):
  69. case_id = create_root_cause_case(
  70. self.db_path,
  71. title="治具划痕异常",
  72. candidate_type="lam_fixture_id",
  73. candidate_value="FIX-A01-03",
  74. defect_type="划痕",
  75. panel_zone="左边缘区",
  76. owner="工程师B",
  77. created_by="tester",
  78. recommendation="点检治具接触面",
  79. )
  80. update_case_status(self.db_path, case_id=case_id, status="CLOSED", actor="工程师B")
  81. with self.assertRaises(ValueError):
  82. update_case_status(self.db_path, case_id=case_id, status="OPEN", actor="工程师B")
  83. if __name__ == "__main__":
  84. unittest.main()