from copy import deepcopy from black import main import pytest from rota.shifts import NoWorkers, RotaBuilder, SingleShift, days import datetime from rota.workers import Worker class TestDemoRota: def test_post_mon_tue(self): # Set up rota weeks_to_rota = 10 start_date = datetime.date(2022, 3, 7) self.Rota = RotaBuilder( start_date, weeks_to_rota=weeks_to_rota, ) self.Rota.constraint_options["prevent_monday_and_tuesday_after_full_weekends"] = ["group1",] # Add a few workers worker1 = Worker(self.Rota, "worker1", "group1", 1) worker2 = Worker(self.Rota, "worker2", "group1", 1) self.Rota.add_workers((worker1, worker2)) # Add a weekday and weekend shift self.Rota.add_shifts( SingleShift( ("group1",), "d", 12.5, days[:5], balance_offset=10, workers_required=1, ), SingleShift( ("group1",), "w", 12.5, days[5:], workers_required=1 ), ) self.Rota.build_and_solve(options={"ratio": 0.00}) #self.Rota.export_rota_to_html("weekend_padding") assert self.Rota.results.solver.status == "ok" assert self.Rota.results.solver.termination_condition == "optimal" for worker in self.Rota.workers: shifts = self.Rota.get_worker_shift_list(worker) # Convert shift to a string representation shifts_string = "".join([i if i != "" else "-" for i in shifts]) assert "wd" not in shifts_string assert "w-d" not in shifts_string def test_post_mon_tue_fail(self): # Set up rota weeks_to_rota = 10 start_date = datetime.date(2022, 3, 7) self.Rota = RotaBuilder( start_date, weeks_to_rota=weeks_to_rota, ) self.Rota.constraint_options["prevent_monday_and_tuesday_after_full_weekends"] = ["group1",] # Add a few workers worker1 = Worker(self.Rota, "worker1", "group1", 1) worker2 = Worker(self.Rota, "worker2", "group1", 1) self.Rota.add_workers((worker1, worker2)) # Add a weekday and weekend shift self.Rota.add_shifts( SingleShift( ("group1",), "d", 12.5, days[:5], balance_offset=10, workers_required=1, ), SingleShift( ("group1",), "c", 12.5, days[1], balance_offset=1, workers_required=1, ), SingleShift( ("group1",), "w", 12.5, days[5:], workers_required=1 ), ) self.Rota.build_and_solve(options={"ratio": 0.00}) assert self.Rota.results.solver.status == "warning" def test_post_mon(self): # Set up rota weeks_to_rota = 10 start_date = datetime.date(2022, 3, 7) self.Rota = RotaBuilder( start_date, weeks_to_rota=weeks_to_rota, ) self.Rota.constraint_options["prevent_monday_after_full_weekends"] = ["group1",] # Add a few workers worker1 = Worker(self.Rota, "worker1", "group1", 1) worker2 = Worker(self.Rota, "worker2", "group1", 1) self.Rota.add_workers((worker1, worker2)) # Add a weekday and weekend shift self.Rota.add_shifts( SingleShift( ("group1",), "d", 12.5, days[:5], balance_offset=1, workers_required=1, ), SingleShift( ("group1",), "c", 12.5, days[1], balance_offset=1, workers_required=1, ), SingleShift( ("group1",), "w", 12.5, days[5:], workers_required=1 ), ) self.Rota.build_and_solve(options={"ratio": 0.00}) self.Rota.export_rota_to_html("weekend_padding") assert self.Rota.results.solver.status == "ok" assert self.Rota.results.solver.termination_condition == "optimal" for worker in self.Rota.workers: shifts = self.Rota.get_worker_shift_list(worker) # Convert shift to a string representation shifts_string = "".join([i if i != "" else "-" for i in shifts]) assert "wd" not in shifts_string def test_post_mon_force_split(self): # Set up rota weeks_to_rota = 10 start_date = datetime.date(2022, 3, 7) self.Rota = RotaBuilder( start_date, weeks_to_rota=weeks_to_rota, ) self.Rota.constraint_options["prevent_monday_after_full_weekends"] = ["group1",] # Add a few workers worker1 = Worker(self.Rota, "worker1", "group1", 1) worker2 = Worker(self.Rota, "worker2", "group1", 1) self.Rota.add_workers((worker1, worker2)) # Add a weekday and weekend shift self.Rota.add_shifts( SingleShift( ("group1",), "d", 12.5, days[:5], balance_offset=1, workers_required=1, ), SingleShift( ("group1",), "c", 12.5, days[0], balance_offset=1, workers_required=1, ), SingleShift( ("group1",), "w", 12.5, days[5:], workers_required=1 ), ) self.Rota.build_and_solve(options={"ratio": 0.00}) self.Rota.export_rota_to_html("weekend_padding") assert self.Rota.results.solver.status == "ok" def test_post_mon_prevent_split_fail(self): # Set up rota weeks_to_rota = 10 start_date = datetime.date(2022, 3, 7) self.Rota = RotaBuilder( start_date, weeks_to_rota=weeks_to_rota, ) self.Rota.constraint_options["prevent_monday_after_full_weekends"] = ["group1",] # Add a few workers worker1 = Worker(self.Rota, "worker1", "group1", 1) worker2 = Worker(self.Rota, "worker2", "group1", 1) self.Rota.add_workers((worker1, worker2)) # Add a weekday and weekend shift self.Rota.add_shifts( SingleShift( ("group1",), "d", 12.5, days[:5], balance_offset=1, workers_required=1, ), SingleShift( ("group1",), "c", 12.5, days[0], balance_offset=1, workers_required=1, ), SingleShift( ("group1",), "w", 12.5, days[5:], workers_required=1, force_as_block=True ), ) self.Rota.build_and_solve(options={"ratio": 0.00}) self.Rota.export_rota_to_html("weekend_padding") assert self.Rota.results.solver.status == "warning"