- Исправлен PollSerializer для создания опросов с опциями - Добавлено поле read_only_fields для корректной валидации - Реализована отправка WebSocket уведомлений при создании опроса - Исправлен импорт serialize_message из communications.serialization - Добавлен обработчик poll_update в UserConsumer для WebSocket событий - Исправлен эндпоинт /results/ для возврата user_voted_option_ids - Добавлено поле voters в PollOptionSerializer для списка проголосовавших - Реализована инициализация poll виджетов после рендера сообщений - Добавлено игнорирование poll_update в notification-manager - Исправлены стили для request list badges (height, word-break, flex) - Восстановлены стили team-wheel (.wheel-focus, .scroll-arc) из git истории - Реализовано отображение forwarded message info в messageRendererV2 - Множественные улучшения UI и UX для опросов Fixes: создание опросов, голосование, отображение результатов, список проголосовавших
95 lines
2.6 KiB
Python
95 lines
2.6 KiB
Python
# 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
|