Session not committed in tests
Opened this issue · 1 comments
It is not an issue, but rather an important notice, that if you have a middleware, that accesses database for any purpose, and does it not through dependencies injection (as it is done in views), then overriding dependencies in app.dependency obviously will not affect middleware and it will not see any data in database, since it is never committed throughout the tests. If you need data to be actually committed and not just flushed, to be accessible in different sessions, then you would need something like this for session generation:
@pytest.fixture(scope='session')
async def session_generator() -> AsyncGenerator:
async_engine = create_async_engine(
settings.TEST_DB_URL,
pool_pre_ping=True,
echo=settings.ECHO_SQL
)
AsyncSessionLocal = async_sessionmaker(
autocommit=False,
autoflush=False,
bind=async_engine,
future=True,
)
def test_get_session() -> Generator:
try:
yield AsyncSessionLocal
except SQLAlchemyError:
pass
app.dependency_overrides[get_session] = test_get_session
yield AsyncSessionLocal
And test case would start like this
@pytest.mark.anyio
async def test_create_account( session_generator: AsyncSession):
async with session_generator.begin() as session:
await Account.get_or_create()....
Again this is not an issue, but rather a different approach, especially if you rely on some auth middleware. Also it is possible potentially to replace such middleware with Global dependency, but for redirections to auth app you will need to do some dirty stuff with exceptions, etc...
@GoldenCorgo Thank you for the insight.
Since this is very valuable information, I will keep this issue open with a document label.