-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathtest.py
163 lines (126 loc) · 3.99 KB
/
test.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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
import enum
import os
try:
from psycopg2cffi.compat import register
except ImportError:
pass
else:
register()
from pytest import fixture, yield_fixture
from sqlalchemy.engine import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy.pool import NullPool
from sqlalchemy.schema import Column
from sqlalchemy.sql import text
from sqlalchemy.types import Integer
from sqlalchemy_enum34 import Enum, EnumType
Base = declarative_base()
Session = sessionmaker()
class Color(enum.Enum):
red = 'r'
green = 'g'
blue = 'b'
class ColorTable(Base):
id = Column(Integer, primary_key=True)
color_by_val = Column(
Enum(Color, name='color_by_val'),
nullable=True
)
color_by_name = Column(
Enum(Color, by_name=True, name='color_by_name'),
nullable=True
)
__tablename__ = 'tb_color'
try:
database_urls = os.environ['TEST_DATABASE_URLS'].split()
except KeyError:
database_urls = []
@fixture(scope='function', params=['sqlite://'] + database_urls)
def fx_engine(request):
url = request.param
engine = create_engine(url, poolclass=NullPool)
request.addfinalizer(engine.dispose)
return engine
@yield_fixture
def fx_connection(fx_engine):
connection = fx_engine.connect()
try:
transaction = connection.begin()
try:
metadata = Base.metadata
metadata.create_all(bind=connection)
yield connection
finally:
transaction.rollback()
finally:
connection.close()
@yield_fixture
def fx_session(fx_connection):
session = Session(bind=fx_connection)
try:
yield session
finally:
session.close()
@fixture
def fx_red(fx_session):
red = ColorTable(color_by_val=Color.red, color_by_name=Color.red)
fx_session.add(red)
fx_session.flush()
return red
@fixture
def fx_green(fx_session):
green = ColorTable(color_by_val=Color.green, color_by_name=Color.green)
fx_session.add(green)
fx_session.flush()
return green
@fixture
def fx_blue(fx_session):
blue = ColorTable(color_by_val=Color.blue, color_by_name=Color.blue)
fx_session.add(blue)
fx_session.flush()
return blue
@fixture
def fx_null(fx_session):
null = ColorTable(color_by_val=None, color_by_name=None)
fx_session.add(null)
fx_session.flush()
return null
def test_enum_by_value(fx_session, fx_blue, fx_red):
result = fx_session.query(ColorTable) \
.filter_by(color_by_val=Color.blue) \
.one()
assert fx_blue is result
result2 = fx_session.query(ColorTable) \
.filter(text("tb_color.color_by_val = 'r'")) \
.one()
assert fx_red is result2
def test_enum_by_name(fx_session, fx_green, fx_blue):
result = fx_session.query(ColorTable) \
.filter_by(color_by_name=Color.green) \
.one()
assert fx_green is result
result2 = fx_session.query(ColorTable) \
.filter(text("tb_color.color_by_name = 'blue'")) \
.one()
assert fx_blue is result2
def test_null_by_value(fx_session, fx_null):
result = fx_session.query(ColorTable) \
.filter_by(color_by_val=None) \
.one()
assert fx_null is result
result2 = fx_session.query(ColorTable) \
.filter(text("tb_color.color_by_val is null")) \
.one()
assert fx_null is result2
def test_null_by_name(fx_session, fx_null):
result = fx_session.query(ColorTable) \
.filter_by(color_by_name=None) \
.one()
assert fx_null is result
result2 = fx_session.query(ColorTable) \
.filter(text("tb_color.color_by_name is null")) \
.one()
assert fx_null is result2
def test_enum_is_enum_type():
assert Enum is EnumType