75 lines
3.0 KiB
Python
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 == [] |