Files
bottohelp/test_services/test_game_service.py
T

136 lines
6.3 KiB
Python

"""
Тесты для сервиса управления играми.
Проверяет бизнес-логику игровых механик.
Включает:
- Создание и управление игровыми сессиями
- Игру в камень-ножницы-бумага с поддержкой русского ввода
- Обработку ошибок и валидацию
- Очистку старых сессий
"""
import pytest
from unittest.mock import Mock
from services.game_service import GameService, GameSession
from core.exceptions import ValidationError
class TestGameService:
"""Тесты сервиса игр"""
@pytest.fixture
def user_repo(self):
"""Мок репозитория пользователей"""
return Mock()
@pytest.fixture
def score_repo(self):
"""Мок репозитория очков"""
return Mock()
@pytest.fixture
def game_service(self, user_repo, score_repo):
"""Экземпляр сервиса игр"""
return GameService(user_repo, score_repo)
def test_create_game_session_rock_paper_scissors(self, game_service):
"""Тест создания сессии для камень-ножницы-бумага"""
session = game_service.create_game_session('rock_paper_scissors', 123456789, -1001234567890)
assert isinstance(session, GameSession)
assert session.game_type == 'rock_paper_scissors'
assert session.player_id == 123456789
assert session.chat_id == -1001234567890
assert session.status == "active"
assert session.game_id.startswith('roc_')
assert session.data['player_choice'] is None
assert session.data['bot_choice'] is None
assert session.data['result'] is None
def test_create_game_session_invalid_type(self, game_service):
"""Тест создания сессии с неверным типом игры"""
with pytest.raises(ValidationError, match="Неизвестный тип игры"):
game_service.create_game_session('invalid_game', 123456789, -1001234567890)
def test_get_game_session(self, game_service):
"""Тест получения игровой сессии"""
session = game_service.create_game_session('rock_paper_scissors', 123456789, -1001234567890)
retrieved = game_service.get_game_session(session.game_id)
assert retrieved == session
def test_get_game_session_not_found(self, game_service):
"""Тест получения несуществующей сессии"""
retrieved = game_service.get_game_session('nonexistent_id')
assert retrieved is None
def test_end_game_session(self, game_service):
"""Тест завершения игровой сессии"""
session = game_service.create_game_session('rock_paper_scissors', 123456789, -1001234567890)
result = game_service.end_game_session(session.game_id)
assert result is True
assert session.status == "completed"
assert game_service.get_game_session(session.game_id) is None
def test_end_game_session_not_found(self, game_service):
"""Тест завершения несуществующей сессии"""
result = game_service.end_game_session('nonexistent_id')
assert result is False
def test_play_rock_paper_scissors_english(self, game_service):
"""Тест игры в RPS с английским выбором"""
session = game_service.create_game_session('rock_paper_scissors', 123456789, -1001234567890)
result = game_service.play_rock_paper_scissors(session.game_id, 'rock')
assert result['result'] in ['win', 'draw', 'lose']
assert result['player_choice'] == 'rock'
assert result['bot_choice'] in ['rock', 'paper', 'scissors']
assert 'points' in result
def test_play_rock_paper_scissors_russian(self, game_service):
"""Тест игры в RPS с русским выбором.
Проверяет поддержку русского ввода: 'камень' -> 'rock'
"""
session = game_service.create_game_session('rock_paper_scissors', 123456789, -1001234567890)
result = game_service.play_rock_paper_scissors(session.game_id, 'камень')
assert result['result'] in ['win', 'draw', 'lose']
assert result['player_choice'] == 'rock'
assert result['bot_choice'] in ['rock', 'paper', 'scissors']
assert 'points' in result
def test_play_rock_paper_scissors_invalid_choice(self, game_service):
"""Тест игры в RPS с неверным выбором"""
session = game_service.create_game_session('rock_paper_scissors', 123456789, -1001234567890)
with pytest.raises(ValidationError, match="Неверный выбор"):
game_service.play_rock_paper_scissors(session.game_id, 'invalid')
def test_play_rock_paper_scissors_game_not_found(self, game_service):
"""Тест игры в RPS с несуществующей сессией"""
with pytest.raises(ValidationError, match="Игра не найдена или неверный тип игры"):
game_service.play_rock_paper_scissors('nonexistent_id', 'rock')
def test_play_rock_paper_scissors_wrong_game_type(self, game_service):
"""Тест игры в RPS с неверным типом игры"""
session = game_service.create_game_session('quiz', 123456789, -1001234567890)
with pytest.raises(ValidationError, match="Игра не найдена или неверный тип игры"):
game_service.play_rock_paper_scissors(session.game_id, 'rock')
def test_cleanup_old_sessions(self, game_service):
"""Тест очистки старых сессий"""
# Создаем сессию
session = game_service.create_game_session('rock_paper_scissors', 123456789, -1001234567890)
# Очищаем старые сессии (должна очиститься, если сессия старая)
game_service.cleanup_old_sessions(-1) # -1 минута - все старые
# Проверяем, что сессия удалена
assert game_service.get_game_session(session.game_id) is None