# tests/realtime/conftest.py """ Pytest fixtures для тестирования WebSocket consumers. """ import pytest from channels.testing import WebsocketCommunicator from django.contrib.auth import get_user_model from django.contrib.auth.models import AnonymousUser from communications.models import Chat, ChatMembership from realtime.consumers import UserConsumer User = get_user_model() @pytest.fixture def user(db): """Создает тестового пользователя.""" return User.objects.create_user( email='testuser@example.com', password='testpass123', phone_number='+79991234567', first_name='Test', last_name='User' ) @pytest.fixture def user2(db): """Создает второго тестового пользователя.""" return User.objects.create_user( email='testuser2@example.com', password='testpass123', phone_number='+79991234568', first_name='Test2', last_name='User2' ) @pytest.fixture def ws_communicator(): """ Фабрика для создания WebSocket communicator. Использование: communicator = await ws_communicator(user=test_user) connected, _ = await communicator.connect() """ async def _create_communicator(user=None, path="/ws/"): """Создает WebsocketCommunicator с указанным пользователем.""" application = UserConsumer.as_asgi() # Создаем scope с пользователем scope = { "type": "websocket", "path": path, "headers": [], "query_string": b"", "user": user if user else AnonymousUser(), } communicator = WebsocketCommunicator(application, path) communicator.scope.update(scope) return communicator return _create_communicator @pytest.fixture def test_chat(db, user): """Создает тестовый чат с пользователем.""" chat = Chat.objects.create( name="Test Chat", type="group" ) ChatMembership.objects.create( chat=chat, user=user, role="member" ) return chat @pytest.fixture def test_chat_with_users(db, user, user2): """Создает чат с двумя пользователями.""" chat = Chat.objects.create( name="Multi User Chat", type="group" ) ChatMembership.objects.create(chat=chat, user=user, role="admin") ChatMembership.objects.create(chat=chat, user=user2, role="member") return chat