2026-03-13 00:31:17 -04:00
|
|
|
from django.test import TestCase
|
|
|
|
|
from django.urls import reverse
|
|
|
|
|
|
|
|
|
|
from apps.lyric.models import User
|
2026-03-14 00:10:40 -04:00
|
|
|
from apps.epic.models import Room, RoomInvite
|
2026-03-13 00:31:17 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class RoomCreationViewTest(TestCase):
|
|
|
|
|
def setUp(self):
|
|
|
|
|
self.user = User.objects.create(email="founder@test.io")
|
|
|
|
|
self.client.force_login(self.user)
|
|
|
|
|
|
|
|
|
|
def test_post_creates_room_and_redirects_to_gatekeeper(self):
|
|
|
|
|
response = self.client.post(
|
|
|
|
|
reverse("epic:create_room"),
|
|
|
|
|
data={"name": "Test Room"},
|
|
|
|
|
)
|
|
|
|
|
room = Room.objects.get(owner=self.user)
|
|
|
|
|
self.assertRedirects(
|
|
|
|
|
response, reverse(
|
|
|
|
|
"epic:gatekeeper",
|
|
|
|
|
args=[room.id],
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def test_post_requires_login(self):
|
|
|
|
|
self.client.logout()
|
|
|
|
|
response = self.client.post(
|
|
|
|
|
reverse("epic:create_room"),
|
|
|
|
|
data={"name": "Test Room"},
|
|
|
|
|
)
|
2026-03-13 17:31:52 -04:00
|
|
|
|
2026-03-13 22:51:42 -04:00
|
|
|
def test_create_room_get_redirects_to_gameboard(self):
|
|
|
|
|
response = self.client.get(reverse("epic:create_room"))
|
|
|
|
|
self.assertRedirects(response, "/gameboard/")
|
|
|
|
|
|
2026-03-13 17:31:52 -04:00
|
|
|
|
|
|
|
|
class MyGamesContextTest(TestCase):
|
|
|
|
|
def setUp(self):
|
|
|
|
|
self.user = User.objects.create(email="gamer@example.com")
|
|
|
|
|
self.client.force_login(self.user)
|
|
|
|
|
|
|
|
|
|
def test_gameboard_context_includes_owned_rooms(self):
|
|
|
|
|
room = Room.objects.create(name="Durango", owner=self.user)
|
|
|
|
|
response = self.client.get("/gameboard/")
|
|
|
|
|
self.assertIn(room, response.context["my_games"])
|
|
|
|
|
|
|
|
|
|
def test_gameboard_context_includes_rooms_with_filled_slot(self):
|
|
|
|
|
other = User.objects.create(email="friend@example.com")
|
|
|
|
|
room = Room.objects.create(name="Their Room", owner=other)
|
|
|
|
|
slot = room.gate_slots.get(slot_number=2)
|
|
|
|
|
slot.gamer = self.user
|
|
|
|
|
slot.status = "FILLED"
|
|
|
|
|
slot.save()
|
|
|
|
|
response = self.client.get("/gameboard/")
|
|
|
|
|
self.assertIn(room, response.context["my_games"])
|
2026-03-13 22:51:42 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class GateStatusViewTest(TestCase):
|
|
|
|
|
def setUp(self):
|
|
|
|
|
self.owner = User.objects.create(email="founder@test.io")
|
|
|
|
|
self.client.force_login(self.owner)
|
|
|
|
|
self.room = Room.objects.create(name="Test Room", owner=self.owner)
|
|
|
|
|
|
|
|
|
|
def test_gate_status_returns_empty_when_open(self):
|
|
|
|
|
self.room.gate_status = Room.OPEN
|
|
|
|
|
self.room.save()
|
|
|
|
|
response = self.client.get(reverse("epic:gate_status", kwargs={"room_id": self.room.id}))
|
|
|
|
|
self.assertEqual(response.content, b"")
|
|
|
|
|
|
|
|
|
|
def test_gate_status_returns_partial_when_gathering(self):
|
|
|
|
|
response = self.client.get(
|
|
|
|
|
reverse("epic:gate_status", kwargs={"room_id": self.room.id})
|
|
|
|
|
)
|
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
self.assertContains(response, "gate-modal")
|
2026-03-14 00:10:40 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class RoomActionsViewTest(TestCase):
|
|
|
|
|
def setUp(self):
|
|
|
|
|
self.owner = User.objects.create(email="owner@test.io")
|
|
|
|
|
self.gamer = User.objects.create(email="gamer@test.io")
|
|
|
|
|
self.room = Room.objects.create(name="Test Room", owner=self.owner)
|
|
|
|
|
self.slot = self.room.gate_slots.get(slot_number=2)
|
|
|
|
|
self.slot.gamer = self.gamer
|
|
|
|
|
self.slot.status = "FILLED"
|
|
|
|
|
self.slot.save()
|
|
|
|
|
RoomInvite.objects.create(
|
|
|
|
|
room=self.room, inviter=self.owner,
|
|
|
|
|
invitee_email=self.gamer.email
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def test_owner_delete_removes_room(self):
|
|
|
|
|
self.client.force_login(self.owner)
|
|
|
|
|
self.client.post(reverse("epic:delete_room", kwargs={"room_id": self.room.id}))
|
|
|
|
|
self.assertFalse(Room.objects.filter(pk=self.room.pk).exists())
|
|
|
|
|
|
|
|
|
|
def test_non_owner_delete_does_not_remove_room(self):
|
|
|
|
|
self.client.force_login(self.gamer)
|
|
|
|
|
self.client.post(reverse("epic:delete_room", kwargs={"room_id": self.room.id}))
|
|
|
|
|
self.assertTrue(Room.objects.filter(pk=self.room.pk).exists())
|
|
|
|
|
|
|
|
|
|
def test_delete_redirects_to_gameboard(self):
|
|
|
|
|
self.client.force_login(self.owner)
|
|
|
|
|
response = self.client.post(
|
|
|
|
|
reverse("epic:delete_room", kwargs={"room_id": self.room.id})
|
|
|
|
|
)
|
|
|
|
|
self.assertRedirects(response, "/gameboard/")
|
|
|
|
|
|
|
|
|
|
def test_abandon_clears_slot(self):
|
|
|
|
|
self.client.force_login(self.gamer)
|
|
|
|
|
self.client.post(reverse("epic:abandon_room", kwargs={"room_id": self.room.id}))
|
|
|
|
|
self.slot.refresh_from_db()
|
|
|
|
|
self.assertEqual(self.slot.status, "EMPTY")
|
|
|
|
|
self.assertIsNone(self.slot.gamer)
|
|
|
|
|
|
|
|
|
|
def test_abandon_deletes_pending_invite(self):
|
|
|
|
|
self.client.force_login(self.gamer)
|
|
|
|
|
self.client.post(reverse("epic:abandon_room", kwargs={"room_id": self.room.id}))
|
|
|
|
|
self.assertFalse(
|
|
|
|
|
RoomInvite.objects.filter(
|
|
|
|
|
room=self.room, invitee_email=self.gamer.email
|
|
|
|
|
).exists()
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def test_abandon_redirects_to_gameboard(self):
|
|
|
|
|
self.client.force_login(self.gamer)
|
|
|
|
|
response = self.client.post(
|
|
|
|
|
reverse("epic:abandon_room", kwargs={"room_id": self.room.id})
|
|
|
|
|
)
|
|
|
|
|
self.assertRedirects(response, "/gameboard/")
|