arm-scan-gateway/api/tests/conftest.py
Andrey Epifancev ea49abd03b Срез 0 [5.3]: воркер шлюза (src/core/worker.py) и unit-тесты сценариев spec
on_request проверяет тело (SCHEMA_MISMATCH без ack, R-16), дедуплицирует по job_id
(задания в работе + LRU DONE_CACHE_SIZE, R-17) и запускает задачу: ack до чтения S3 и
до ожидания слота, семафор SCAN_MAX_INFLIGHT, handle. handle: S3 (один бакет, R-19) ->
горячая папка через asyncio.to_thread (R-15) -> опрос до min(reply_deadline, старт +
SCAN_TIMEOUT_SECONDS) (R-14, R-20) -> raw/{job_id}.json до нормализации (R-18) ->
нормализатор -> results/{file_id}/{job_id}/result.json -> конверт. Таблица ошибок D-7,
публикация через NatsGateway с повторами, PublishFailed логируется. Текст ошибки
очищается от одиночных суррогатов и ограничен 4000 символами (T10.1, T10.2).

Тесты: фейки S3/NATS с общим журналом событий, настоящий LocalHotFolder и process_once
эмулятора; каждый конверт проверяется JSON Schema контракта. Фикстура log_lines в
conftest перехватывает loguru. src.core.worker и src.core.health — в строгом mypy.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 03:48:37 +04:00

55 lines
2.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

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.

"""Общие фикстуры. Окружение тестов — `api/.env.test`: его подключает pytest.ini (`ENV_FILE=.env.test`, путь от
каталога api/), поэтому `import src` (он создаёт приложение) работает без своей настройки окружения
и без инфраструктуры."""
import sys
from collections.abc import Iterator
import pytest
from loguru import logger
@pytest.fixture(autouse=True)
def _fresh_settings():
"""get_settings кэшируется (lru_cache): сбрасываем кэш до и после каждого теста."""
# Импорт отложен намеренно: `import src` создаёт приложение и читает окружение
from src.core.config import get_settings # noqa: PLC0415
get_settings.cache_clear()
yield
get_settings.cache_clear()
@pytest.fixture
def minimal_env_file(tmp_path, monkeypatch):
"""Env-файл только с обязательными настройками (без `.env.test`): для проверки значений по умолчанию."""
env_file = tmp_path / "minimal.env"
env_file.write_text(
"\n".join(
[
"OPENBAO__MINIO__MINIO_URL=localhost:9000",
"OPENBAO__MINIO__MINIO_ADMIN_LOGIN=minioadmin",
"OPENBAO__MINIO__MINIO_ADMIN_PASSWORD=minioadmin",
"OPENBAO__MINIO__MINIO_BUCKET=arm-ka",
"OPENBAO__NATS__NATS_URL=nats://localhost:4222",
"SCAN_HOTFOLDER_PATH=/tmp/scan-gateway-test-hotfolder",
]
)
)
monkeypatch.setenv("ENV_FILE", str(env_file))
return env_file
@pytest.fixture
def log_lines() -> Iterator[list[str]]:
"""Перехват loguru: строки `LEVEL|сообщение` вместо stderr (pytest запускается с --capture=no, вывод чистый).
Обработчик stderr по умолчанию восстанавливается после теста.
"""
lines: list[str] = []
logger.remove()
logger.add(lambda message: lines.append(str(message)), level="DEBUG", format="{level}|{message}")
yield lines
logger.remove()
logger.add(sys.stderr)