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

1from typing import List, Optional 1OPQRSTUVWX

2 

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

7 

8 

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

15 

16 hero_1 = Hero(name="Deadpond", secret_name="Dive Wilson") 1abcdefghij

17 hero_2 = Hero(name="Deadpond", secret_name="Dive Wilson") 1abcdefghij

18 

19 engine = create_engine("sqlite://") 1abcdefghij

20 

21 SQLModel.metadata.create_all(engine) 1abcdefghij

22 

23 with Session(engine) as session: 1abcdefghij

24 session.add(hero_1) 1abcdefghij

25 session.commit() 1abcdefghij

26 session.refresh(hero_1) 1abcdefghij

27 

28 with Session(engine) as session: 1abcdefghij

29 session.add(hero_2) 1abcdefghij

30 session.commit() 1abcdefghij

31 session.refresh(hero_2) 1abcdefghij

32 

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

37 

38 

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

45 

46 hero_1 = Hero(name="Deadpond", secret_name="Dive Wilson") 1klmnopqrst

47 hero_2 = Hero(name="Deadpond", secret_name="Dive Wilson") 1klmnopqrst

48 

49 engine = create_engine("sqlite://") 1klmnopqrst

50 

51 SQLModel.metadata.create_all(engine) 1klmnopqrst

52 

53 with Session(engine) as session: 1klmnopqrst

54 session.add(hero_1) 1klmnopqrst

55 session.commit() 1klmnopqrst

56 session.refresh(hero_1) 1klmnopqrst

57 

58 with Session(engine) as session: 1klmnopqrst

59 session.add(hero_2) 1klmnopqrst

60 session.commit() 1klmnopqrst

61 session.refresh(hero_2) 1klmnopqrst

62 

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

67 

68 

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

77 

78 hero_1 = Hero(name="Deadpond", secret_name="Dive Wilson") 1EFGHIJKLMN

79 hero_2 = Hero(name="Deadpond", secret_name="Dive Wilson") 1EFGHIJKLMN

80 

81 engine = create_engine("sqlite://") 1EFGHIJKLMN

82 

83 SQLModel.metadata.create_all(engine) 1EFGHIJKLMN

84 

85 with Session(engine) as session: 1EFGHIJKLMN

86 session.add(hero_1) 1EFGHIJKLMN

87 session.commit() 1EFGHIJKLMN

88 session.refresh(hero_1) 1EFGHIJKLMN

89 

90 with pytest.raises(IntegrityError): 1EFGHIJKLMN

91 with Session(engine) as session: 1EFGHIJKLMN

92 session.add(hero_2) 1EFGHIJKLMN

93 session.commit() 1EFGHIJKLMN

94 

95 

96def test_sa_relationship_property(clear_sqlmodel): 1OPQRSTUVWX

97 """Test https://github.com/tiangolo/sqlmodel/issues/315#issuecomment-1272122306""" 

98 

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 ) 

105 

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 ) 

113 

114 team_preventers = Team(name="Preventers") 1uvwxyzABCD

115 hero_rusty_man = Hero(name="Rusty-Man", team=team_preventers) 1uvwxyzABCD

116 

117 engine = create_engine("sqlite://", echo=True) 1uvwxyzABCD

118 

119 SQLModel.metadata.create_all(engine) 1uvwxyzABCD

120 

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