new _room_gear.html to manage room actions for various gamers (e.g., founders & guests); new _room.scss for gatekeeper styling (still flimsy); added new .btn-abandon Bl-btn palette to _button-pad.scss; new FTs & epic view ITs assert functionality (100 percent coverage, fully passing test suite)
This commit is contained in:
@@ -2,7 +2,7 @@ from django.test import TestCase
|
||||
from django.urls import reverse
|
||||
|
||||
from apps.lyric.models import User
|
||||
from apps.epic.models import Room
|
||||
from apps.epic.models import Room, RoomInvite
|
||||
|
||||
|
||||
class RoomCreationViewTest(TestCase):
|
||||
@@ -74,3 +74,58 @@ class GateStatusViewTest(TestCase):
|
||||
)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertContains(response, "gate-modal")
|
||||
|
||||
|
||||
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/")
|
||||
|
||||
@@ -10,5 +10,7 @@ urlpatterns = [
|
||||
path('room/<uuid:room_id>/gate/<int:slot_number>/drop_token', views.drop_token, name='drop_token'),
|
||||
path('room/<uuid:room_id>/gate/invite', views.invite_gamer, name='invite_gamer'),
|
||||
path('room/<uuid:room_id>/gate/status', views.gate_status, name='gate_status'),
|
||||
path('room/<uuid:room_id>/delete', views.delete_room, name='delete_room'),
|
||||
path('room/<uuid:room_id>/abandon', views.abandon_room, name='abandon_room'),
|
||||
]
|
||||
|
||||
|
||||
@@ -56,6 +56,27 @@ def invite_gamer(request, room_id):
|
||||
)
|
||||
return redirect("epic:gatekeeper", room_id=room_id)
|
||||
|
||||
@login_required
|
||||
def delete_room(request, room_id):
|
||||
if request.method == "POST":
|
||||
room = Room.objects.get(id=room_id)
|
||||
if request.user == room.owner:
|
||||
room.delete()
|
||||
return redirect("/gameboard/")
|
||||
|
||||
@login_required
|
||||
def abandon_room(request, room_id):
|
||||
if request.method == "POST":
|
||||
room = Room.objects.get(id=room_id)
|
||||
room.gate_slots.filter(gamer=request.user).update(
|
||||
gamer=None, status="EMPTY", filled_at=None
|
||||
)
|
||||
room.invites.filter(
|
||||
invitee_email=request.user.email,
|
||||
status=RoomInvite.PENDING
|
||||
).delete()
|
||||
return redirect("/gameboard/")
|
||||
|
||||
def gate_status(request, room_id):
|
||||
room = Room.objects.get(id=room_id)
|
||||
if room.gate_status == Room.OPEN:
|
||||
|
||||
Reference in New Issue
Block a user