Coverage for tests/test_enums.py: 100%
54 statements
« prev ^ index » next coverage.py v7.6.1, created at 2024-08-12 19:13 +0000
« prev ^ index » next coverage.py v7.6.1, created at 2024-08-12 19:13 +0000
1import enum 1fabcde
2import uuid 1fabcde
4from sqlalchemy import create_mock_engine 1fabcde
5from sqlalchemy.sql.type_api import TypeEngine 1fabcde
6from sqlmodel import Field, SQLModel 1fabcde
8from .conftest import needs_pydanticv1, needs_pydanticv2 1fabcde
10"""
11Tests related to Enums
13Associated issues:
14* https://github.com/tiangolo/sqlmodel/issues/96
15* https://github.com/tiangolo/sqlmodel/issues/164
16"""
19class MyEnum1(str, enum.Enum): 1fabcde
20 A = "A" 1fabcde
21 B = "B" 1fabcde
24class MyEnum2(str, enum.Enum): 1fabcde
25 C = "C" 1fabcde
26 D = "D" 1fabcde
29class BaseModel(SQLModel): 1fabcde
30 id: uuid.UUID = Field(primary_key=True) 1fabcde
31 enum_field: MyEnum2 1fabcde
34class FlatModel(SQLModel, table=True): 1fabcde
35 id: uuid.UUID = Field(primary_key=True) 1fabcde
36 enum_field: MyEnum1 1fabcde
39class InheritModel(BaseModel, table=True): 1fabcde
40 pass 1fabcde
43def pg_dump(sql: TypeEngine, *args, **kwargs): 1fabcde
44 dialect = sql.compile(dialect=postgres_engine.dialect) 1fabcde
45 sql_str = str(dialect).rstrip() 1fabcde
46 if sql_str: 1fabcde
47 print(sql_str + ";") 1fabcde
50def sqlite_dump(sql: TypeEngine, *args, **kwargs): 1fabcde
51 dialect = sql.compile(dialect=sqlite_engine.dialect) 1fabcde
52 sql_str = str(dialect).rstrip() 1fabcde
53 if sql_str: 1fabcde
54 print(sql_str + ";") 1fabcde
57postgres_engine = create_mock_engine("postgresql://", pg_dump) 1fabcde
58sqlite_engine = create_mock_engine("sqlite://", sqlite_dump) 1fabcde
61def test_postgres_ddl_sql(capsys): 1fabcde
62 SQLModel.metadata.create_all(bind=postgres_engine, checkfirst=False) 1fabcde
64 captured = capsys.readouterr() 1fabcde
65 assert "CREATE TYPE myenum1 AS ENUM ('A', 'B');" in captured.out 1fabcde
66 assert "CREATE TYPE myenum2 AS ENUM ('C', 'D');" in captured.out 1fabcde
69def test_sqlite_ddl_sql(capsys): 1fabcde
70 SQLModel.metadata.create_all(bind=sqlite_engine, checkfirst=False) 1fabcde
72 captured = capsys.readouterr() 1fabcde
73 assert "enum_field VARCHAR(1) NOT NULL" in captured.out 1fabcde
74 assert "CREATE TYPE" not in captured.out 1fabcde
77@needs_pydanticv1 1fabcde
78def test_json_schema_flat_model_pydantic_v1(): 1abcde
79 assert FlatModel.schema() == { 1bcde
80 "title": "FlatModel",
81 "type": "object",
82 "properties": {
83 "id": {"title": "Id", "type": "string", "format": "uuid"},
84 "enum_field": {"$ref": "#/definitions/MyEnum1"},
85 },
86 "required": ["id", "enum_field"],
87 "definitions": {
88 "MyEnum1": {
89 "title": "MyEnum1",
90 "description": "An enumeration.",
91 "enum": ["A", "B"],
92 "type": "string",
93 }
94 },
95 }
98@needs_pydanticv1 1fabcde
99def test_json_schema_inherit_model_pydantic_v1(): 1abcde
100 assert InheritModel.schema() == { 1bcde
101 "title": "InheritModel",
102 "type": "object",
103 "properties": {
104 "id": {"title": "Id", "type": "string", "format": "uuid"},
105 "enum_field": {"$ref": "#/definitions/MyEnum2"},
106 },
107 "required": ["id", "enum_field"],
108 "definitions": {
109 "MyEnum2": {
110 "title": "MyEnum2",
111 "description": "An enumeration.",
112 "enum": ["C", "D"],
113 "type": "string",
114 }
115 },
116 }
119@needs_pydanticv2 1fabcde
120def test_json_schema_flat_model_pydantic_v2(): 1abcde
121 assert FlatModel.model_json_schema() == { 1fa
122 "title": "FlatModel",
123 "type": "object",
124 "properties": {
125 "id": {"title": "Id", "type": "string", "format": "uuid"},
126 "enum_field": {"$ref": "#/$defs/MyEnum1"},
127 },
128 "required": ["id", "enum_field"],
129 "$defs": {
130 "MyEnum1": {"enum": ["A", "B"], "title": "MyEnum1", "type": "string"}
131 },
132 }
135@needs_pydanticv2 1fabcde
136def test_json_schema_inherit_model_pydantic_v2(): 1abcde
137 assert InheritModel.model_json_schema() == { 1fa
138 "title": "InheritModel",
139 "type": "object",
140 "properties": {
141 "id": {"title": "Id", "type": "string", "format": "uuid"},
142 "enum_field": {"$ref": "#/$defs/MyEnum2"},
143 },
144 "required": ["id", "enum_field"],
145 "$defs": {
146 "MyEnum2": {"enum": ["C", "D"], "title": "MyEnum2", "type": "string"}
147 },
148 }