numberous fixes and improvements

This commit is contained in:
Ross
2025-06-22 09:38:03 +01:00
parent 06a551bb68
commit fc3102ec47
3 changed files with 333 additions and 30 deletions
+211 -1
View File
@@ -1,5 +1,5 @@
import pytest
from rota.shifts import NoWorkers, RotaBuilder, SingleShift, WarningTermination, WorkerRequirement, days
from rota.shifts import InvalidShift, NoWorkers, RotaBuilder, SingleShift, WarningTermination, WorkerRequirement, days
import datetime
from rota.workers import NonWorkingDays, NotAvailableToWork, Worker, generate_not_available_to_works
@@ -1169,4 +1169,214 @@ def test_worker_hard_day_dependency_weekend2():
assert shift_list[sat_idx] == "a", f"Worker4 assigned 'a' on Fri (week {week}) but not on Sun"
def test_worker_force_assign_with_invalid_shift():
Rota = generate_basic_rota(workers=4, weeks_to_rota=2)
workers = Rota.get_workers()
for worker in workers:
worker.add_force_assign_with("a", "c")
Rota.add_shifts(
SingleShift(
sites=("group1",),
name="a",
length=8,
days=days[:4],
workers_required=1,
assign_as_block=False, # global setting is off
),
SingleShift(
sites=("group1",),
name="b",
length=8,
days=days[:4],
workers_required=1,
assign_as_block=False, # global setting is off
),
)
with pytest.raises(InvalidShift):
# This should raise an InvalidShift error because 'c' does not exist
Rota.build_and_solve(options={"ratio": 0.0})
Rota.add_shifts(
SingleShift(
sites=("group1",),
name="c",
length=8,
days=days[:4],
workers_required=1,
assign_as_block=False, # global setting is off
),
)
Rota.build_and_solve(options={"ratio": 0.0})
def test_worker_force_assign_with():
Rota = generate_basic_rota(workers=4, weeks_to_rota=16)
workers = Rota.get_workers()
for worker in workers:
worker.add_force_assign_with("a", "b")
Rota.add_shifts(
SingleShift(
sites=("group1",),
name="a",
length=8,
days=days[:4],
workers_required=1,
assign_as_block=False, # global setting is off
),
SingleShift(
sites=("group1",),
name="b",
length=8,
days=days[:4],
workers_required=1,
assign_as_block=False, # global setting is off
),
)
Rota.build_and_solve(options={"ratio": 0.0})
Rota.export_rota_to_html("test_worker_force_assign_with", folder="tests")
for worker in Rota.get_workers():
shift_list = Rota.get_worker_shift_list(worker, search_multiple_assignments=True)
for shift in shift_list:
if shift == "a":
assert "b" in shift_list, f"Worker {worker.name} has 'a' but not 'b' assigned with it"
elif shift == "b":
assert "a" in shift_list, f"Worker {worker.name} has 'b' but not 'a' assigned with it"
assert shift_list.count({"a", "b"}) == 16
def test_worker_force_assign_with_and_hard_days():
Rota = generate_basic_rota(workers=4, weeks_to_rota=16)
workers = Rota.get_workers()
for worker in workers:
worker.add_force_assign_with("a", "b")
#worker.add_hard_day_dependency("Sat", "Sun")
worker.add_hard_day_dependency("Mon", "Tue")
Rota.add_shifts(
SingleShift(
sites=("group1",),
name="a",
length=8,
days=days[:2],
workers_required=1,
assign_as_block=False, # global setting is off
),
SingleShift(
sites=("group1",),
name="b",
length=8,
days=days[:2],
workers_required=1,
assign_as_block=False, # global setting is off
),
)
Rota.build_and_solve(options={"ratio": 0.0})
Rota.export_rota_to_html("test_worker_force_assign_with_hard_days", folder="tests")
assert Rota.results.solver.status == "ok"
def test_worker_force_assign_with_and_hard_days_weekend():
Rota = generate_basic_rota(workers=4, weeks_to_rota=16)
workers = Rota.get_workers()
for worker in workers:
worker.add_force_assign_with("a", "b")
#worker.add_hard_day_dependency("Sat", "Sun")
worker.add_hard_day_dependency("Sat", "Sun")
Rota.add_shifts(
SingleShift(
sites=("group1",),
name="a",
length=8,
days=days[5:],
workers_required=1,
assign_as_block=False, # global setting is off
),
SingleShift(
sites=("group1",),
name="b",
length=8,
days=days[5:],
workers_required=1,
assign_as_block=False, # global setting is off
),
)
Rota.build_and_solve(options={"ratio": 0.0})
Rota.export_rota_to_html("test_worker_force_assign_with_hard_days", folder="tests")
assert Rota.results.solver.status == "ok"
def test_workers_double_shifts_on_mon_tue():
Rota = generate_basic_rota(workers=2, weeks_to_rota=16)
workers = Rota.get_workers()
for worker in workers:
worker.add_force_assign_with("a", "b")
Rota.add_shifts(
SingleShift(
sites=("group1",),
name="a",
length=8,
days=days[:2],
workers_required=2,
assign_as_block=False, # global setting is off
),
SingleShift(
sites=("group1",),
name="b",
length=8,
days=days[:2],
workers_required=2,
assign_as_block=False, # global setting is off
),
)
Rota.build_and_solve(options={"ratio": 0.0})
Rota.export_rota_to_html("test_worker_double_shifts", folder="tests")
assert Rota.results.solver.status == "ok"
def test_workers_double_shifts_on_weekends():
Rota = generate_basic_rota(workers=2, weeks_to_rota=16)
workers = Rota.get_workers()
for worker in workers:
worker.add_force_assign_with("a", "b")
Rota.add_shifts(
SingleShift(
sites=("group1",),
name="a",
length=8,
days=days[5:],
workers_required=2,
assign_as_block=False, # global setting is off
),
SingleShift(
sites=("group1",),
name="b",
length=8,
days=days[5:],
workers_required=2,
assign_as_block=False, # global setting is off
),
)
Rota.build_and_solve(options={"ratio": 0.0})
Rota.export_rota_to_html("test_worker_double_shifts", folder="tests")
assert Rota.results.solver.status == "ok"