initial commit (backend)
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
"""
|
||||
Тесты для 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 == []
|
||||
Reference in New Issue
Block a user