dc9a23f801
Docker Image CI / build (pull_request) Has been cancelled
Первый этап эпика рефакторинга рендер-пайплайна (#34): снимает полные snapshot'ы выходов generate_channel_rss (RSS XML) и generate_channel_html (HTML) на записанном РЕАЛЬНОМ корпусе (4 канала: bladerunnerblues, embedoka, meow_design, theyforcedme) и закрепляет тестом сравнения. Оракул для всех последующих этапов: изменение байтов фида без ссылки на пункт реестра §3 спеки = регрессия. Никакой продакшн рендер-код не тронут — только тест-инфра. - tests/golden_replay.py: реплей-загрузчик (распикливает recorded/*.cache| *.chatinfo, monkeypatch tg_cache.cached_get_chat_history/cached_get_chat — буквально прод-путь cache-hit) + генератор goldens + нормализаторы. - tests/test_stage0_golden.py: оракул (11 тестов — RSS×4, HTML×4 + guards). - tests/test_data/golden/: 8 замороженных snapshot'ов (~1.9 МБ). - tests/conftest.py: пин TZ=UTC (naive-даты kurigram интерпретируются в локальной tz → без пина pubDate дрейфует между машинами). Нормализации (симметрично golden+actual, минимальные, каждая с источником недетерминизма): strip <lastBuildDate> (feedgen now()), strip <generator> (страховка), сортировка <div class="message-flags"> (merged-флаги — list(set(...)), hash-порядок; убирается коммитом этапа 2 по §3.8). Детерминизм подтверждён 3 способами: двойной in-process захват, разные PYTHONHASHSEED, регенерация в отдельном процессе — нормализованный вывод байт-идентичен. Полный сюит 332 passed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
25 lines
878 B
Python
25 lines
878 B
Python
"""Shared test bootstrap (issue #17).
|
|
|
|
Ensure the repo root is importable and install the config mock BEFORE any test
|
|
module imports application code. Pytest imports conftest.py before collecting
|
|
test modules, so doing this here (instead of a per-module preamble) makes the
|
|
suite order-independent regardless of collection order or invocation directory.
|
|
"""
|
|
import os
|
|
import sys
|
|
import time
|
|
|
|
ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
|
|
if ROOT not in sys.path:
|
|
sys.path.insert(0, ROOT)
|
|
|
|
import tests.mock_config as _mock_config
|
|
|
|
sys.modules['config'] = _mock_config
|
|
|
|
# Pin the runner timezone to UTC (stage-0 golden determinism, issue #27).
|
|
# Naive kurigram dates are interpreted by datetime.timestamp() in the LOCAL tz, so
|
|
# without this pin RSS <pubDate> values drift between machines (this sandbox is MSK).
|
|
os.environ['TZ'] = 'UTC'
|
|
time.tzset()
|