billscroll should now remember user's position across devices
This commit is contained in:
@@ -83,6 +83,25 @@ class GameEvent(models.Model):
|
||||
return f"[{self.timestamp:%Y-%m-%d %H:%M}] {actor} → {self.verb}"
|
||||
|
||||
|
||||
class ScrollPosition(models.Model):
|
||||
user = models.ForeignKey(
|
||||
settings.AUTH_USER_MODEL, on_delete=models.CASCADE,
|
||||
related_name="scroll_positions",
|
||||
)
|
||||
room = models.ForeignKey(
|
||||
"epic.Room", on_delete=models.CASCADE,
|
||||
related_name="scroll_positions",
|
||||
)
|
||||
position = models.PositiveIntegerField(default=0)
|
||||
updated_at = models.DateTimeField(auto_now=True)
|
||||
|
||||
class Meta:
|
||||
unique_together = [("user", "room")]
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.user.email} @ {self.room.name}: {self.position}px"
|
||||
|
||||
|
||||
def record(room, verb, actor=None, **data):
|
||||
"""Record a game event in the drama log."""
|
||||
return GameEvent.objects.create(room=room, actor=actor, verb=verb, data=data)
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
from django.test import TestCase
|
||||
from django.db import IntegrityError
|
||||
|
||||
from apps.drama.models import GameEvent, record
|
||||
from apps.drama.models import GameEvent, ScrollPosition, record
|
||||
from apps.epic.models import Room
|
||||
from apps.lyric.models import User
|
||||
|
||||
@@ -42,3 +43,31 @@ class GameEventModelTest(TestCase):
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user