from django.test import TestCase from django.urls import reverse from django.utils import timezone from apps.drama.models import GameEvent from apps.epic.models import GateSlot, Room, TableSeat from apps.lyric.models import Token, User class ConfirmTokenRecordsSlotFilledTest(TestCase): def setUp(self): self.user = User.objects.create(email="gamer@test.io") self.client.force_login(self.user) self.room = Room.objects.create(name="Test Room", owner=self.user) self.token = Token.objects.create(user=self.user, token_type=Token.TITHE) self.slot = self.room.gate_slots.get(slot_number=1) self.slot.gamer = self.user self.slot.status = GateSlot.RESERVED self.slot.reserved_at = timezone.now() self.slot.save() def test_confirm_token_records_slot_filled_event(self): session = self.client.session session["kit_token_id"] = str(self.token.id) session.save() self.client.post(reverse("epic:confirm_token", args=[self.room.id])) event = GameEvent.objects.get(room=self.room, verb=GameEvent.SLOT_FILLED) self.assertEqual(event.actor, self.user) self.assertEqual(event.data["slot_number"], 1) self.assertEqual(event.data["token_type"], Token.TITHE) def test_no_event_recorded_if_no_reserved_slot(self): self.slot.gamer = None self.slot.status = GateSlot.EMPTY self.slot.save() self.client.post(reverse("epic:confirm_token", args=[self.room.id])) self.assertEqual(GameEvent.objects.filter(verb=GameEvent.SLOT_FILLED).count(), 0) class SelectRoleRecordsRoleSelectedTest(TestCase): def setUp(self): self.user = User.objects.create(email="player@test.io") self.client.force_login(self.user) self.room = Room.objects.create( name="Role Room", owner=self.user, table_status=Room.ROLE_SELECT ) self.seat = TableSeat.objects.create( room=self.room, gamer=self.user, slot_number=1 ) def test_select_role_records_role_selected_event(self): self.client.post( reverse("epic:select_role", args=[self.room.id]), data={"role": "PC"}, ) event = GameEvent.objects.get(room=self.room, verb=GameEvent.ROLE_SELECTED) self.assertEqual(event.actor, self.user) self.assertEqual(event.data["role"], "PC") self.assertEqual(event.data["slot_number"], 1) def test_roles_revealed_event_recorded_when_all_seats_assigned(self): # Only one seat — assigning it triggers roles_revealed self.client.post( reverse("epic:select_role", args=[self.room.id]), data={"role": "PC"}, ) self.assertTrue( GameEvent.objects.filter(room=self.room, verb=GameEvent.ROLES_REVEALED).exists() ) def test_no_event_if_role_already_taken(self): TableSeat.objects.create(room=self.room, gamer=self.user, slot_number=2, role="PC") self.client.post( reverse("epic:select_role", args=[self.room.id]), data={"role": "PC"}, ) self.assertEqual(GameEvent.objects.filter(verb=GameEvent.ROLE_SELECTED).count(), 0)