1
1
from sqlalchemy import MetaData, Integer, String, ForeignKey
2
from sqlalchemy.test.schema import Table
3
from sqlalchemy.test.schema import Column
2
from sqlalchemy import util
3
from test.lib.schema import Table
4
from test.lib.schema import Column
4
5
from sqlalchemy.orm import attributes
5
from sqlalchemy.test.testing import fixture
6
from test.orm import _base
6
from test.lib import fixtures
10
fixture_metadata = MetaData()
12
def fixture_table(table, columns, *rows):
13
def load_fixture(bind=None):
14
bind = bind or table.bind
18
[dict(zip(columns, column_values)) for column_values in rows])
19
table.info[('fixture', 'loader')] = load_fixture
20
table.info[('fixture', 'columns')] = columns
21
table.info[('fixture', 'rows')] = rows
24
users = fixture_table(
25
Table('users', fixture_metadata,
26
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
27
Column('name', String(30), nullable=False),
36
addresses = fixture_table(
37
Table('addresses', fixture_metadata,
38
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
39
Column('user_id', None, ForeignKey('users.id')),
40
Column('email_address', String(50), nullable=False),
43
('id', 'user_id', 'email_address'),
44
(1, 7, "jack@bean.com"),
45
(2, 8, "ed@wood.com"),
46
(3, 8, "ed@bettyboop.com"),
47
(4, 8, "ed@lala.com"),
48
(5, 9, "fred@fred.com"))
50
email_bounces = fixture_table(
51
Table('email_bounces', fixture_metadata,
52
Column('id', Integer, ForeignKey('addresses.id')),
53
Column('bounces', Integer)),
61
orders = fixture_table(
62
Table('orders', fixture_metadata,
63
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
64
Column('user_id', None, ForeignKey('users.id')),
65
Column('address_id', None, ForeignKey('addresses.id')),
66
Column('description', String(30)),
67
Column('isopen', Integer),
70
('id', 'user_id', 'description', 'isopen', 'address_id'),
71
(1, 7, 'order 1', 0, 1),
72
(2, 9, 'order 2', 0, 4),
73
(3, 7, 'order 3', 1, 1),
74
(4, 9, 'order 4', 1, 4),
75
(5, 7, 'order 5', 0, None))
77
dingalings = fixture_table(
78
Table("dingalings", fixture_metadata,
79
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
80
Column('address_id', None, ForeignKey('addresses.id')),
81
Column('data', String(30)),
84
('id', 'address_id', 'data'),
88
items = fixture_table(
89
Table('items', fixture_metadata,
90
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
91
Column('description', String(30), nullable=False),
94
('id', 'description'),
101
order_items = fixture_table(
102
Table('order_items', fixture_metadata,
103
Column('item_id', None, ForeignKey('items.id')),
104
Column('order_id', None, ForeignKey('orders.id')),
105
test_needs_acid=True,
107
('item_id', 'order_id'),
125
keywords = fixture_table(
126
Table('keywords', fixture_metadata,
127
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
128
Column('name', String(30), nullable=False),
129
test_needs_acid=True,
140
item_keywords = fixture_table(
141
Table('item_keywords', fixture_metadata,
142
Column('item_id', None, ForeignKey('items.id')),
143
Column('keyword_id', None, ForeignKey('keywords.id')),
144
test_needs_acid=True,
146
('keyword_id', 'item_id'),
157
nodes = fixture_table(
158
Table('nodes', fixture_metadata,
159
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
160
Column('parent_id', Integer, ForeignKey('nodes.id')),
161
Column('data', String(30)),
162
test_needs_acid=True,
165
('id', 'parent_id', 'data')
168
composite_pk_table = fixture_table(
169
Table('composite_pk_table', fixture_metadata,
170
Column('i', Integer, primary_key=True),
171
Column('j', Integer, primary_key=True),
172
Column('k', Integer, nullable=False),
181
def _load_fixtures():
182
for table in fixture_metadata.sorted_tables:
183
table.info[('fixture', 'loader')]()
185
def run_inserts_for(table, bind=None):
186
table.info[('fixture', 'loader')](bind)
188
class Base(_base.ComparableEntity):
212
class Dingaling(Base):
219
class CompositePk(Base):
222
class FixtureTest(_base.MappedTest):
223
"""A MappedTest pre-configured for fixtures.
225
All fixture tables are pre-loaded into cls.tables, as are all fixture
226
lasses in cls.classes and as cls.ClassName.
228
Fixture.mapper() still functions and willregister non-fixture classes into
11
class FixtureTest(fixtures.MappedTest):
12
"""A MappedTest pre-configured with a common set of fixtures.
236
19
run_inserts = 'each'
237
20
run_deletes = 'each'
239
metadata = fixture_metadata
240
fixture_classes = dict(User=User,
23
def setup_classes(cls):
24
class Base(cls.Comparable):
42
class Dingaling(Base):
48
class CompositePk(Base):
248
52
def define_tables(cls, metadata):
252
def setup_classes(cls):
253
for cl in cls.fixture_classes.values():
254
cls.register_class(cl)
53
Table('users', metadata,
54
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
55
Column('name', String(30), nullable=False),
60
Table('addresses', metadata,
61
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
62
Column('user_id', None, ForeignKey('users.id')),
63
Column('email_address', String(50), nullable=False),
68
Table('email_bounces', metadata,
69
Column('id', Integer, ForeignKey('addresses.id')),
70
Column('bounces', Integer)
73
Table('orders', metadata,
74
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
75
Column('user_id', None, ForeignKey('users.id')),
76
Column('address_id', None, ForeignKey('addresses.id')),
77
Column('description', String(30)),
78
Column('isopen', Integer),
83
Table("dingalings", metadata,
84
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
85
Column('address_id', None, ForeignKey('addresses.id')),
86
Column('data', String(30)),
91
Table('items', metadata,
92
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
93
Column('description', String(30), nullable=False),
98
Table('order_items', metadata,
99
Column('item_id', None, ForeignKey('items.id')),
100
Column('order_id', None, ForeignKey('orders.id')),
101
test_needs_acid=True,
105
Table('keywords', metadata,
106
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
107
Column('name', String(30), nullable=False),
108
test_needs_acid=True,
112
Table('item_keywords', metadata,
113
Column('item_id', None, ForeignKey('items.id')),
114
Column('keyword_id', None, ForeignKey('keywords.id')),
115
test_needs_acid=True,
119
Table('nodes', metadata,
120
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
121
Column('parent_id', Integer, ForeignKey('nodes.id')),
122
Column('data', String(30)),
123
test_needs_acid=True,
127
Table('composite_pk_table', metadata,
128
Column('i', Integer, primary_key=True),
129
Column('j', Integer, primary_key=True),
130
Column('k', Integer, nullable=False),
257
134
def setup_mappers(cls):
261
def insert_data(cls):
149
('id', 'user_id', 'email_address'),
150
(1, 7, "jack@bean.com"),
151
(2, 8, "ed@wood.com"),
152
(3, 8, "ed@bettyboop.com"),
153
(4, 8, "ed@lala.com"),
154
(5, 9, "fred@fred.com")
167
('id', 'user_id', 'description', 'isopen', 'address_id'),
168
(1, 7, 'order 1', 0, 1),
169
(2, 9, 'order 2', 0, 4),
170
(3, 7, 'order 3', 1, 1),
171
(4, 9, 'order 4', 1, 4),
172
(5, 7, 'order 5', 0, None)
176
('id', 'address_id', 'data'),
182
('id', 'description'),
191
('item_id', 'order_id'),
222
('keyword_id', 'item_id'),
235
('id', 'parent_id', 'data')
238
composite_pk_table = (
247
@util.memoized_property
249
return CannedResults(self)
265
251
class CannedResults(object):
266
252
"""Built on demand, instances use mappers in effect at time of call."""
254
def __init__(self, test):
269
258
def user_result(self):
259
User = self.test.classes.User