root / elixir / trunk / tests / test_autoload.py @ 470

Revision 470, 7.2 kB (checked in by ged, 5 years ago)

rewrote all autoload tests so that they pass on SA 0.6 and they are not as much
interdependant

Line 
1"""
2test autoloaded entities
3"""
4
5from sqlalchemy import Table, Column, ForeignKey
6from elixir import *
7import elixir
8
9def setup_entity_raise(cls):
10    try:
11        setup_entities([cls])
12    except Exception, e:
13        pass
14    else:
15        assert False, "Exception did not occur setting up %s" % cls.__name__
16
17# ------
18
19def setup():
20    elixir.options_defaults.update(dict(autoload=True, shortnames=True))
21
22def teardown():
23    elixir.options_defaults.update(dict(autoload=False, shortnames=False))
24
25# -----------
26
27class TestAutoload(object):
28    def setup(self):
29        metadata.bind = 'sqlite://'
30
31    def teardown(self):
32        cleanup_all(True)
33
34    def test_simple(self):
35        person_table = Table('person', metadata,
36            Column('id', Integer, primary_key=True),
37            Column('name', String(32)))
38
39        animal_table = Table('animal', metadata,
40            Column('id', Integer, primary_key=True),
41            Column('name', String(30)),
42            Column('owner_id', Integer, ForeignKey('person.id')),
43            Column('feeder_id', Integer, ForeignKey('person.id')))
44
45        metadata.create_all()
46
47        class Person(Entity):
48            pets = OneToMany('Animal', inverse='owner')
49            animals = OneToMany('Animal', inverse='feeder')
50
51        class Animal(Entity):
52            owner = ManyToOne('Person', colname='owner_id')
53            feeder = ManyToOne('Person', colname='feeder_id')
54
55        setup_all()
56
57        snowball = Animal(name="Snowball II")
58        slh = Animal(name="Santa's Little Helper")
59        homer = Person(name="Homer", animals=[snowball, slh], pets=[slh])
60        lisa = Person(name="Lisa", pets=[snowball])
61
62        session.commit()
63        session.clear()
64
65        homer = Person.get_by(name="Homer")
66        lisa = Person.get_by(name="Lisa")
67        slh = Animal.get_by(name="Santa's Little Helper")
68
69        assert len(homer.animals) == 2
70        assert homer == lisa.pets[0].feeder
71        assert homer == slh.owner
72
73    def test_selfref(self):
74        person_table = Table('person', metadata,
75            Column('id', Integer, primary_key=True),
76            Column('father_id', Integer, ForeignKey('person.id')),
77            Column('name', String(32)))
78        metadata.create_all()
79
80        class Person(Entity):
81            father = ManyToOne('Person')
82            children = OneToMany('Person')
83
84        setup_all()
85
86        grampa = Person(name="Abe")
87        homer = Person(name="Homer")
88        bart = Person(name="Bart")
89        lisa = Person(name="Lisa")
90
91        grampa.children.append(homer)
92        homer.children.append(bart)
93        lisa.father = homer
94
95        session.commit()
96        session.clear()
97
98        p = Person.get_by(name="Homer")
99
100        assert p in p.father.children
101        assert p.father.name == "Abe"
102        assert p.father is Person.get_by(name="Abe")
103        assert p is Person.get_by(name="Lisa").father
104
105    def test_m2m(self):
106        person_table = Table('person', metadata,
107            Column('id', Integer, primary_key=True),
108            Column('name', String(32)))
109
110        category_table = Table('category', metadata,
111            Column('name', String(30), primary_key=True))
112
113        person_category_table = Table('person_category', metadata,
114            Column('person_id', Integer, ForeignKey('person.id')),
115            Column('category_name', String(30), ForeignKey('category.name')))
116
117        metadata.create_all()
118
119        class Person(Entity):
120            categories = ManyToMany('Category',
121                                    tablename='person_category')
122
123        class Category(Entity):
124            persons = ManyToMany('Person',
125                                 tablename='person_category')
126
127        setup_all()
128
129        stupid = Category(name="Stupid")
130        simpson = Category(name="Simpson")
131        old = Category(name="Old")
132
133        grampa = Person(name="Abe", categories=[simpson, old])
134        homer = Person(name="Homer", categories=[simpson, stupid])
135        bart = Person(name="Bart")
136        lisa = Person(name="Lisa")
137
138        simpson.persons.extend([bart, lisa])
139
140        session.commit()
141        session.clear()
142
143        c = Category.get_by(name="Simpson")
144        grampa = Person.get_by(name="Abe")
145
146        assert len(c.persons) == 4
147        assert c in grampa.categories
148
149    def test_m2m_selfref(self):
150        person_table = Table('person', metadata,
151            Column('id', Integer, primary_key=True),
152            Column('name', String(32)))
153
154        person_person_table = Table('person_person', metadata,
155            Column('person_id1', Integer, ForeignKey('person.id')),
156            Column('person_id2', Integer, ForeignKey('person.id')))
157
158        metadata.create_all()
159
160        class Person(Entity):
161            appreciate = ManyToMany('Person',
162                                    tablename='person_person',
163                                    local_colname='person_id1')
164            isappreciatedby = ManyToMany('Person',
165                                         tablename='person_person',
166                                         local_colname='person_id2')
167
168        setup_all()
169
170        barney = Person(name="Barney")
171        homer = Person(name="Homer", appreciate=[barney])
172
173        session.commit()
174        session.clear()
175
176        homer = Person.get_by(name="Homer")
177        barney = Person.get_by(name="Barney")
178
179        assert barney in homer.appreciate
180        assert homer in barney.isappreciatedby
181
182    # ----------------
183    # overrides tests
184    # ----------------
185    def _create_table_a(self):
186        a_table = Table('a', metadata,
187            Column('id', Integer, primary_key=True),
188            Column('name', String(32)))
189
190        metadata.create_all()
191
192    def test_override_pk_fails(self):
193        self._create_table_a()
194
195        class A(Entity):
196            id = Field(Integer, primary_key=True)
197
198        setup_entity_raise(A)
199
200    def test_override_non_pk_fails(self):
201        self._create_table_a()
202
203        class A(Entity):
204            name = Field(String(30))
205
206        setup_entity_raise(A)
207
208    def test_override_pk(self):
209        self._create_table_a()
210
211        class A(Entity):
212            using_options(allowcoloverride=True)
213
214            id = Field(Integer, primary_key=True)
215
216        setup_entities([A])
217
218    def test_override_non_pk(self):
219        self._create_table_a()
220
221        class A(Entity):
222            using_options(allowcoloverride=True)
223
224            name = Field(String(30))
225
226        setup_entities([A])
227        assert isinstance(A.table.columns['name'].type, String)
228
229    # ---------------
230
231    def test_nopk(self):
232        table = Table('a', metadata,
233            Column('id', Integer),
234            Column('name', String(32)))
235
236        metadata.create_all()
237
238        class A(Entity):
239            using_mapper_options(primary_key=['id'])
240
241        setup_all()
242
243        a1 = A(id=1, name="a1")
244
245        session.commit()
246        session.clear()
247
248        res = A.query.all()
249
250        assert len(res) == 1
251        assert res[0].name == "a1"
252
253    def test_inheritance(self):
254        table = Table('father', metadata,
255            Column('id', Integer, primary_key=True),
256            Column('row_type', elixir.options.POLYMORPHIC_COL_TYPE))
257
258        metadata.create_all()
259
260        class Father(Entity):
261            pass
262
263        class Son(Father):
264            pass
265
266        setup_all()
Note: See TracBrowser for help on using the browser.