роутеры в FastAPI имея что-то типа
@pytest.fixture(scope="function")
async def db_session(new_session_maker) -> AsyncSession:
async with create_async_engine(settings.db_connection_string_test).connect() as connect:
async_session = new_session_maker(bind=connect)
transaction = await connect.begin()
await connect.begin_nested()
@event.listens_for(async_session.sync_session, "after_transaction_end")
def reopen_nested_transaction(session, transaction):
if connect.closed:
return
if not connect.in_nested_transaction():
connect.sync_connection.begin_nested()
yield async_session
await transaction.rollback()
if transaction.is_active:
await transaction.rollback()
И внутри теста
async def test_my_test(client, db_session):
expected_ouput = [...]
db_session.add(MyModel(expected_ouput))
response = await client.get("/se/api/my-path")
assert response.status_code == 200
assert response.json() == expected_ouput
Концептуально - это правильное направление? Пока запрос не видит данные из db_session_add(...) 😞
P.S. у меня одна и та же фикстура для фабрики сессий, где после я переопределяю сессию для клиента
Так а объекты, которые ты добавил в сессию коммитить кто будет?
Сразу после db_session.add(...) Добавить await db_session.commit()? Выглядит вполне разумно, но пока тоже не даёт результатов
client это у нас вообще что?
@pytest.fixture() async def client(new_session_maker) -> AsyncGenerator[AsyncClient, None]: async def override_get_session(): async with new_session_maker() as s: yield s app.dependency_overrides[get_session] = override_get_session async def mock_normal_user(request: Request): user = { "claims": {"preferred_username": "NormalUser"}, "roles": ["role1"], "aud": "aud", "tid": "tid", "access_token": "123", } request.state.user = user return user app.dependency_overrides[azure_scheme] = mock_normal_user async with AsyncClient(app=app, base_url="http://test") as ac: yield ac
Ну выглядит вроде нормально
Только не совсем вижу где связь между db_session фикстурой и вот этой фикстурой клиента.
Всё, да, это было очень логично, большое спасибо. Оно заработало 😊
Обсуждают сегодня