|
2 | 2 | from contextlib import asynccontextmanager |
3 | 3 | from typing import AsyncGenerator, List |
4 | 4 |
|
| 5 | +import pytest |
5 | 6 | import pytest_asyncio |
6 | 7 | from sqlalchemy import insert, select, update, delete |
7 | | -from sqlalchemy.orm import Session |
| 8 | +from sqlalchemy.orm import Session, selectinload |
| 9 | +from sqlalchemy.orm.exc import DetachedInstanceError |
8 | 10 |
|
9 | | -from tests.conftest import async_db as db, Base, User |
| 11 | +from tests.conftest import async_db as db, Base, User, Group |
10 | 12 |
|
11 | 13 | @pytest_asyncio.fixture |
12 | 14 | async def prepare_database() -> AsyncGenerator[None, None]: |
@@ -124,3 +126,31 @@ def get_user(session: Session, user_id: int): |
124 | 126 |
|
125 | 127 | user_id = await db.run_sync(get_user, 2, on_close_pre = lambda r: r.id) |
126 | 128 | assert user_id == 2 |
| 129 | + |
| 130 | +async def test_executor(fake_users): |
| 131 | + user = await db.get(User, 1) |
| 132 | + assert user.id == 1 |
| 133 | + assert user.username == 'User-1' |
| 134 | + assert user.group_id is None |
| 135 | + with pytest.raises(DetachedInstanceError): |
| 136 | + assert user.group is None |
| 137 | + |
| 138 | + # test relationship |
| 139 | + group = Group(name = 'group1') |
| 140 | + async with db.session_maker() as session: |
| 141 | + await db.save(group, refresh = True, session = session) |
| 142 | + assert group.id == 1 |
| 143 | + user.group_id = group.id |
| 144 | + await db.save(user, group, refresh = True, session = session) |
| 145 | + assert user.group_id == group.id |
| 146 | + assert user.group.name == 'group1' # type: ignore |
| 147 | + |
| 148 | + user2 = await db.get(User, 2, session = session, options = [selectinload(User.group)]) |
| 149 | + assert user2.group is None |
| 150 | + |
| 151 | + user3 = await db.scalar(select(User).where(User.id == 3), session = session) |
| 152 | + assert user3.group is None |
| 153 | + |
| 154 | + users = await db.scalars_all(select(User), session = session) |
| 155 | + for user in users: |
| 156 | + assert user.group is None if user.group_id is None else user.group |
0 commit comments