major test refactoring
This commit is contained in:
@@ -0,0 +1,146 @@
|
||||
import pytest
|
||||
import datetime
|
||||
from rota.shifts import RotaBuilder, SingleShift, days
|
||||
from rota.workers import Worker
|
||||
|
||||
@pytest.fixture
|
||||
def demo_rota_night_unavailable():
|
||||
weeks_to_rota = 10
|
||||
start_date = datetime.date(2022, 3, 7)
|
||||
Rota = RotaBuilder(
|
||||
start_date,
|
||||
weeks_to_rota=weeks_to_rota,
|
||||
)
|
||||
worker1 = Worker(
|
||||
name="worker1",
|
||||
site="group1",
|
||||
grade=1,
|
||||
not_available_to_work=[
|
||||
{
|
||||
"date": datetime.datetime.strptime("15/03/22", "%d/%m/%y").date(),
|
||||
"reason": "****",
|
||||
},
|
||||
],
|
||||
)
|
||||
worker2 = Worker(
|
||||
name="worker2",
|
||||
site="group1",
|
||||
grade=1,
|
||||
not_available_to_work=[
|
||||
{
|
||||
"date": datetime.datetime.strptime("14/03/22", "%d/%m/%y").date(),
|
||||
"reason": "****",
|
||||
}
|
||||
],
|
||||
)
|
||||
Rota.add_workers((worker1, worker2))
|
||||
return Rota
|
||||
|
||||
def test_basic_assignment(demo_rota_night_unavailable):
|
||||
Rota = demo_rota_night_unavailable
|
||||
Rota.shifts = []
|
||||
Rota.add_shifts(
|
||||
SingleShift(
|
||||
sites=("group1",),
|
||||
name="night_weekend",
|
||||
length=12.5,
|
||||
days=days[5:],
|
||||
constraint=[{"name": "night"}],
|
||||
),
|
||||
)
|
||||
Rota.build_and_solve(options={"ratio": 0.00})
|
||||
Rota.export_rota_to_html("testnight")
|
||||
assert Rota.results.solver.status == "ok"
|
||||
assert Rota.results.solver.termination_condition == "optimal"
|
||||
summary = Rota.get_shift_summary_dict()
|
||||
for worker in summary:
|
||||
assert summary[worker]["night_weekend"] == 10
|
||||
|
||||
def test_assign_night_prior_to_unavailablity(demo_rota_night_unavailable):
|
||||
Rota = demo_rota_night_unavailable
|
||||
Rota.shifts = []
|
||||
Rota.add_shifts(
|
||||
SingleShift(
|
||||
sites=("group1",),
|
||||
name="night_weekend",
|
||||
length=12.5,
|
||||
days=days[5:],
|
||||
workers_required=2,
|
||||
constraint=[{"name": "night"}],
|
||||
),
|
||||
)
|
||||
Rota.build_and_solve(options={"ratio": 0.00})
|
||||
Rota.export_rota_to_html("testnight_unavail")
|
||||
assert Rota.results.solver.status in ("warning", "error")
|
||||
assert Rota.results.solver.termination_condition == "infeasible"
|
||||
|
||||
def test_assign_non_night_prior_to_unavailablity(demo_rota_night_unavailable):
|
||||
Rota = demo_rota_night_unavailable
|
||||
Rota.shifts = []
|
||||
Rota.add_shifts(
|
||||
SingleShift(
|
||||
sites=("group1",),
|
||||
name="night_weekend",
|
||||
length=12.5,
|
||||
days=days[5:],
|
||||
workers_required=2,
|
||||
#constraint=[{"name": "night"}],
|
||||
),
|
||||
)
|
||||
Rota.build_and_solve(options={"ratio": 0.00})
|
||||
Rota.export_rota_to_html("testnight_unavail")
|
||||
assert Rota.results.solver.status == "ok"
|
||||
|
||||
def test_assign_prior_to_unavailablity_non_night(demo_rota_night_unavailable):
|
||||
Rota = demo_rota_night_unavailable
|
||||
Rota.shifts = []
|
||||
Rota.add_shifts(
|
||||
SingleShift(
|
||||
sites=("group1",),
|
||||
name="night_weekend",
|
||||
length=12.5,
|
||||
days=days[5:],
|
||||
workers_required=2,
|
||||
constraint=[],
|
||||
),
|
||||
)
|
||||
Rota.build_and_solve(options={"ratio": 0.00})
|
||||
Rota.export_rota_to_html("testnight")
|
||||
assert Rota.results.solver.status == "ok"
|
||||
|
||||
def test_assign_split(demo_rota_night_unavailable):
|
||||
Rota = demo_rota_night_unavailable
|
||||
Rota.shifts = []
|
||||
worker3 = Worker(
|
||||
name="worker3",
|
||||
site="group1",
|
||||
grade=1,
|
||||
not_available_to_work=(
|
||||
{"date": datetime.datetime.strptime("13/03/22", "%d/%m/%y").date()},
|
||||
),
|
||||
)
|
||||
worker4 = Worker(
|
||||
name="worker4",
|
||||
site="group1",
|
||||
grade=1,
|
||||
not_available_to_work=(
|
||||
{"date": datetime.datetime.strptime("12/03/22", "%d/%m/%y").date()},
|
||||
),
|
||||
)
|
||||
Rota.add_workers((worker3, worker4))
|
||||
Rota.add_shifts(
|
||||
SingleShift(
|
||||
sites=("group1",),
|
||||
name="night_weekend",
|
||||
length=12.5,
|
||||
days=days[5:],
|
||||
workers_required=3,
|
||||
constraint=[],
|
||||
),
|
||||
)
|
||||
Rota.build_and_solve(options={"ratio": 0.00})
|
||||
Rota.export_rota_to_html("testnight")
|
||||
assert Rota.results.solver.status == "ok"
|
||||
summary = Rota.get_shift_summary_dict()
|
||||
for worker in summary:
|
||||
assert summary[worker]["night_weekend"] == 15
|
||||
Reference in New Issue
Block a user