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>
55 lines
2.2 KiB
Python
55 lines
2.2 KiB
Python
"""Общие фикстуры. Окружение тестов — `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)
|