test_oa_cc_read.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. """OA 抄送已读:序列化、筛选语义、标记幂等"""
  2. import unittest
  3. from datetime import datetime
  4. from types import SimpleNamespace
  5. from unittest.mock import MagicMock
  6. from app.services import oa_engine as eng
  7. class TestTaskToDictIsRead(unittest.TestCase):
  8. def test_includes_is_read_and_read_time(self):
  9. t = SimpleNamespace(
  10. id="t1",
  11. instance_id="i1",
  12. node_key="n1",
  13. node_name="抄送",
  14. task_type="cc",
  15. assignee_user_id="u1",
  16. status="done",
  17. comment_text=None,
  18. resolve_source=None,
  19. sign_mode=None,
  20. is_read=1,
  21. read_time=datetime(2026, 8, 6, 12, 0, 0),
  22. create_time=datetime(2026, 8, 6, 10, 0, 0),
  23. update_time=datetime(2026, 8, 6, 11, 0, 0),
  24. )
  25. d = eng._task_to_dict(t)
  26. self.assertEqual(d["isRead"], True)
  27. self.assertEqual(d["readTime"], "2026-08-06 12:00:00")
  28. def test_unread_defaults(self):
  29. t = SimpleNamespace(
  30. id="t2",
  31. instance_id="i1",
  32. node_key="n1",
  33. node_name="抄送",
  34. task_type="cc",
  35. assignee_user_id="u1",
  36. status="done",
  37. comment_text=None,
  38. resolve_source=None,
  39. sign_mode=None,
  40. is_read=0,
  41. read_time=None,
  42. create_time=None,
  43. update_time=None,
  44. )
  45. d = eng._task_to_dict(t)
  46. self.assertEqual(d["isRead"], False)
  47. self.assertEqual(d["readTime"], "")
  48. class TestMarkCcReadHelpers(unittest.TestCase):
  49. def test_normalize_read_status(self):
  50. self.assertEqual(eng._normalize_cc_read_status(None), "unread")
  51. self.assertEqual(eng._normalize_cc_read_status(""), "unread")
  52. self.assertEqual(eng._normalize_cc_read_status("all"), "all")
  53. self.assertEqual(eng._normalize_cc_read_status("read"), "read")
  54. with self.assertRaises(eng.OaEngineError):
  55. eng._normalize_cc_read_status("weird")
  56. def test_mark_idempotent_keeps_read_time(self):
  57. first = datetime(2026, 8, 1, 9, 0, 0)
  58. task = SimpleNamespace(
  59. id="t1",
  60. task_type="cc",
  61. assignee_user_id="u1",
  62. del_flag=0,
  63. is_read=1,
  64. read_time=first,
  65. update_by=None,
  66. update_time=None,
  67. )
  68. db = MagicMock()
  69. out = eng._apply_cc_task_read(db, task=task, user_id="u1", now=datetime(2026, 8, 6, 12, 0, 0))
  70. self.assertFalse(out) # 未发生更新
  71. self.assertEqual(task.read_time, first)
  72. self.assertEqual(task.is_read, 1)
  73. if __name__ == "__main__":
  74. unittest.main()