navbar: GATE VIEW swaps for CONT GAME on room pages (page-room) → room gate-view — TDD

Phase 0 of the room GATE VIEW + seat-renewal sprint. Mirrors the my-sea
treatment: on any room page the self-referential CONT GAME is replaced
by a GATE VIEW button that opens the room's renewal gate-view.

- `room_view` page_class → "page-gameboard page-room"; the bare gameboard
  listing stays "page-gameboard" (no page-room) so CONT GAME persists
  there for returning to a recent room.
- `_navbar.html` GATE VIEW branch fires on `page-my-sea` OR `page-room`;
  onclick routes, in precedence: page-room → epic:room_gate (room in
  context); my-sea-visit → visitor gate; else owner's sea gate. One
  consolidated branch (DRY) instead of two near-identical button blocks.

Tests: RoomNavbarGateViewTest (4) — room page shows GATE VIEW not CONT
GAME, links to room_gate, gate-view page also shows it, page-room marker
present. 826 epic+gameboard ITs green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Disco DeDisco
2026-05-31 23:11:05 -04:00
parent 516b917420
commit 65689295a7
3 changed files with 55 additions and 15 deletions

View File

@@ -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"])