from django.test import TestCase from django.db import IntegrityError from apps.drama.models import GameEvent, ScrollPosition, record from apps.epic.models import Room from apps.lyric.models import User class GameEventModelTest(TestCase): def setUp(self): self.user = User.objects.create(email="actor@test.io") self.room = Room.objects.create(name="Test Room", owner=self.user) def test_record_creates_game_event(self): event = record(self.room, GameEvent.SLOT_FILLED, actor=self.user, slot_number=1, token_type="tithe") self.assertEqual(GameEvent.objects.count(), 1) self.assertEqual(event.room, self.room) self.assertEqual(event.actor, self.user) self.assertEqual(event.verb, GameEvent.SLOT_FILLED) self.assertEqual(event.data, {"slot_number": 1, "token_type": "tithe"}) def test_record_without_actor(self): event = record(self.room, GameEvent.ROOM_CREATED) self.assertIsNone(event.actor) self.assertEqual(event.verb, GameEvent.ROOM_CREATED) def test_events_ordered_by_timestamp(self): record(self.room, GameEvent.ROOM_CREATED) record(self.room, GameEvent.SLOT_RESERVED, actor=self.user) record(self.room, GameEvent.SLOT_FILLED, actor=self.user) verbs = list(GameEvent.objects.values_list("verb", flat=True)) self.assertEqual(verbs, [ GameEvent.ROOM_CREATED, GameEvent.SLOT_RESERVED, GameEvent.SLOT_FILLED, ]) def test_str_includes_actor_and_verb(self): event = record(self.room, GameEvent.ROLE_SELECTED, actor=self.user, role="PC") self.assertIn("actor@test.io", str(event)) self.assertIn(GameEvent.ROLE_SELECTED, str(event)) def test_str_without_actor_shows_system(self): event = record(self.room, GameEvent.ROLES_REVEALED) self.assertIn("system", str(event)) class ScrollPositionModelTest(TestCase): def setUp(self): self.user = User.objects.create(email="reader@test.io") self.room = Room.objects.create(name="Test Room", owner=self.user) def test_can_save_scroll_position(self): sp = ScrollPosition.objects.create(user=self.user, room=self.room, position=150) self.assertEqual(ScrollPosition.objects.count(), 1) self.assertEqual(sp.position, 150) def test_default_position_is_zero(self): sp = ScrollPosition.objects.create(user=self.user, room=self.room) self.assertEqual(sp.position, 0) def test_unique_per_user_and_room(self): ScrollPosition.objects.create(user=self.user, room=self.room, position=50) with self.assertRaises(IntegrityError): ScrollPosition.objects.create(user=self.user, room=self.room, position=100) def test_upsert_updates_existing_position(self): ScrollPosition.objects.create(user=self.user, room=self.room, position=50) ScrollPosition.objects.update_or_create( user=self.user, room=self.room, defaults={"position": 200}, ) self.assertEqual(ScrollPosition.objects.get(user=self.user, room=self.room).position, 200)