Skip to content

Commit dee0d27

Browse files
committed
Add Test that use AwaitableFields
1 parent 689f02c commit dee0d27

File tree

1 file changed

+76
-0
lines changed

1 file changed

+76
-0
lines changed

tests/test_awaitable_field.py

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
from typing import Awaitable, List, Optional
2+
3+
import pytest
4+
from sqlalchemy.exc import MissingGreenlet
5+
from sqlalchemy.ext.asyncio import create_async_engine
6+
from sqlalchemy.util.concurrency import greenlet_spawn
7+
8+
from sqlmodel import Field, Relationship, SQLModel, select
9+
from sqlmodel.ext.asyncio.async_model import AsyncSQLModel, AwaitableField
10+
from sqlmodel.ext.asyncio.session import AsyncSession
11+
12+
13+
@pytest.mark.asyncio
14+
async def test_awaitable_nomral_field(clear_sqlmodel):
15+
class Hero(AsyncSQLModel, table=True):
16+
id: Optional[int] = Field(default=None, primary_key=True)
17+
name: str
18+
secret_name: str
19+
age: Optional[int] = None
20+
awt_name: Awaitable[str] = AwaitableField(field="name")
21+
awt_age: Awaitable[str] = AwaitableField(field="age")
22+
23+
hero_deadpond = Hero(name="Deadpond", secret_name="Dive Wilson")
24+
25+
engine = create_async_engine("sqlite+aiosqlite://")
26+
await greenlet_spawn(SQLModel.metadata.create_all, engine.sync_engine)
27+
28+
async with AsyncSession(engine) as session:
29+
session.add(hero_deadpond)
30+
await session.commit()
31+
32+
# loading expired attribute will raise MissingGreenlet error
33+
with pytest.raises(MissingGreenlet):
34+
hero_deadpond.name
35+
36+
name = await hero_deadpond.awt_name
37+
assert name == "Deadpond"
38+
39+
40+
@pytest.mark.asyncio
41+
async def test_awaitable_relation_field(clear_sqlmodel):
42+
class Team(AsyncSQLModel, table=True):
43+
id: Optional[int] = Field(default=None, primary_key=True)
44+
name: str = Field(index=True)
45+
46+
heroes: List["Hero"] = Relationship()
47+
awt_heroes: Awaitable[List["Hero"]] = AwaitableField(field="heroes")
48+
49+
class Hero(AsyncSQLModel, table=True):
50+
id: Optional[int] = Field(default=None, primary_key=True)
51+
name: str
52+
53+
team_id: Optional[int] = Field(default=None, foreign_key="team.id")
54+
team: Optional[Team] = Relationship(back_populates="heroes")
55+
awt_team: Awaitable[Optional[Team]] = AwaitableField(field="team")
56+
57+
team_preventers = Team(name="Preventers")
58+
hero_rusty_man = Hero(name="Rusty-Man", team=team_preventers)
59+
60+
engine = create_async_engine("sqlite+aiosqlite://")
61+
await greenlet_spawn(SQLModel.metadata.create_all, engine.sync_engine)
62+
63+
async with AsyncSession(engine) as session:
64+
session.add(hero_rusty_man)
65+
await session.commit()
66+
67+
async with AsyncSession(engine) as session:
68+
hero = (await session.exec(select(Hero).where(Hero.name == "Rusty-Man"))).one()
69+
70+
# loading lazy loading attribute will raise MissingGreenlet error
71+
with pytest.raises(MissingGreenlet):
72+
hero.team
73+
74+
team = await hero.awt_team
75+
assert team
76+
assert team.name == "Preventers"

0 commit comments

Comments
 (0)