Files
filwordspl-backend/tests/test_achievements.py
T
2026-09-20 11:45:58 +00:00

75 lines
3.0 KiB
Python

"""
Тесты для check_and_award_achievements.
Проверяют выдачу ачивок без дублей.
"""
import pytest
async def test_achievement_not_awarded_twice(conn, test_user):
"""
Если ачивка уже выдана — второй раз не выдаётся.
"""
from routers.achievements import check_and_award_achievements
# Чистим ачивки тестового юзера
await conn.execute("DELETE FROM user_achievements WHERE user_id = $1", test_user)
# Первый раз
result1 = await check_and_award_achievements(test_user, "levels_completed", 1000)
# Второй раз с тем же значением
result2 = await check_and_award_achievements(test_user, "levels_completed", 1000)
# Второй раз должен вернуть пустой список
assert len(result2) == 0
# Cleanup
await conn.execute("DELETE FROM user_achievements WHERE user_id = $1", test_user)
async def test_achievement_awarded_for_matching_value(conn, test_user):
"""
Ачивка выдаётся, если value соответствует требованию.
"""
from routers.achievements import check_and_award_achievements
await conn.execute("DELETE FROM user_achievements WHERE user_id = $1", test_user)
# Уровень 1 завершён — ачивка "first_level" (levels_completed >= 1)
result = await check_and_award_achievements(test_user, "levels_completed", 1)
# Должна быть минимум одна ачивка (first_level)
assert len(result) >= 1
assert any("first" in a["code"].lower() or "level" in a["code"].lower() for a in result)
await conn.execute("DELETE FROM user_achievements WHERE user_id = $1", test_user)
async def test_achievement_returns_localized_name(conn, test_user):
"""
Название ачивки возвращается на языке пользователя (RU).
"""
from routers.achievements import check_and_award_achievements
await conn.execute("DELETE FROM user_achievements WHERE user_id = $1", test_user)
await conn.execute("UPDATE users SET app_language = 'ru' WHERE telegram_id = $1", test_user)
result = await check_and_award_achievements(test_user, "levels_completed", 1)
assert len(result) >= 1
# Название должно быть непустой строкой (RU)
assert result[0]["name"] # не пусто
assert isinstance(result[0]["name"], str)
await conn.execute("DELETE FROM user_achievements WHERE user_id = $1", test_user)
async def test_achievement_unknown_type_returns_empty(conn, test_user):
"""
Неизвестный тип требования → пустой список.
"""
from routers.achievements import check_and_award_achievements
result = await check_and_award_achievements(test_user, "nonexistent_type_xyz", 999)
assert result == []