|
11 | 11 | from app.database.tables import UsersTable |
12 | 12 | from app.exceptions import PermissionDeniedError |
13 | 13 | from app.settings import settings |
| 14 | +from tests.conftest import rolled_back_db_session |
14 | 15 | from tests.factories import UserFactory |
15 | 16 |
|
16 | 17 |
|
@@ -52,18 +53,24 @@ async def test_create_database_engine_reads_settings_and_can_be_disposed() -> No |
52 | 53 | await close_database_engine(engine) |
53 | 54 |
|
54 | 55 |
|
55 | | -async def test_db_session_insert_is_visible_within_test(db_session: AsyncSession) -> None: |
56 | | - user = UserFactory.build() |
57 | | - db_session.add(user) |
58 | | - await db_session.commit() |
59 | | - |
60 | | - result = await db_session.scalars(sa.select(UsersTable)) |
61 | | - assert len(result.all()) == 1 |
| 56 | +async def test_db_session_teardown_rolls_back_committed_writes(di_container: modern_di.Container) -> None: |
| 57 | + """INVARIANT: a commit inside a test only releases a savepoint, and teardown discards it. |
62 | 58 |
|
| 59 | + The row is read back from an independent connection after teardown, so the check holds whatever runs before it. |
| 60 | + """ |
| 61 | + user = UserFactory.build() |
| 62 | + async with rolled_back_db_session(di_container) as session: |
| 63 | + session.add(user) |
| 64 | + await session.commit() |
| 65 | + assert (await session.scalars(sa.select(UsersTable).where(UsersTable.id == user.id))).one() is user |
63 | 66 |
|
64 | | -async def test_db_session_rolls_back_between_tests(db_session: AsyncSession) -> None: |
65 | | - result = await db_session.scalars(sa.select(UsersTable)) |
66 | | - assert result.all() == [] |
| 67 | + engine = create_database_engine() |
| 68 | + try: |
| 69 | + async with engine.connect() as connection: |
| 70 | + result = await connection.scalars(sa.select(UsersTable.id).where(UsersTable.id == user.id)) |
| 71 | + assert result.all() == [] |
| 72 | + finally: |
| 73 | + await engine.dispose() |
67 | 74 |
|
68 | 75 |
|
69 | 76 | async def test_di_resolved_session_shares_the_overridden_connection( |
|
0 commit comments