|
| 1 | +from src.models.pretalx import PretalxSubmission |
| 2 | +from src.utils.timing_relationships import TimingRelationships |
| 3 | +from src.utils.transform import Transform |
| 4 | +from src.utils.utils import Utils |
| 5 | + |
| 6 | + |
| 7 | +def submission( |
| 8 | + code: str, |
| 9 | + start: str | None, |
| 10 | + end: str | None, |
| 11 | + room: str | None = "Room A", |
| 12 | + slots: list[dict] | None = None, |
| 13 | +) -> PretalxSubmission: |
| 14 | + return PretalxSubmission.model_validate( |
| 15 | + { |
| 16 | + "code": code, |
| 17 | + "title": code, |
| 18 | + "speakers": [], |
| 19 | + "submission_type": "Talk", |
| 20 | + "state": "confirmed", |
| 21 | + "answers": [], |
| 22 | + "slot_count": len(slots) if slots else 1, |
| 23 | + "slots": slots |
| 24 | + if slots is not None |
| 25 | + else [{"room": room, "start": start, "end": end}], |
| 26 | + } |
| 27 | + ) |
| 28 | + |
| 29 | + |
| 30 | +def test_submission_uses_last_timed_slot_before_blank_placeholders() -> None: |
| 31 | + session = submission( |
| 32 | + "BTTFFJ", |
| 33 | + None, |
| 34 | + None, |
| 35 | + slots=[ |
| 36 | + { |
| 37 | + "room": "Reception Room F2 (Fishbowl)", |
| 38 | + "start": "2026-07-14T09:30:00+02:00", |
| 39 | + "end": "2026-07-14T11:00:00+02:00", |
| 40 | + }, |
| 41 | + { |
| 42 | + "room": "Reception Room F2 (Fishbowl)", |
| 43 | + "start": "2026-07-14T11:15:00+02:00", |
| 44 | + "end": "2026-07-14T12:45:00+02:00", |
| 45 | + }, |
| 46 | + {"room": None, "start": None, "end": None}, |
| 47 | + {"room": None, "start": None, "end": None}, |
| 48 | + ], |
| 49 | + ) |
| 50 | + |
| 51 | + assert session.room == "Reception Room F2 (Fishbowl)" |
| 52 | + assert session.start.isoformat() == "2026-07-14T09:30:00+02:00" |
| 53 | + assert session.end.isoformat() == "2026-07-14T12:45:00+02:00" |
| 54 | + |
| 55 | + |
| 56 | +def test_timing_relationships_ignore_partial_sessions_and_reset_state() -> None: |
| 57 | + first = submission( |
| 58 | + "FIRST", "2026-07-14T09:30:00+02:00", "2026-07-14T10:30:00+02:00" |
| 59 | + ) |
| 60 | + parallel = submission( |
| 61 | + "PARALLEL", |
| 62 | + "2026-07-14T10:00:00+02:00", |
| 63 | + "2026-07-14T11:00:00+02:00", |
| 64 | + room="Room B", |
| 65 | + ) |
| 66 | + partial = submission("PARTIAL", "2026-07-14T10:15:00+02:00", None) |
| 67 | + |
| 68 | + TimingRelationships.compute([first, parallel, partial]) |
| 69 | + |
| 70 | + assert TimingRelationships.get_sessions_in_parallel("FIRST") == ["PARALLEL"] |
| 71 | + assert TimingRelationships.get_sessions_in_parallel("PARTIAL") is None |
| 72 | + |
| 73 | + TimingRelationships.compute([partial]) |
| 74 | + |
| 75 | + assert TimingRelationships.get_sessions_in_parallel("FIRST") is None |
| 76 | + |
| 77 | + |
| 78 | +def test_schedule_start_times_use_only_scheduled_slots() -> None: |
| 79 | + session = submission( |
| 80 | + "BTTFFJ", |
| 81 | + None, |
| 82 | + None, |
| 83 | + slots=[ |
| 84 | + { |
| 85 | + "room": "Reception Room F2 (Fishbowl)", |
| 86 | + "start": "2026-07-14T09:30:00+02:00", |
| 87 | + "end": "2026-07-14T11:00:00+02:00", |
| 88 | + }, |
| 89 | + { |
| 90 | + "room": "Reception Room F2 (Fishbowl)", |
| 91 | + "start": "2026-07-14T11:15:00+02:00", |
| 92 | + "end": "2026-07-14T12:45:00+02:00", |
| 93 | + }, |
| 94 | + {"room": None, "start": None, "end": None}, |
| 95 | + {"room": None, "start": None, "end": None}, |
| 96 | + ], |
| 97 | + ) |
| 98 | + session.slot_count = 4 |
| 99 | + |
| 100 | + TimingRelationships.compute([session]) |
| 101 | + ep_session = Transform.pretalx_submissions_to_europython_sessions( |
| 102 | + {session.code: session}, {} |
| 103 | + )[session.code] |
| 104 | + |
| 105 | + assert [dt.isoformat() for dt in Utils.start_times(ep_session)] == [ |
| 106 | + "2026-07-14T09:30:00+02:00", |
| 107 | + "2026-07-14T11:15:00+02:00", |
| 108 | + ] |
0 commit comments