from django.test import TestCase from django.urls import reverse from apps.applets.models import Applet from apps.drama.models import GameEvent, record from apps.epic.models import Room from apps.lyric.models import User def _seed_billboard_applets(): for slug, name, cols, rows in [ ("billboard-my-scrolls", "My Scrolls", 4, 3), ("billboard-my-contacts", "Contacts", 4, 3), ("billboard-most-recent", "Most Recent", 8, 6), ]: Applet.objects.get_or_create( slug=slug, defaults={"name": name, "grid_cols": cols, "grid_rows": rows, "context": "billboard"}, ) class BillboardViewTest(TestCase): def setUp(self): self.user = User.objects.create(email="test@billboard.io") self.client.force_login(self.user) _seed_billboard_applets() def test_uses_billboard_template(self): response = self.client.get("/billboard/") self.assertTemplateUsed(response, "apps/billboard/billboard.html") def test_passes_applets_context(self): response = self.client.get("/billboard/") self.assertIn("applets", response.context) slugs = [e["applet"].slug for e in response.context["applets"]] self.assertIn("billboard-my-scrolls", slugs) self.assertIn("billboard-my-contacts", slugs) self.assertIn("billboard-most-recent", slugs) def test_passes_my_rooms_context(self): room = Room.objects.create(name="Test Room", owner=self.user) response = self.client.get("/billboard/") self.assertIn(room, response.context["my_rooms"]) def test_passes_recent_room_and_events(self): room = Room.objects.create(name="Test Room", owner=self.user) record( room, GameEvent.SLOT_FILLED, actor=self.user, slot_number=1, token_type="coin", token_display="Coin-on-a-String", renewal_days=7, ) response = self.client.get("/billboard/") self.assertEqual(response.context["recent_room"], room) self.assertEqual(len(response.context["recent_events"]), 1) def test_recent_events_capped_at_36(self): room = Room.objects.create(name="Test Room", owner=self.user) for i in range(40): record( room, GameEvent.SLOT_FILLED, actor=self.user, slot_number=1, token_type="coin", token_display="Coin-on-a-String", renewal_days=7, ) response = self.client.get("/billboard/") self.assertEqual(len(response.context["recent_events"]), 36) def test_recent_events_in_chronological_order(self): room = Room.objects.create(name="Test Room", owner=self.user) for _ in range(3): record( room, GameEvent.SLOT_FILLED, actor=self.user, slot_number=1, token_type="coin", token_display="Coin-on-a-String", renewal_days=7, ) response = self.client.get("/billboard/") events = response.context["recent_events"] timestamps = [e.timestamp for e in events] self.assertEqual(timestamps, sorted(timestamps)) def test_recent_room_is_none_when_no_events(self): response = self.client.get("/billboard/") self.assertIsNone(response.context["recent_room"]) self.assertEqual(list(response.context["recent_events"]), []) class ToggleBillboardAppletsTest(TestCase): def setUp(self): self.user = User.objects.create(email="test@toggle.io") self.client.force_login(self.user) _seed_billboard_applets() def test_toggle_hides_unchecked_applets(self): response = self.client.post( reverse("billboard:toggle_applets"), {"applets": ["billboard-my-scrolls"]}, ) self.assertEqual(response.status_code, 302) from apps.applets.models import UserApplet contacts = Applet.objects.get(slug="billboard-my-contacts") ua = UserApplet.objects.get(user=self.user, applet=contacts) self.assertFalse(ua.visible) def test_toggle_returns_partial_on_htmx(self): response = self.client.post( reverse("billboard:toggle_applets"), {"applets": ["billboard-my-scrolls"]}, HTTP_HX_REQUEST="true", ) self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, "apps/billboard/_partials/_applets.html") class BillscrollViewTest(TestCase): def setUp(self): self.user = User.objects.create(email="test@billscroll.io") self.client.force_login(self.user) self.room = Room.objects.create(name="Test Room", owner=self.user) record( self.room, GameEvent.SLOT_FILLED, actor=self.user, slot_number=1, token_type="coin", token_display="Coin-on-a-String", renewal_days=7, ) def test_uses_room_scroll_template(self): response = self.client.get(f"/billboard/room/{self.room.id}/scroll/") self.assertTemplateUsed(response, "apps/billboard/room_scroll.html") def test_passes_events_context(self): response = self.client.get(f"/billboard/room/{self.room.id}/scroll/") self.assertIn("events", response.context) self.assertEqual(response.context["events"].count(), 1) def test_passes_page_class_billscroll(self): response = self.client.get(f"/billboard/room/{self.room.id}/scroll/") self.assertEqual(response.context["page_class"], "page-billscroll")