from app.models import Assignment, AssignmentStatus 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, status in enumerate( [ AssignmentStatus.CONFIRMED, AssignmentStatus.CONFIRMED, AssignmentStatus.PROPOSED, AssignmentStatus.DECLINED, ] ): 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, status=status, ) ) 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["confirmed"] == 2 assert first["proposed"] == 1 # la DECLINEE n'est pas comptée assert first["min_staff"] == 2 assert first["ideal_staff"] == 5 assert bar_shifts[1]["confirmed"] == 0 assert body["positions"][1]["shifts"][0]["proposed"] == 0 def test_matrix_unknown_edition_is_404(client): import uuid assert client.get(f"/editions/{uuid.uuid4()}/matrix").status_code == 404