from typing import List, Tuple from apps.schedules.models import CustomOnCallShift """ Simplified shift definition to test that shifts contain the correct users. This test is only checking the start date of the shift is landing on the correct day. If you need a test for precise hours that should be a different test so that these cases can stay easy to define. Define custom shift test case parameters: users_per_group - Recurrence groups, generates users for each group based on number, Users are named A-Z shift_start - Date to start shift day_mask - Which days are included, None to include all total_days - Length of shift (end = start + total_days) frequency - Recurrence frequency interval - Recurrence interval expected_result - Dict where each day displays the users that should be scheduled """ CUSTOM_SHIFT_TEST_CASES: List[Tuple] = [ ( # 0 - Original Test Case [1, 1, 1], "2024-08-01", ["FR"], 21, CustomOnCallShift.FREQUENCY_DAILY, 1, { "2024-08-02": "A", "2024-08-09": "B", "2024-08-16": "C", }, ), ( # 1 - Weekdays Start Monday Daily [1, 1, 1, 1, 1], "2024-08-05", ["MO", "TU", "WE", "TH", "FR"], 14, CustomOnCallShift.FREQUENCY_DAILY, 1, { "2024-08-05": "A", "2024-08-06": "B", "2024-08-07": "C", "2024-08-08": "D", "2024-08-09": "E", "2024-08-12": "A", "2024-08-13": "B", "2024-08-14": "C", "2024-08-15": "D", "2024-08-16": "E", }, ), ( # 2 - Weekdays Start Monday Daily Interval 2 [1, 1, 1, 1], "2024-08-05", ["MO", "TU", "WE", "TH", "FR"], 14, CustomOnCallShift.FREQUENCY_DAILY, 2, { "2024-08-05": "A", "2024-08-06": "A", "2024-08-07": "B", "2024-08-08": "B", "2024-08-09": "C", "2024-08-12": "C", "2024-08-13": "D", "2024-08-14": "D", "2024-08-15": "A", "2024-08-16": "A", }, ), ( # 3 - Weekdays Start Monday Weekly [1, 1, 1, 1, 1], "2024-08-05", ["MO", "TU", "WE", "TH", "FR"], 14, CustomOnCallShift.FREQUENCY_WEEKLY, 1, { "2024-08-05": "A", "2024-08-06": "A", "2024-08-07": "A", "2024-08-08": "A", "2024-08-09": "A", "2024-08-12": "B", "2024-08-13": "B", "2024-08-14": "B", "2024-08-15": "B", "2024-08-16": "B", }, ), ( # 4 - Weekdays Start Monday Monthly [1, 1, 1, 1, 1], "2024-08-26", ["MO", "TU", "WE", "TH", "FR"], 14, CustomOnCallShift.FREQUENCY_MONTHLY, 1, { "2024-08-26": "A", "2024-08-27": "A", "2024-08-28": "A", "2024-08-29": "A", "2024-08-30": "A", "2024-09-02": "B", "2024-09-03": "B", "2024-09-04": "B", "2024-09-05": "B", "2024-09-06": "B", }, ), ( # 5 - Weekdays Start Thursday Daily [1, 1, 1, 1, 1], "2024-08-08", ["MO", "TU", "WE", "TH", "FR"], 14, CustomOnCallShift.FREQUENCY_DAILY, 1, { "2024-08-08": "A", "2024-08-09": "B", "2024-08-12": "C", "2024-08-13": "D", "2024-08-14": "E", "2024-08-15": "A", "2024-08-16": "B", "2024-08-19": "C", "2024-08-20": "D", "2024-08-21": "E", }, ), ( # 6 - Weekdays Start Thursday Weekly [1, 1, 1, 1, 1], "2024-08-08", ["MO", "TU", "WE", "TH", "FR"], 14, CustomOnCallShift.FREQUENCY_WEEKLY, 1, { "2024-08-08": "A", "2024-08-09": "A", "2024-08-12": "B", "2024-08-13": "B", "2024-08-14": "B", "2024-08-15": "B", "2024-08-16": "B", "2024-08-19": "C", "2024-08-20": "C", "2024-08-21": "C", }, ), ( # 7 - Weekdays Start Thursday Monthly [1, 1, 1, 1, 1], "2024-08-29", ["MO", "TU", "WE", "TH", "FR"], 14, CustomOnCallShift.FREQUENCY_MONTHLY, 1, { "2024-08-29": "A", "2024-08-30": "A", "2024-09-02": "B", "2024-09-03": "B", "2024-09-04": "B", "2024-09-05": "B", "2024-09-06": "B", "2024-09-09": "B", "2024-09-10": "B", "2024-09-11": "B", }, ), ( # 8 - All Days uneven groups [2, 1], "2024-08-14", None, 9, CustomOnCallShift.FREQUENCY_DAILY, 1, { "2024-08-14": "AB", "2024-08-15": "C", "2024-08-16": "AB", "2024-08-17": "C", "2024-08-18": "AB", "2024-08-19": "C", "2024-08-20": "AB", "2024-08-21": "C", "2024-08-22": "AB", }, ), ( # 9 - Weekends Start Saturday [1, 1, 1], "2024-08-03", ["SA", "SU"], 15, CustomOnCallShift.FREQUENCY_DAILY, 1, { "2024-08-03": "A", "2024-08-04": "B", "2024-08-10": "C", "2024-08-11": "A", "2024-08-17": "B", }, ), ( # 10 - Weekends Start Saturday Users > Shifts [1, 1, 1, 1, 1], "2024-08-03", ["SA", "SU"], 14, CustomOnCallShift.FREQUENCY_DAILY, 1, { "2024-08-03": "A", "2024-08-04": "B", "2024-08-10": "C", "2024-08-11": "D", }, ), ( # 11 - Weekends Start Saturday Users > Shifts [1, 1, 1, 1, 1], "2024-08-03", ["SA", "SU"], 14, CustomOnCallShift.FREQUENCY_DAILY, 1, { "2024-08-03": "A", "2024-08-04": "B", "2024-08-10": "C", "2024-08-11": "D", }, ), ( # 12 - Weekends Start Thursday [1], "2024-08-01", ["SA", "SU"], 5, CustomOnCallShift.FREQUENCY_DAILY, 1, { "2024-08-03": "A", "2024-08-04": "A", }, ), ( # 13 - Weekends Start Thursday [1, 1, 1], "2024-08-01", ["SA", "SU"], 17, CustomOnCallShift.FREQUENCY_DAILY, 1, { "2024-08-03": "A", "2024-08-04": "B", "2024-08-10": "C", "2024-08-11": "A", "2024-08-17": "B", }, ), ( # 14 - Weekends Start Thursday Users > Shifts [1, 1, 1, 1, 1, 1], "2024-08-01", ["SA", "SU"], 17, CustomOnCallShift.FREQUENCY_DAILY, 1, { "2024-08-03": "A", "2024-08-04": "B", "2024-08-10": "C", "2024-08-11": "D", "2024-08-17": "E", }, ), ( # 15 - Weekends Start Thursday Interval 2 [1, 1, 1], "2024-08-01", ["SA", "SU"], 17, CustomOnCallShift.FREQUENCY_DAILY, 2, { "2024-08-03": "A", "2024-08-04": "A", "2024-08-10": "B", "2024-08-11": "B", "2024-08-17": "C", }, ), ( # 16 - Weekends Start Saturday Weekly [1, 1, 1], "2024-08-01", ["SA", "SU"], 18, CustomOnCallShift.FREQUENCY_WEEKLY, 1, { "2024-08-03": "A", "2024-08-04": "A", "2024-08-10": "B", "2024-08-11": "B", "2024-08-17": "C", "2024-08-18": "C", }, ), ( # 17 - Weekends Start Saturday Weekly Interval 2 [1, 1, 1], "2024-08-01", ["SA", "SU"], 18, CustomOnCallShift.FREQUENCY_WEEKLY, 2, { "2024-08-03": "A", "2024-08-04": "A", "2024-08-17": "B", "2024-08-18": "B", }, ), ( # 18 - Weekends Start Thursday Monthly [1, 1, 1], "2024-08-29", ["SA", "SU"], 18, CustomOnCallShift.FREQUENCY_MONTHLY, 1, { "2024-08-31": "A", "2024-09-01": "B", "2024-09-07": "B", "2024-09-08": "B", "2024-09-14": "B", "2024-09-15": "B", }, ), ( # 19 - No days (==All) [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], "2024-09-30", [], 18, CustomOnCallShift.FREQUENCY_DAILY, 1, { "2024-09-30": "A", "2024-10-01": "B", "2024-10-02": "C", "2024-10-03": "D", "2024-10-04": "E", "2024-10-05": "F", "2024-10-06": "G", "2024-10-07": "H", "2024-10-08": "I", "2024-10-09": "J", "2024-10-10": "A", "2024-10-11": "B", "2024-10-12": "C", "2024-10-13": "D", "2024-10-14": "E", "2024-10-15": "F", "2024-10-16": "G", "2024-10-17": "H", }, ), ( # 20 - All days [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], "2024-09-30", ["MO", "TU", "WE", "TH", "FR", "SA", "SU"], 18, CustomOnCallShift.FREQUENCY_DAILY, 1, { "2024-09-30": "A", "2024-10-01": "B", "2024-10-02": "C", "2024-10-03": "D", "2024-10-04": "E", "2024-10-05": "F", "2024-10-06": "G", "2024-10-07": "H", "2024-10-08": "I", "2024-10-09": "J", "2024-10-10": "A", "2024-10-11": "B", "2024-10-12": "C", "2024-10-13": "D", "2024-10-14": "E", "2024-10-15": "F", "2024-10-16": "G", "2024-10-17": "H", }, ), ( # 21 - No days (==All) 7 Interval # Note: This test verifies expected behavior not the correct result, # it *should* be equivalent to #22, but it is not using the daily_by_day logic [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], "2024-09-30", [], 18, CustomOnCallShift.FREQUENCY_DAILY, 7, { "2024-09-30": "A", "2024-10-07": "B", "2024-10-14": "C", "2024-10-15": "D", "2024-10-16": "E", "2024-10-17": "F", }, ), ( # 22 - All days 7 Interval [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], "2024-09-30", ["MO", "TU", "WE", "TH", "FR", "SA", "SU"], 18, CustomOnCallShift.FREQUENCY_DAILY, 7, { "2024-09-30": "A", "2024-10-01": "A", "2024-10-02": "A", "2024-10-03": "A", "2024-10-04": "A", "2024-10-05": "A", "2024-10-06": "A", "2024-10-07": "B", "2024-10-08": "B", "2024-10-09": "B", "2024-10-10": "B", "2024-10-11": "B", "2024-10-12": "B", "2024-10-13": "B", "2024-10-14": "C", "2024-10-15": "C", "2024-10-16": "C", "2024-10-17": "C", }, ), ( # 23 - Single User 1 day [1], "2024-08-01", ["MO"], 14, CustomOnCallShift.FREQUENCY_DAILY, 1, {"2024-08-05": "A", "2024-08-12": "A"}, ), ]