from datetime import datetime, timedelta import pytest from components.hoildays.helpers.calendar_helper import CalendarHelper from components.hoildays.helpers.nibelisparser import OffPeriodDetails def test_get_period_end_before_start(): with pytest.raises(ValueError) as err: CalendarHelper.get_period(datetime.today(), datetime.today() - timedelta(days=1)) assert str(err.value) == "end date is before start date." def test_get_period(): start = datetime.today() res = CalendarHelper.get_period(start, start + timedelta(days=3)) assert res == [ start, start + timedelta(days=1), start + timedelta(days=2), start + timedelta(days=3) ] @pytest.mark.parametrize("start_am_pm, end_am_pm, is_start, is_end, expected", [ ("am", None, True, False, "reason_am"), ("pm", None, True, False, "reason_pm"), (None, "am", False, True, "reason_am"), (None, "pm", False, True, "reason_pm"), ("am", "pm", True, True, "reason_am_pm"), ]) def test_get_reason(start_am_pm, end_am_pm, is_start, is_end, expected): record = OffPeriodDetails( first_name="first_name", last_name="last_name", start_date=datetime.today(), start_am_pm=start_am_pm, end_date=datetime.today() + timedelta(days=1), end_am_pm=end_am_pm, total=2, reason="reason", date_import=datetime.today(), ) actual = CalendarHelper.get_reason(record, is_start, is_end) assert actual == expected def test_create_calendar_one_user(): records = [ OffPeriodDetails("john", "doo", datetime(2025, 6, 19), None, datetime(2025, 6, 20), None, 1, "CP", datetime.now()) ] names, calendar = CalendarHelper.create_calendar(records, datetime(2025, 6, 18), datetime(2025, 6, 21)) expected_calendar = { datetime(2025, 6, 18): [None], datetime(2025, 6, 19): [["CP"]], datetime(2025, 6, 20): [["CP"]], datetime(2025, 6, 21): [None], } assert names == ["john doo"] assert calendar == expected_calendar def test_create_calendar_multiple_users(): now = datetime.now() records = [ OffPeriodDetails("john", "doo", datetime(2025, 6, 19), None, datetime(2025, 6, 20), None, 1, "CP", now), OffPeriodDetails("jane", "doo", datetime(2025, 6, 18), None, datetime(2025, 6, 19), None, 1, "CP", now) ] names, calendar = CalendarHelper.create_calendar(records, datetime(2025, 6, 18), datetime(2025, 6, 21)) expected_calendar = { datetime(2025, 6, 18): [["CP"], None], datetime(2025, 6, 19): [["CP"], ["CP"]], datetime(2025, 6, 20): [None, ["CP"]], datetime(2025, 6, 21): [None, None], } assert names == ["jane doo", "john doo"] assert calendar == expected_calendar def test_create_calendar_end_is_missing(): records = [ OffPeriodDetails("john", "doo", datetime(2025, 6, 19), None, datetime(2025, 6, 20), None, 1, "CP", datetime.now()) ] names, calendar = CalendarHelper.create_calendar(records, datetime(2025, 6, 18)) expected_calendar = { datetime(2025, 6, 18): [None], datetime(2025, 6, 19): [["CP"]], datetime(2025, 6, 20): [["CP"]], } assert names == ["john doo"] assert calendar == expected_calendar def test_create_calendar_start_is_missing(): records = [ OffPeriodDetails("john", "doo", datetime(2025, 6, 19), None, datetime(2025, 6, 20), None, 1, "CP", datetime.now()) ] names, calendar = CalendarHelper.create_calendar(records, None, datetime(2025, 6, 21)) expected_calendar = { datetime(2025, 6, 19): [["CP"]], datetime(2025, 6, 20): [["CP"]], datetime(2025, 6, 21): [None], } assert names == ["john doo"] assert calendar == expected_calendar def test_create_calendar_start_and_end_are_missing(): records = [ OffPeriodDetails("john", "doo", datetime(2025, 6, 19), None, datetime(2025, 6, 20), None, 1, "CP", datetime.now()) ] names, calendar = CalendarHelper.create_calendar(records) expected_calendar = { datetime(2025, 6, 19): [["CP"]], datetime(2025, 6, 20): [["CP"]], } assert names == ["john doo"] assert calendar == expected_calendar