Skip to content

Commit 3fcbffd

Browse files
committed
Test MappedColumn support for sa_column field
1 parent 63abd0a commit 3fcbffd

File tree

1 file changed

+122
-0
lines changed

1 file changed

+122
-0
lines changed
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
from typing import Optional
2+
3+
import pytest
4+
from sqlalchemy import Integer, String
5+
from sqlalchemy.orm import mapped_column
6+
from sqlmodel import Field, SQLModel
7+
8+
9+
def test_sa_column_takes_precedence() -> None:
10+
class Item(SQLModel, table=True):
11+
id: Optional[int] = Field(
12+
default=None,
13+
sa_column=mapped_column(String, primary_key=True, nullable=False),
14+
)
15+
16+
# It would have been nullable with no sa_column
17+
assert Item.id.nullable is False # type: ignore
18+
assert isinstance(Item.id.type, String) # type: ignore
19+
20+
21+
def test_sa_column_no_sa_args() -> None:
22+
with pytest.raises(RuntimeError):
23+
24+
class Item(SQLModel, table=True):
25+
id: Optional[int] = Field(
26+
default=None,
27+
sa_column_args=[Integer],
28+
sa_column=mapped_column(Integer, primary_key=True),
29+
)
30+
31+
32+
def test_sa_column_no_sa_kargs() -> None:
33+
with pytest.raises(RuntimeError):
34+
35+
class Item(SQLModel, table=True):
36+
id: Optional[int] = Field(
37+
default=None,
38+
sa_column_kwargs={"primary_key": True},
39+
sa_column=mapped_column(Integer, primary_key=True),
40+
)
41+
42+
43+
def test_sa_column_no_type() -> None:
44+
with pytest.raises(RuntimeError):
45+
46+
class Item(SQLModel, table=True):
47+
id: Optional[int] = Field(
48+
default=None,
49+
sa_type=Integer,
50+
sa_column=mapped_column(Integer, primary_key=True),
51+
)
52+
53+
54+
def test_sa_column_no_primary_key() -> None:
55+
with pytest.raises(RuntimeError):
56+
57+
class Item(SQLModel, table=True):
58+
id: Optional[int] = Field(
59+
default=None,
60+
primary_key=True,
61+
sa_column=mapped_column(Integer, primary_key=True),
62+
)
63+
64+
65+
def test_sa_column_no_nullable() -> None:
66+
with pytest.raises(RuntimeError):
67+
68+
class Item(SQLModel, table=True):
69+
id: Optional[int] = Field(
70+
default=None,
71+
nullable=True,
72+
sa_column=mapped_column(Integer, primary_key=True),
73+
)
74+
75+
76+
def test_sa_column_no_foreign_key() -> None:
77+
with pytest.raises(RuntimeError):
78+
79+
class Team(SQLModel, table=True):
80+
id: Optional[int] = Field(default=None, primary_key=True)
81+
name: str
82+
83+
class Hero(SQLModel, table=True):
84+
id: Optional[int] = Field(default=None, primary_key=True)
85+
team_id: Optional[int] = Field(
86+
default=None,
87+
foreign_key="team.id",
88+
sa_column=mapped_column(Integer, primary_key=True),
89+
)
90+
91+
92+
def test_sa_column_no_unique() -> None:
93+
with pytest.raises(RuntimeError):
94+
95+
class Item(SQLModel, table=True):
96+
id: Optional[int] = Field(
97+
default=None,
98+
unique=True,
99+
sa_column=mapped_column(Integer, primary_key=True),
100+
)
101+
102+
103+
def test_sa_column_no_index() -> None:
104+
with pytest.raises(RuntimeError):
105+
106+
class Item(SQLModel, table=True):
107+
id: Optional[int] = Field(
108+
default=None,
109+
index=True,
110+
sa_column=mapped_column(Integer, primary_key=True),
111+
)
112+
113+
114+
def test_sa_column_no_ondelete() -> None:
115+
with pytest.raises(RuntimeError):
116+
117+
class Item(SQLModel, table=True):
118+
id: Optional[int] = Field(
119+
default=None,
120+
sa_column=mapped_column(Integer, primary_key=True),
121+
ondelete="CASCADE",
122+
)

0 commit comments

Comments
 (0)