""" Тесты для 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 == []