test_oa_leave_hours.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. """oa_leave_hours unit tests"""
  2. from app.services.oa_leave_hours import (
  3. apply_leave_kit_hours,
  4. calc_leave_hours,
  5. validate_leave_kit_form_values,
  6. )
  7. def test_calc_same_day_sample():
  8. assert calc_leave_hours("2026-07-30 09:00", "2026-07-30 15:00") == 5.0
  9. def test_calc_morning_only():
  10. assert calc_leave_hours("2026-07-30 08:30", "2026-07-30 12:00") == 3.5
  11. def test_calc_lunch_gap():
  12. assert calc_leave_hours("2026-07-30 11:00", "2026-07-30 14:00") == 2.0
  13. def test_calc_invalid():
  14. assert calc_leave_hours("2026-07-30 15:00", "2026-07-30 09:00") is None
  15. assert calc_leave_hours("", "2026-07-30 09:00") is None
  16. def test_apply_overwrites_when_not_manual():
  17. schema = {
  18. "rule": [
  19. {
  20. "type": "leaveKit",
  21. "props": {
  22. "morningStart": "08:30",
  23. "morningEnd": "12:00",
  24. "afternoonStart": "13:00",
  25. "afternoonEnd": "17:30",
  26. },
  27. "children": [
  28. {"type": "select", "field": "leaveType", "title": "请假类型"},
  29. {"type": "datePicker", "field": "leaveStart", "title": "开始时间"},
  30. {"type": "datePicker", "field": "leaveEnd", "title": "结束时间"},
  31. {"type": "inputNumber", "field": "leaveDuration", "title": "时长(h)"},
  32. ],
  33. }
  34. ]
  35. }
  36. data = {
  37. "leaveType": "事假",
  38. "leaveStart": "2026-07-30 09:00",
  39. "leaveEnd": "2026-07-30 15:00",
  40. "leaveDuration": 1,
  41. }
  42. out = apply_leave_kit_hours(schema, data)
  43. assert out["leaveDuration"] == 5.0
  44. def test_apply_respects_manual():
  45. schema = {
  46. "rule": [
  47. {
  48. "type": "leaveKit",
  49. "props": {},
  50. "children": [
  51. {"type": "datePicker", "field": "leaveStart"},
  52. {"type": "datePicker", "field": "leaveEnd"},
  53. {"type": "inputNumber", "field": "leaveDuration"},
  54. ],
  55. }
  56. ]
  57. }
  58. data = {
  59. "leaveStart": "2026-07-30 09:00",
  60. "leaveEnd": "2026-07-30 15:00",
  61. "leaveDuration": 8,
  62. "__manual_leaveDuration": True,
  63. }
  64. out = apply_leave_kit_hours(schema, data)
  65. assert out["leaveDuration"] == 8.0
  66. def test_validate_end_before_start():
  67. schema = {
  68. "rule": [
  69. {
  70. "type": "leaveKit",
  71. "children": [
  72. {"type": "datePicker", "field": "s"},
  73. {"type": "datePicker", "field": "e"},
  74. {"type": "inputNumber", "field": "d"},
  75. ],
  76. }
  77. ]
  78. }
  79. errs = validate_leave_kit_form_values(
  80. schema, {"s": "2026-07-30 15:00", "e": "2026-07-30 09:00", "d": 1}
  81. )
  82. assert any("结束" in e for e in errs)