forked from fastapi/sqlmodel
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest_nullable.py
125 lines (110 loc) · 5.14 KB
/
test_nullable.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
from typing import Optional
import pytest
from sqlalchemy.exc import IntegrityError
from sqlmodel import Field, Session, SQLModel, create_engine
def test_nullable_fields(clear_sqlmodel, caplog):
class Hero(SQLModel, table=True):
primary_key: Optional[int] = Field(
default=None,
primary_key=True,
)
required_value: str
optional_default_ellipsis: Optional[str] = Field(default=...)
optional_default_none: Optional[str] = Field(default=None)
optional_non_nullable: Optional[str] = Field(
nullable=False,
)
optional_nullable: Optional[str] = Field(
nullable=True,
)
optional_default_ellipses_non_nullable: Optional[str] = Field(
default=...,
nullable=False,
)
optional_default_ellipses_nullable: Optional[str] = Field(
default=...,
nullable=True,
)
optional_default_none_non_nullable: Optional[str] = Field(
default=None,
nullable=False,
)
optional_default_none_nullable: Optional[str] = Field(
default=None,
nullable=True,
)
default_ellipses_non_nullable: str = Field(default=..., nullable=False)
optional_default_str: Optional[str] = "default"
optional_default_str_non_nullable: Optional[str] = Field(
default="default", nullable=False
)
optional_default_str_nullable: Optional[str] = Field(
default="default", nullable=True
)
str_default_str: str = "default"
str_default_str_non_nullable: str = Field(default="default", nullable=False)
str_default_str_nullable: str = Field(default="default", nullable=True)
str_default_ellipsis_non_nullable: str = Field(default=..., nullable=False)
str_default_ellipsis_nullable: str = Field(default=..., nullable=True)
engine = create_engine("sqlite://", echo=True)
SQLModel.metadata.create_all(engine)
create_table_log = [
message for message in caplog.messages if "CREATE TABLE hero" in message
][0]
assert "primary_key INTEGER NOT NULL," in create_table_log
assert "required_value VARCHAR NOT NULL," in create_table_log
assert "optional_default_ellipsis VARCHAR NOT NULL," in create_table_log
assert "optional_default_none VARCHAR," in create_table_log
assert "optional_non_nullable VARCHAR NOT NULL," in create_table_log
assert "optional_nullable VARCHAR," in create_table_log
assert (
"optional_default_ellipses_non_nullable VARCHAR NOT NULL," in create_table_log
)
assert "optional_default_ellipses_nullable VARCHAR," in create_table_log
assert "optional_default_none_non_nullable VARCHAR NOT NULL," in create_table_log
assert "optional_default_none_nullable VARCHAR," in create_table_log
assert "default_ellipses_non_nullable VARCHAR NOT NULL," in create_table_log
assert "optional_default_str VARCHAR," in create_table_log
assert "optional_default_str_non_nullable VARCHAR NOT NULL," in create_table_log
assert "optional_default_str_nullable VARCHAR," in create_table_log
assert "str_default_str VARCHAR NOT NULL," in create_table_log
assert "str_default_str_non_nullable VARCHAR NOT NULL," in create_table_log
assert "str_default_str_nullable VARCHAR," in create_table_log
assert "str_default_ellipsis_non_nullable VARCHAR NOT NULL," in create_table_log
assert "str_default_ellipsis_nullable VARCHAR," in create_table_log
# Test for regression in https://github.com/tiangolo/sqlmodel/issues/420
def test_non_nullable_optional_field_with_no_default_set(clear_sqlmodel, caplog):
class Hero(SQLModel, table=True):
primary_key: Optional[int] = Field(
default=None,
primary_key=True,
)
optional_non_nullable_no_default: Optional[str] = Field(nullable=False)
engine = create_engine("sqlite://", echo=True)
SQLModel.metadata.create_all(engine)
create_table_log = [
message for message in caplog.messages if "CREATE TABLE hero" in message
][0]
assert "primary_key INTEGER NOT NULL," in create_table_log
assert "optional_non_nullable_no_default VARCHAR NOT NULL," in create_table_log
# We can create a hero with `None` set for the optional non-nullable field
hero = Hero(primary_key=123, optional_non_nullable_no_default=None)
# But we cannot commit it.
with Session(engine) as session:
session.add(hero)
with pytest.raises(IntegrityError):
session.commit()
def test_nullable_primary_key(clear_sqlmodel, caplog):
# Probably the weirdest corner case, it shouldn't happen anywhere, but let's test it
class Hero(SQLModel, table=True):
nullable_integer_primary_key: Optional[int] = Field(
default=None,
primary_key=True,
nullable=True,
)
engine = create_engine("sqlite://", echo=True)
SQLModel.metadata.create_all(engine)
create_table_log = [
message for message in caplog.messages if "CREATE TABLE hero" in message
][0]
assert "nullable_integer_primary_key INTEGER," in create_table_log