from app.models import Assignment from tests.factories import dt_at, make_position, make_shift, make_volunteer def test_matrix_shape_and_counts(client, edition, session): bar = make_position(session, edition, name="Bar") parking = make_position(session, edition, name="Parking") shift_a = make_shift( session, edition, bar, start=dt_at(10, 18), end=dt_at(10, 22), min_staff=2, ideal_staff=5, ) shift_b = make_shift( session, edition, bar, start=dt_at(11, 18), end=dt_at(11, 22) ) make_shift( session, edition, parking, start=dt_at(10, 8), end=dt_at(10, 12) ) for i in range(3): volunteer = make_volunteer( session, edition, first_name=f"V{i}", last_name="X", email=f"v{i}@ex.fr" ) session.add( Assignment( edition_id=edition.id, volunteer_id=volunteer.id, shift_id=shift_a.id, ) ) session.commit() body = client.get(f"/editions/{edition.id}/matrix").json() assert body["edition_id"] == str(edition.id) assert [p["name"] for p in body["positions"]] == ["Bar", "Parking"] bar_shifts = body["positions"][0]["shifts"] assert [s["shift_id"] for s in bar_shifts] == [str(shift_a.id), str(shift_b.id)] first = bar_shifts[0] assert first["assigned"] == 3 assert first["min_staff"] == 2 assert first["ideal_staff"] == 5 assert bar_shifts[1]["assigned"] == 0 assert body["positions"][1]["shifts"][0]["assigned"] == 0 def test_matrix_unknown_edition_is_404(client): import uuid assert client.get(f"/editions/{uuid.uuid4()}/matrix").status_code == 404