mirror of
https://github.com/barkeser2002/offline-db.git
synced 2026-09-25 13:46:12 +03:00
Added `check_room_capacity` to `WatchPartyConsumer` to deny connections when a room reaches its `max_participants` limit. Updated the frontend to include a modal input for `max_participants` when creating a new watch party. Checked off task in development plan. Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
86 lines
3.3 KiB
Python
86 lines
3.3 KiB
Python
import pytest
|
|
from channels.testing import WebsocketCommunicator
|
|
from django.contrib.auth import get_user_model
|
|
from apps.watchparty.models import Room, Participant
|
|
from content.models import Anime, Season, Episode
|
|
from asgiref.sync import sync_to_async
|
|
from django.urls import path
|
|
from apps.watchparty.consumers import WatchPartyConsumer
|
|
import uuid
|
|
|
|
User = get_user_model()
|
|
|
|
@pytest.mark.django_db(transaction=True)
|
|
@pytest.mark.asyncio
|
|
async def test_max_participants_limit():
|
|
user1 = await sync_to_async(User.objects.create_user)(username='user1', password='p')
|
|
user2 = await sync_to_async(User.objects.create_user)(username='user2', password='p')
|
|
user3 = await sync_to_async(User.objects.create_user)(username='user3', password='p')
|
|
|
|
anime = await sync_to_async(Anime.objects.create)(title="Test Anime")
|
|
season = await sync_to_async(Season.objects.create)(anime=anime, number=1)
|
|
episode = await sync_to_async(Episode.objects.create)(season=season, number=1)
|
|
|
|
# room with max 2 participants (host + 1 viewer)
|
|
room = await sync_to_async(Room.objects.create)(host=user1, episode=episode, max_participants=2)
|
|
|
|
from aniscrap_core.asgi import application
|
|
|
|
# Communicator 1: host connects
|
|
comm1 = WebsocketCommunicator(application, f"/ws/watch-party/{room.uuid}/")
|
|
comm1.scope["user"] = user1
|
|
connected1, _ = await comm1.connect()
|
|
assert connected1
|
|
|
|
# Communicator 2: viewer 1 connects
|
|
comm2 = WebsocketCommunicator(application, f"/ws/watch-party/{room.uuid}/")
|
|
comm2.scope["user"] = user2
|
|
connected2, _ = await comm2.connect()
|
|
assert connected2
|
|
|
|
# Communicator 3: viewer 2 connects (should be denied)
|
|
comm3 = WebsocketCommunicator(application, f"/ws/watch-party/{room.uuid}/")
|
|
comm3.scope["user"] = user3
|
|
connected3, _ = await comm3.connect()
|
|
assert not connected3
|
|
|
|
# Disconnect everyone
|
|
await comm1.disconnect()
|
|
await comm2.disconnect()
|
|
await comm3.disconnect()
|
|
|
|
@pytest.mark.django_db(transaction=True)
|
|
@pytest.mark.asyncio
|
|
async def test_max_participants_no_limit():
|
|
user1 = await sync_to_async(User.objects.create_user)(username='user1', password='p')
|
|
user2 = await sync_to_async(User.objects.create_user)(username='user2', password='p')
|
|
user3 = await sync_to_async(User.objects.create_user)(username='user3', password='p')
|
|
|
|
anime = await sync_to_async(Anime.objects.create)(title="Test Anime")
|
|
season = await sync_to_async(Season.objects.create)(anime=anime, number=1)
|
|
episode = await sync_to_async(Episode.objects.create)(season=season, number=1)
|
|
|
|
# room with NO limit (max_participants=0)
|
|
room = await sync_to_async(Room.objects.create)(host=user1, episode=episode, max_participants=0)
|
|
|
|
from aniscrap_core.asgi import application
|
|
|
|
comm1 = WebsocketCommunicator(application, f"/ws/watch-party/{room.uuid}/")
|
|
comm1.scope["user"] = user1
|
|
connected1, _ = await comm1.connect()
|
|
assert connected1
|
|
|
|
comm2 = WebsocketCommunicator(application, f"/ws/watch-party/{room.uuid}/")
|
|
comm2.scope["user"] = user2
|
|
connected2, _ = await comm2.connect()
|
|
assert connected2
|
|
|
|
comm3 = WebsocketCommunicator(application, f"/ws/watch-party/{room.uuid}/")
|
|
comm3.scope["user"] = user3
|
|
connected3, _ = await comm3.connect()
|
|
assert connected3
|
|
|
|
await comm1.disconnect()
|
|
await comm2.disconnect()
|
|
await comm3.disconnect()
|