Срез 0: скелет tabular-parser — без фронта и БД, воркер NATS без JetStream, парсер-заглушка, контракт v1.0 #3
@ -15,6 +15,7 @@ Spec tabular-recognition-service: «Ack раньше результата», «
|
||||
"""
|
||||
|
||||
import asyncio
|
||||
import contextlib
|
||||
import copy
|
||||
import importlib
|
||||
import io
|
||||
@ -166,9 +167,13 @@ async def uploads() -> AsyncIterator[Uploads]:
|
||||
try:
|
||||
yield store
|
||||
finally:
|
||||
for bucket, key in store.keys:
|
||||
await client.remove_object(bucket, key)
|
||||
await client.close_session()
|
||||
try:
|
||||
for bucket, key in store.keys:
|
||||
# сбой удаления одного объекта не должен оставлять в MinIO остальные
|
||||
with contextlib.suppress(Exception):
|
||||
await client.remove_object(bucket, key)
|
||||
finally:
|
||||
await client.close_session()
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
@ -176,13 +181,17 @@ async def service(monkeypatch: pytest.MonkeyPatch) -> AsyncIterator[None]:
|
||||
"""Приложение в процессе теста: lifespan с `NATS_ENABLED=True` (в `.env.test` — false); выход — остановка."""
|
||||
monkeypatch.setattr(app_module.settings, "NATS_ENABLED", True)
|
||||
application = app_module.app
|
||||
tasks: list[asyncio.Task[None]] = []
|
||||
async with application.router.lifespan_context(application):
|
||||
if not await application.state.nats.wait_ready(READY_TIMEOUT):
|
||||
pytest.fail(
|
||||
f"NATS недоступен ({app_module.settings.OPENBAO.NATS.NATS_URL}, .env.test; make up)", pytrace=False
|
||||
)
|
||||
tasks = list(application.state.worker._tasks)
|
||||
yield
|
||||
assert application.state.worker._tasks == [], "рабочие корутины воркера не остановлены"
|
||||
# `_tasks` обнуляется в `stop()` безусловно — проверяем сами задачи, снятые до выхода из lifespan
|
||||
assert tasks, "воркер не запустил рабочие корутины"
|
||||
assert all(t.done() for t in tasks), "рабочие корутины воркера не остановлены"
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user