diff --git a/src/apps/epic/tests/integrated/test_views.py b/src/apps/epic/tests/integrated/test_views.py index e26cc96..665d53f 100644 --- a/src/apps/epic/tests/integrated/test_views.py +++ b/src/apps/epic/tests/integrated/test_views.py @@ -501,6 +501,12 @@ class PickRolesViewTest(TestCase): self.client.post(reverse("epic:pick_roles", kwargs={"room_id": self.room.id})) mock_notify.assert_called_once_with(self.room.id) + def test_pick_roles_idempotent_no_duplicate_seats(self): + url = reverse("epic:pick_roles", kwargs={"room_id": self.room.id}) + self.client.post(url) + self.client.post(url) # second call must be a no-op + self.assertEqual(TableSeat.objects.filter(room=self.room).count(), 6) + class SelectRoleViewTest(TestCase): def setUp(self): diff --git a/src/apps/epic/views.py b/src/apps/epic/views.py index 5fed80f..ca61f21 100644 --- a/src/apps/epic/views.py +++ b/src/apps/epic/views.py @@ -407,7 +407,7 @@ def select_role(request, room_id): def pick_roles(request, room_id): if request.method == "POST": room = Room.objects.get(id=room_id) - if room.gate_status == Room.OPEN: + if room.gate_status == Room.OPEN and room.table_status is None: room.table_status = Room.ROLE_SELECT room.save() for slot in room.gate_slots.filter(status=GateSlot.FILLED).order_by("slot_number"): diff --git a/src/functional_tests/test_room_role_select.py b/src/functional_tests/test_room_role_select.py index 4715ea1..aa1bd2e 100644 --- a/src/functional_tests/test_room_role_select.py +++ b/src/functional_tests/test_room_role_select.py @@ -661,5 +661,19 @@ class RoleSelectChannelsTest(ChannelsFunctionalTest): self.wait_for(lambda: self.browser2.find_element( By.CSS_SELECTOR, ".card-stack[data-state='eligible']" )) + + # 5. Founder's stack is STILL ineligible — WS must not re-enable it + self.wait_for(lambda: self.assertEqual( + self.browser.find_element( + By.CSS_SELECTOR, ".card-stack" + ).get_attribute("data-state"), + "ineligible", + )) + + # 6. Clicking founder's stack does not reopen the fan + self.browser.find_element(By.CSS_SELECTOR, ".card-stack").click() + self.wait_for(lambda: self.assertEqual( + len(self.browser.find_elements(By.ID, "id_role_select")), 0 + )) finally: self.browser2.quit()