"""Construction du `SolverInput` depuis la base (`app/solver/loader.py`).""" from app.solver.loader import build_solver_input from tests.factories import dt_at, make_position, make_shift def test_predecessor_is_found_across_midnight_within_the_festival_day(edition, session): # Début de journée = 06:00 (fixture) : 23h–00h le 9 puis 00h–01h le 10 # appartiennent à la même soirée — le second enchaîne le premier. bar = make_position(session, edition, name="Bar") before = make_shift(session, edition, bar, start=dt_at(9, 23), end=dt_at(10, 0)) after = make_shift(session, edition, bar, start=dt_at(10, 0), end=dt_at(10, 1)) data = build_solver_input(session=session, edition=edition) by_id = {s.id: s for s in data.shifts} assert by_id[str(after.id)].predecessor_shift_ids == frozenset({str(before.id)}) def test_no_predecessor_across_the_festival_day_boundary(edition, session): # 05h–06h le 10 clôt la journée du 9 ; 06h–07h le 10 ouvre la suivante. bar = make_position(session, edition, name="Bar") make_shift(session, edition, bar, start=dt_at(10, 5), end=dt_at(10, 6)) morning = make_shift(session, edition, bar, start=dt_at(10, 6), end=dt_at(10, 7)) data = build_solver_input(session=session, edition=edition) by_id = {s.id: s for s in data.shifts} assert not by_id[str(morning.id)].predecessor_shift_ids