Coverage for tests/test_main.py: 100%
87 statements
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-27 00:03 +0000
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-27 00:03 +0000
1from typing import List, Optional 1OPQRSTUVWX
3import pytest 1OPQRSTUVWX
4from sqlalchemy.exc import IntegrityError 1OPQRSTUVWX
5from sqlalchemy.orm import RelationshipProperty 1OPQRSTUVWX
6from sqlmodel import Field, Relationship, Session, SQLModel, create_engine, select 1OPQRSTUVWX
9def test_should_allow_duplicate_row_if_unique_constraint_is_not_passed(clear_sqlmodel): 1OPQRSTUVWX
10 class Hero(SQLModel, table=True): 1abcdefghij
11 id: Optional[int] = Field(default=None, primary_key=True) 1abcdefghij
12 name: str 1abcdefghij
13 secret_name: str 1abcdefghij
14 age: Optional[int] = None 1abcdefghij
16 hero_1 = Hero(name="Deadpond", secret_name="Dive Wilson") 1abcdefghij
17 hero_2 = Hero(name="Deadpond", secret_name="Dive Wilson") 1abcdefghij
19 engine = create_engine("sqlite://") 1abcdefghij
21 SQLModel.metadata.create_all(engine) 1abcdefghij
23 with Session(engine) as session: 1abcdefghij
24 session.add(hero_1) 1abcdefghij
25 session.commit() 1abcdefghij
26 session.refresh(hero_1) 1abcdefghij
28 with Session(engine) as session: 1abcdefghij
29 session.add(hero_2) 1abcdefghij
30 session.commit() 1abcdefghij
31 session.refresh(hero_2) 1abcdefghij
33 with Session(engine) as session: 1abcdefghij
34 heroes = session.exec(select(Hero)).all() 1abcdefghij
35 assert len(heroes) == 2 1abcdefghij
36 assert heroes[0].name == heroes[1].name 1abcdefghij
39def test_should_allow_duplicate_row_if_unique_constraint_is_false(clear_sqlmodel): 1OPQRSTUVWX
40 class Hero(SQLModel, table=True): 1klmnopqrst
41 id: Optional[int] = Field(default=None, primary_key=True) 1klmnopqrst
42 name: str 1klmnopqrst
43 secret_name: str = Field(unique=False) 1klmnopqrst
44 age: Optional[int] = None 1klmnopqrst
46 hero_1 = Hero(name="Deadpond", secret_name="Dive Wilson") 1klmnopqrst
47 hero_2 = Hero(name="Deadpond", secret_name="Dive Wilson") 1klmnopqrst
49 engine = create_engine("sqlite://") 1klmnopqrst
51 SQLModel.metadata.create_all(engine) 1klmnopqrst
53 with Session(engine) as session: 1klmnopqrst
54 session.add(hero_1) 1klmnopqrst
55 session.commit() 1klmnopqrst
56 session.refresh(hero_1) 1klmnopqrst
58 with Session(engine) as session: 1klmnopqrst
59 session.add(hero_2) 1klmnopqrst
60 session.commit() 1klmnopqrst
61 session.refresh(hero_2) 1klmnopqrst
63 with Session(engine) as session: 1klmnopqrst
64 heroes = session.exec(select(Hero)).all() 1klmnopqrst
65 assert len(heroes) == 2 1klmnopqrst
66 assert heroes[0].name == heroes[1].name 1klmnopqrst
69def test_should_raise_exception_when_try_to_duplicate_row_if_unique_constraint_is_true( 1OPQRSTUVWX
70 clear_sqlmodel,
71):
72 class Hero(SQLModel, table=True): 1EFGHIJKLMN
73 id: Optional[int] = Field(default=None, primary_key=True) 1EFGHIJKLMN
74 name: str 1EFGHIJKLMN
75 secret_name: str = Field(unique=True) 1EFGHIJKLMN
76 age: Optional[int] = None 1EFGHIJKLMN
78 hero_1 = Hero(name="Deadpond", secret_name="Dive Wilson") 1EFGHIJKLMN
79 hero_2 = Hero(name="Deadpond", secret_name="Dive Wilson") 1EFGHIJKLMN
81 engine = create_engine("sqlite://") 1EFGHIJKLMN
83 SQLModel.metadata.create_all(engine) 1EFGHIJKLMN
85 with Session(engine) as session: 1EFGHIJKLMN
86 session.add(hero_1) 1EFGHIJKLMN
87 session.commit() 1EFGHIJKLMN
88 session.refresh(hero_1) 1EFGHIJKLMN
90 with pytest.raises(IntegrityError): 1EFGHIJKLMN
91 with Session(engine) as session: 1EFGHIJKLMN
92 session.add(hero_2) 1EFGHIJKLMN
93 session.commit() 1EFGHIJKLMN
96def test_sa_relationship_property(clear_sqlmodel): 1OPQRSTUVWX
97 """Test https://github.com/tiangolo/sqlmodel/issues/315#issuecomment-1272122306"""
99 class Team(SQLModel, table=True): 1uvwxyzABCD
100 id: Optional[int] = Field(default=None, primary_key=True) 1uvwxyzABCD
101 name: str = Field(unique=True) 1uvwxyzABCD
102 heroes: List["Hero"] = Relationship( # noqa: F821 1uvwxyzABCD
103 sa_relationship=RelationshipProperty("Hero", back_populates="team")
104 )
106 class Hero(SQLModel, table=True): 1uvwxyzABCD
107 id: Optional[int] = Field(default=None, primary_key=True) 1uvwxyzABCD
108 name: str = Field(unique=True) 1uvwxyzABCD
109 team_id: Optional[int] = Field(default=None, foreign_key="team.id") 1uvwxyzABCD
110 team: Optional[Team] = Relationship( 1uvwxyzABCD
111 sa_relationship=RelationshipProperty("Team", back_populates="heroes")
112 )
114 team_preventers = Team(name="Preventers") 1uvwxyzABCD
115 hero_rusty_man = Hero(name="Rusty-Man", team=team_preventers) 1uvwxyzABCD
117 engine = create_engine("sqlite://", echo=True) 1uvwxyzABCD
119 SQLModel.metadata.create_all(engine) 1uvwxyzABCD
121 with Session(engine) as session: 1uvwxyzABCD
122 session.add(hero_rusty_man) 1uvwxyzABCD
123 session.commit() 1uvwxyzABCD
124 session.refresh(hero_rusty_man) 1uvwxyzABCD
125 # The next statement should not raise an AttributeError
126 assert hero_rusty_man.team 1uvwxyzABCD
127 assert hero_rusty_man.team.name == "Preventers" 1uvwxyzABCD