Coverage for tests/test_field_sa_column.py: 100%

49 statements  

« prev     ^ index     » next       coverage.py v7.6.12, created at 2025-03-07 05:42 +0000

1from typing import Optional 1abcdefg

2 

3import pytest 1abcdefg

4from sqlalchemy import Column, Integer, String 1abcdefg

5from sqlmodel import Field, SQLModel 1abcdefg

6 

7 

8def test_sa_column_takes_precedence() -> None: 1abcdefg

9 class Item(SQLModel, table=True): 1opqrstu

10 id: Optional[int] = Field( 1opqrstu

11 default=None, 

12 sa_column=Column(String, primary_key=True, nullable=False), 

13 ) 

14 

15 # It would have been nullable with no sa_column 

16 assert Item.id.nullable is False # type: ignore 1opqrstu

17 assert isinstance(Item.id.type, String) # type: ignore 1opqrstu

18 

19 

20def test_sa_column_no_sa_args() -> None: 1abcdefg

21 with pytest.raises(RuntimeError): 1vwxyzAB

22 

23 class Item(SQLModel, table=True): 1vwxyzAB

24 id: Optional[int] = Field( 1vwxyzAB

25 default=None, 

26 sa_column_args=[Integer], 

27 sa_column=Column(Integer, primary_key=True), 

28 ) 

29 

30 

31def test_sa_column_no_sa_kargs() -> None: 1abcdefg

32 with pytest.raises(RuntimeError): 1CDEFGHI

33 

34 class Item(SQLModel, table=True): 1CDEFGHI

35 id: Optional[int] = Field( 1CDEFGHI

36 default=None, 

37 sa_column_kwargs={"primary_key": True}, 

38 sa_column=Column(Integer, primary_key=True), 

39 ) 

40 

41 

42def test_sa_column_no_type() -> None: 1abcdefg

43 with pytest.raises(RuntimeError): 1JKLMNOP

44 

45 class Item(SQLModel, table=True): 1JKLMNOP

46 id: Optional[int] = Field( 1JKLMNOP

47 default=None, 

48 sa_type=Integer, 

49 sa_column=Column(Integer, primary_key=True), 

50 ) 

51 

52 

53def test_sa_column_no_primary_key() -> None: 1abcdefg

54 with pytest.raises(RuntimeError): 1QRSTUVW

55 

56 class Item(SQLModel, table=True): 1QRSTUVW

57 id: Optional[int] = Field( 1QRSTUVW

58 default=None, 

59 primary_key=True, 

60 sa_column=Column(Integer, primary_key=True), 

61 ) 

62 

63 

64def test_sa_column_no_nullable() -> None: 1abcdefg

65 with pytest.raises(RuntimeError): 1XYZ0123

66 

67 class Item(SQLModel, table=True): 1XYZ0123

68 id: Optional[int] = Field( 1XYZ0123

69 default=None, 

70 nullable=True, 

71 sa_column=Column(Integer, primary_key=True), 

72 ) 

73 

74 

75def test_sa_column_no_foreign_key() -> None: 1abcdefg

76 with pytest.raises(RuntimeError): 1hijklmn

77 

78 class Team(SQLModel, table=True): 1hijklmn

79 id: Optional[int] = Field(default=None, primary_key=True) 1hijklmn

80 name: str 1hijklmn

81 

82 class Hero(SQLModel, table=True): 1hijklmn

83 id: Optional[int] = Field(default=None, primary_key=True) 1hijklmn

84 team_id: Optional[int] = Field( 1hijklmn

85 default=None, 

86 foreign_key="team.id", 

87 sa_column=Column(Integer, primary_key=True), 

88 ) 

89 

90 

91def test_sa_column_no_unique() -> None: 1abcdefg

92 with pytest.raises(RuntimeError): 1456789!

93 

94 class Item(SQLModel, table=True): 1456789!

95 id: Optional[int] = Field( 1456789!

96 default=None, 

97 unique=True, 

98 sa_column=Column(Integer, primary_key=True), 

99 ) 

100 

101 

102def test_sa_column_no_index() -> None: 1abcdefg

103 with pytest.raises(RuntimeError): 1#$%'()*

104 

105 class Item(SQLModel, table=True): 1#$%'()*

106 id: Optional[int] = Field( 1#$%'()*

107 default=None, 

108 index=True, 

109 sa_column=Column(Integer, primary_key=True), 

110 ) 

111 

112 

113def test_sa_column_no_ondelete() -> None: 1abcdefg

114 with pytest.raises(RuntimeError): 1+,-./:;

115 

116 class Item(SQLModel, table=True): 1+,-./:;

117 id: Optional[int] = Field( 1+,-./:;

118 default=None, 

119 sa_column=Column(Integer, primary_key=True), 

120 ondelete="CASCADE", 

121 )