diff --git a/src/apps/epic/tests/integrated/test_views.py b/src/apps/epic/tests/integrated/test_views.py index 6da3d59..a799658 100644 --- a/src/apps/epic/tests/integrated/test_views.py +++ b/src/apps/epic/tests/integrated/test_views.py @@ -2730,3 +2730,35 @@ class RoomRenewTokenTest(TestCase): def test_renew_get_redirects(self): response = self.client.get(self.url) self.assertEqual(response.status_code, 302) + + +class RoomNavbarGateViewTest(TestCase): + """Navbar swaps CONT GAME → GATE VIEW on room pages (mirror my-sea), + routing to the room gate-view. The gameboard listing keeps CONT GAME + (no `page-room` marker).""" + + def setUp(self): + self.owner = User.objects.create(email="owner@test.io", username="owner") + self.room = Room.objects.create( + name="Nav Room", owner=self.owner, + gate_status=Room.OPEN, table_status=Room.ROLE_SELECT, + ) + self.client.force_login(self.owner) + + def test_room_page_shows_gate_view_not_cont_game(self): + response = self.client.get(reverse("epic:room", args=[self.room.id])) + self.assertContains(response, "id_navbar_gate_view_btn") + self.assertNotContains(response, 'id="id_cont_game"') + + def test_gate_view_btn_links_to_room_gate(self): + response = self.client.get(reverse("epic:room", args=[self.room.id])) + self.assertContains( + response, reverse("epic:room_gate", args=[self.room.id])) + + def test_room_gate_page_also_shows_gate_view(self): + response = self.client.get(reverse("epic:room_gate", args=[self.room.id])) + self.assertContains(response, "id_navbar_gate_view_btn") + + def test_room_page_carries_page_room_marker(self): + response = self.client.get(reverse("epic:room", args=[self.room.id])) + self.assertIn("page-room", response.context["page_class"]) diff --git a/src/apps/epic/views.py b/src/apps/epic/views.py index dd5ec71..9028505 100644 --- a/src/apps/epic/views.py +++ b/src/apps/epic/views.py @@ -449,7 +449,11 @@ def room_view(request, room_id): room = Room.objects.get(id=room_id) ctx = _role_select_context(room, request.user) ctx["room"] = room - ctx["page_class"] = "page-gameboard" + # `page-room` drives the navbar GATE VIEW swap (mirrors my-sea's + # `page-my-sea`) so the table page reaches the renewal gate-view instead + # of a self-referential CONT GAME. The bare gameboard listing stays + # `page-gameboard` (no page-room) → keeps CONT GAME. + ctx["page_class"] = "page-gameboard page-room" # Reversal-rate hint label under DRAW SEA's SPREAD select — same helper as # sea_partial so the value tracks any future per-user override automatically. ctx["stack_reversal_pct"] = int(round(stack_reversal_probability(request.user, room) * 100)) diff --git a/src/templates/core/_partials/_navbar.html b/src/templates/core/_partials/_navbar.html index c801f5b..0960238 100644 --- a/src/templates/core/_partials/_navbar.html +++ b/src/templates/core/_partials/_navbar.html @@ -21,27 +21,31 @@ - {% if 'page-my-sea' in page_class %} + {% if 'page-my-sea' in page_class or 'page-room' in page_class %} {# Sprint 6 iter 6b — on any my-sea page (landing/picker or #} {# the gatekeeper itself), CONT GAME swaps for GATE VIEW so #} {# the user can always reach the token-deposit gatekeeper #} - {# (regardless of quota state). `