fix: test_db.py вешал make test, когда Postgres недоступен
engine.connect() без таймаута — у asyncpg он не задан по умолчанию — висел на TCP-таймауте ОС вместо быстрого отказа. test_profile.py уже чинил ровно эту проблему сокетным пробником, test_db.py — исходный файл с той же логикой — остался с висящим вариантом. Нашлось руками: Docker недоступен в этой сессии WSL, и make test встал намертво вместо 54 пропущенных тестов.
This commit is contained in:
parent
5f4813ca3b
commit
e162b8fab5
1 changed files with 15 additions and 7 deletions
|
|
@ -17,15 +17,23 @@ from app.db.models import Group, Scenario, Session, Trainee
|
|||
@pytest.fixture
|
||||
async def db():
|
||||
"""Свой движок на каждый тест: глобальный в app.db.base кэшируется и
|
||||
привязывается к первому событийному циклу, а pytest даёт новый на каждый тест."""
|
||||
engine = create_async_engine(get_settings().database_url, poolclass=None)
|
||||
try:
|
||||
async with engine.connect() as probe:
|
||||
await probe.execute(text("select 1"))
|
||||
except Exception as exc: # noqa: BLE001 — важен факт недоступности, не причина
|
||||
await engine.dispose()
|
||||
pytest.skip(f"Postgres недоступен ({type(exc).__name__}) — подними `make dev`")
|
||||
привязывается к первому событийному циклу, а pytest даёт новый на каждый тест.
|
||||
|
||||
Доступность проверяется подключением к порту, а не через engine.connect():
|
||||
у asyncpg нет таймаута по умолчанию, и когда Postgres действительно недоступен
|
||||
(Docker не поднят), connect() висит на TCP-таймауте ОС — минуты, а не секунды,
|
||||
и `make test` зависает вместо того, чтобы пропустить тест. Тот же баг был
|
||||
когда-то и в test_profile.py — здесь чинится тем же способом."""
|
||||
import socket
|
||||
from urllib.parse import urlparse
|
||||
|
||||
url = urlparse(get_settings().database_url)
|
||||
try:
|
||||
socket.create_connection((url.hostname or "localhost", url.port or 5432), timeout=2).close()
|
||||
except OSError as exc:
|
||||
pytest.skip(f"Postgres недоступен ({exc}) — подними `make dev`")
|
||||
|
||||
engine = create_async_engine(get_settings().database_url, poolclass=None)
|
||||
maker = async_sessionmaker(engine, expire_on_commit=False)
|
||||
async with maker() as session:
|
||||
yield session
|
||||
|
|
|
|||
Loading…
Reference in a new issue