| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- """oa_overtime_hours unit tests"""
- from app.services.oa_overtime_hours import (
- MANUAL_PREFIX,
- DEFAULT_OVERTIME_WINDOWS,
- apply_overtime_kit_hours,
- calc_overtime_hours,
- validate_overtime_kit_form_values,
- )
- REST = {
- "2026-08-07": False,
- "2026-08-08": True,
- "2026-08-09": True,
- }
- def is_rest(ymd: str) -> bool:
- if ymd in REST:
- return REST[ymd]
- from datetime import datetime
- return datetime.strptime(ymd, "%Y-%m-%d").weekday() >= 5
- def test_weekday_evening():
- assert (
- calc_overtime_hours("2026-08-07 18:00", "2026-08-07 20:00", DEFAULT_OVERTIME_WINDOWS, is_rest)
- == 2.0
- )
- def test_weekday_partial_window():
- assert (
- calc_overtime_hours("2026-08-07 14:00", "2026-08-07 18:00", DEFAULT_OVERTIME_WINDOWS, is_rest)
- == 0.5
- )
- def test_full_weekday_window():
- assert (
- calc_overtime_hours("2026-08-07 17:30", "2026-08-08 08:30", DEFAULT_OVERTIME_WINDOWS, is_rest)
- == 15.0
- )
- def test_saturday_with_break():
- assert (
- calc_overtime_hours("2026-08-08 09:00", "2026-08-08 15:00", DEFAULT_OVERTIME_WINDOWS, is_rest)
- == 4.0
- )
- def test_fri_to_sat():
- assert (
- calc_overtime_hours("2026-08-07 18:00", "2026-08-08 12:00", DEFAULT_OVERTIME_WINDOWS, is_rest)
- == 17.5
- )
- def test_invalid():
- assert (
- calc_overtime_hours("2026-08-07 20:00", "2026-08-07 18:00", DEFAULT_OVERTIME_WINDOWS, is_rest)
- is None
- )
- def test_apply_overwrites_when_not_manual():
- schema = {
- "rule": [
- {
- "type": "overtimeKit",
- "props": {
- "startField": "overtimeStart",
- "endField": "overtimeEnd",
- "durationField": "overtimeDuration",
- },
- "children": [
- {"type": "person", "field": "overtimePerson"},
- {
- "type": "datePicker",
- "field": "overtimeStart",
- "props": {"_fc_kit_field": "overtimeStart"},
- },
- {
- "type": "datePicker",
- "field": "overtimeEnd",
- "props": {"_fc_kit_field": "overtimeEnd"},
- },
- {
- "type": "inputNumber",
- "field": "overtimeDuration",
- "props": {"_fc_kit_field": "overtimeDuration"},
- },
- ],
- }
- ]
- }
- data = {
- "overtimeStart": "2026-08-07 18:00",
- "overtimeEnd": "2026-08-07 20:00",
- "overtimeDuration": 1,
- }
- out = apply_overtime_kit_hours(schema, data, is_rest)
- assert out["overtimeDuration"] == 2.0
- def test_apply_respects_manual():
- schema = {
- "rule": [
- {
- "type": "overtimeKit",
- "props": {},
- "children": [
- {"type": "datePicker", "field": "overtimeStart"},
- {"type": "datePicker", "field": "overtimeEnd"},
- {"type": "inputNumber", "field": "overtimeDuration"},
- ],
- }
- ]
- }
- data = {
- "overtimeStart": "2026-08-07 18:00",
- "overtimeEnd": "2026-08-07 20:00",
- "overtimeDuration": 8,
- f"{MANUAL_PREFIX}overtimeDuration": True,
- }
- out = apply_overtime_kit_hours(schema, data, is_rest)
- assert out["overtimeDuration"] == 8.0
- def test_validate_end_before_start():
- schema = {
- "rule": [
- {
- "type": "overtimeKit",
- "children": [
- {"type": "datePicker", "field": "s"},
- {"type": "datePicker", "field": "e"},
- {"type": "inputNumber", "field": "d"},
- ],
- }
- ]
- }
- errs = validate_overtime_kit_form_values(
- schema, {"s": "2026-08-07 20:00", "e": "2026-08-07 18:00", "d": 1}
- )
- assert any("结束" in e for e in errs)
|