Lumen / conftest.py
SilverElixir's picture
Upload 6 files
f6f0626 verified
Raw
History Blame Contribute Delete
3.8 kB
"""
conftest.py — настройка окружения ПЕРЕД импортом bot.py тестами.
bot.py на уровне модуля читает переменные окружения (BOT_TOKEN, GEMINI_API_KEY
и т.д.) и пишет лог-файл по пути из BOT_LOG_PATH (по умолчанию /app/bot.log).
Чтобы тесты можно было гонять где угодно (не только внутри Docker-контейнера
HF Spaces, где /app существует и доступен на запись), здесь выставляются
безопасные заглушки ДО того, как pytest соберёт и импортирует тестовые модули.
Ничего из этого не требует сети и не создаёт реальных Bot()/genai.Client() —
они создаются только внутри main(), которая тестами не вызывается.
"""
import os
import tempfile
os.environ.setdefault("BOT_LOG_PATH", os.path.join(tempfile.gettempdir(), "lumen_test_bot.log"))
os.environ.setdefault("BOT_TOKEN", "test-token-not-real")
os.environ.setdefault("GEMINI_API_KEY", "test-key-not-real")
import copy
import pytest
@pytest.fixture(autouse=True)
def _bot_global_state_guard():
"""Снимок наиболее часто вручную сохраняемых модульных глобалов bot.py перед
каждым тестом и восстановление после (аудит техдолга, август 2026).
Десятки тестов в test_bot_helpers.py вручную сохраняли/восстанавливали
bot.chat_state/bot.GLOBAL_QUOTA/bot.client/bot.bot в try/finally — рабочий, но
повторяющийся бойлерплейт и потенциальный источник тонких утечек между тестами
при росте сьюта (забытый finally молча "протравливает" состояние в следующие
тесты). Это ДОПОЛНИТЕЛЬНАЯ страховочная сетка, а не замена — существующие тесты
со своим ручным cleanup продолжают работать точно так же, как раньше (двойное
восстановление безвредно); новые тесты могут полагаться только на эту фикстуру
и не писать собственный try/finally для этих четырёх глобалов.
Намеренно НЕ снимается снимок вообще всего модульного состояния (_dirty_chat_ids,
TELEGRAM_API_BASE_URL и т.п.) — тесты, которые их трогают, уже сами аккуратно
восстанавливают именно то, что меняют (см. test_flush_dirty_state_once_* и
аналогичные); расширять фикстуру на них без реальной необходимости было бы
накоплением сложности "на будущее", а не решением подтверждённой проблемы."""
import bot as _bot_module
chat_state_snapshot = copy.deepcopy(_bot_module.chat_state)
quota_snapshot = copy.deepcopy(_bot_module.GLOBAL_QUOTA)
client_snapshot = _bot_module.client
bot_snapshot = _bot_module.bot
yield
_bot_module.chat_state.clear()
_bot_module.chat_state.update(chat_state_snapshot)
_bot_module.GLOBAL_QUOTA.clear()
_bot_module.GLOBAL_QUOTA.update(quota_snapshot)
_bot_module.client = client_snapshot
_bot_module.bot = bot_snapshot