core/tests/test_simple_unfollow_test.py
2025-05-31 17:18:31 +03:00

131 lines
5.3 KiB
Python
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
Простой тест ключевой логики unfollow без декораторов.
Проверяет исправления:
1. Возврат актуального списка подписок даже при ошибке
2. Инвалидацию кэша после операций
"""
import asyncio
import os
import sys
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
from cache.cache import get_cached_follower_topics
from services.redis import redis
from utils.logger import root_logger as logger
async def test_unfollow_key_fixes():
"""
Тестируем ключевые исправления в логике unfollow:
ДО исправления:
- unfollow возвращал пустой список при ошибке "following was not found"
- клиент не обновлял UI из-за условия if (result && !result.error)
ПОСЛЕ исправления:
- unfollow всегда возвращает актуальный список подписок
- добавлена инвалидация кэша
"""
logger.info("🧪 Тестирование ключевых исправлений unfollow")
# 1. Проверяем функцию получения подписок
logger.info("1⃣ Тестируем get_cached_follower_topics")
# Очищаем кэш и получаем свежие данные
await redis.execute("DEL", "author:follows-topics:1")
topics = await get_cached_follower_topics(1)
logger.info(f"✅ Получено {len(topics)} тем из БД/кэша")
if topics:
logger.info(f" Пример темы: {topics[0].get('slug', 'N/A')}")
# 2. Проверяем инвалидацию кэша
logger.info("2⃣ Тестируем инвалидацию кэша")
cache_key = "author:follows-topics:test_user"
# Устанавливаем тестовые данные
await redis.execute("SET", cache_key, '[{"id": 1, "slug": "test"}]')
# Проверяем что данные есть
cached_before = await redis.execute("GET", cache_key)
logger.info(f" Данные до инвалидации: {cached_before}")
# Инвалидируем
await redis.execute("DEL", cache_key)
# Проверяем что данные удалились
cached_after = await redis.execute("GET", cache_key)
logger.info(f" Данные после инвалидации: {cached_after}")
if cached_after is None:
logger.info("✅ Инвалидация кэша работает корректно")
else:
logger.error("❌ Ошибка инвалидации кэша")
# 3. Проверяем что функция всегда возвращает список
logger.info("3⃣ Тестируем что get_cached_follower_topics всегда возвращает список")
# Даже если кэш пустой, должен вернуться список из БД
await redis.execute("DEL", "author:follows-topics:1")
topics_fresh = await get_cached_follower_topics(1)
if isinstance(topics_fresh, list):
logger.info(f"✅ Функция вернула список с {len(topics_fresh)} элементами")
else:
logger.error(f"❌ Функция вернула не список: {type(topics_fresh)}")
logger.info("🎯 Ключевые исправления работают корректно!")
async def test_error_handling_simulation():
"""
Симулируем поведение до и после исправления
"""
logger.info("🔄 Симуляция поведения до и после исправления")
# ДО исправления (старое поведение)
logger.info("📜 СТАРОЕ поведение:")
old_result = {
"error": "following was not found",
"topics": [], # ❌ Пустой список
}
logger.info(f" Результат: {old_result}")
logger.info(f" if (result && !result.error) = {bool(old_result and not old_result.get('error'))}")
logger.info(" ❌ UI не обновится из-за ошибки!")
# ПОСЛЕ исправления (новое поведение)
logger.info("НОВОЕ поведение:")
# Получаем актуальные данные из кэша/БД
actual_topics = await get_cached_follower_topics(1)
new_result = {
"error": "following was not found",
"topics": actual_topics, # ✅ Актуальный список
}
logger.info(f" Результат: error='{new_result['error']}', topics={len(new_result['topics'])} элементов")
logger.info(" ✅ UI получит актуальное состояние даже при ошибке!")
async def main():
"""Главная функция теста"""
try:
await test_unfollow_key_fixes()
await test_error_handling_simulation()
logger.info("🎉 Все тесты прошли успешно!")
except Exception as e:
logger.error(f"❌ Ошибка в тестах: {e}")
import traceback
traceback.print_exc()
if __name__ == "__main__":
asyncio.run(main())