root / elixir / branches / autodelay / tests / test_autoload.py @ 128

Revision 128, 5.8 kB (checked in by ged, 6 years ago)

- merge trunk changes up to r126

Line 
1"""
2    simple test case
3"""
4
5from sqlalchemy import Table, Column, ForeignKey, BoundMetaData, create_engine
6from elixir import *
7import elixir
8
9def setup():
10    # First create the tables (it would be better to use an external db)
11    engine = create_engine('sqlite:///')
12    meta = BoundMetaData(engine)
13
14    person_table = Table('person', meta,
15        Column('id', Integer, primary_key=True),
16        Column('father_id', Integer, ForeignKey('person.id')),
17        Column('name', Unicode(32)))
18
19    animal_table = Table('animal', meta,
20        Column('id', Integer, primary_key=True),
21        Column('name', String(30)),
22        Column('color', String(15)),
23        Column('owner_id', Integer, ForeignKey('person.id')),
24        Column('feeder_id', Integer, ForeignKey('person.id')))
25
26    category_table = Table('category', meta,
27        Column('name', String, primary_key=True))
28
29    person_category_table = Table('person_category', meta,
30        Column('person_id', Integer, ForeignKey('person.id')),
31        Column('category_name', String, ForeignKey('category.name')))
32
33    person_person_table = Table('person_person', meta,
34        Column('person_id1', Integer, ForeignKey('person.id')),
35        Column('person_id2', Integer, ForeignKey('person.id')))
36
37    meta.create_all()
38
39    elixir.delay_setup = True
40    elixir.options_defaults.update(dict(autoload=True, shortnames=True))
41
42    global Person, Animal, Category
43
44    class Person(Entity):
45        belongs_to('father', of_kind='Person')
46        has_many('children', of_kind='Person')
47        has_many('pets', of_kind='Animal', inverse='owner')
48        has_many('animals', of_kind='Animal', inverse='feeder')
49        has_and_belongs_to_many('categories', of_kind='Category', 
50                                tablename='person_category')
51        has_and_belongs_to_many('appreciate', of_kind='Person',
52                                tablename='person_person',
53                                local_side='person_id1')
54        has_and_belongs_to_many('isappreciatedby', of_kind='Person',
55                                tablename='person_person',
56                                local_side='person_id2')
57
58        def __str__(self):
59            s = '%s\n' % self.name.encode('utf-8') 
60            for pet in self.pets:
61                s += '  * pet: %s\n' % pet.name
62            return s
63
64
65    class Animal(Entity):
66        belongs_to('owner', of_kind='Person', colname='owner_id')
67        belongs_to('feeder', of_kind='Person', colname='feeder_id')
68
69
70    class Category(Entity):
71        has_and_belongs_to_many('persons', of_kind='Person', 
72                                tablename='person_category')
73
74    elixir.delay_setup = False
75    elixir.options_defaults.update(dict(autoload=False, shortnames=False))
76
77    metadata.connect(engine)
78    setup_all()
79
80def teardown():
81    cleanup_all()
82
83#-----------
84
85class TestAutoload(object):
86    def setup(self):
87        create_all()
88       
89    def teardown(self):
90        drop_all()
91        objectstore.clear()
92   
93    def test_autoload(self):
94        snowball = Animal(name="Snowball II", color="grey")
95        slh = Animal(name="Santa's Little Helper")
96        homer = Person(name="Homer", animals=[snowball, slh], pets=[slh])
97        lisa = Person(name="Lisa", pets=[snowball])
98       
99        objectstore.flush()
100        objectstore.clear()
101       
102        homer = Person.get_by(name="Homer")
103        lisa = Person.get_by(name="Lisa")
104       
105        print homer
106
107        assert len(homer.animals) == 2
108        assert homer == lisa.pets[0].feeder
109        assert homer == slh.owner
110
111    def test_autoload_selfref(self):
112        grampa = Person(name="Abe")
113        homer = Person(name="Homer")
114        bart = Person(name="Bart")
115        lisa = Person(name="Lisa")
116       
117        grampa.children.append(homer)
118        homer.children.append(bart)
119        lisa.father = homer
120       
121        objectstore.flush()
122        objectstore.clear()
123       
124        p = Person.get_by(name="Homer")
125       
126        print "%s is %s's child." % (p.name, p.father.name)
127        print "His children are: %s." % (
128                " and ".join(c.name for c in p.children))
129       
130        assert p in p.father.children
131        assert p.father is Person.get_by(name="Abe")
132        assert p is Person.get_by(name="Lisa").father
133
134    def test_autoload_has_and_belongs_to_many(self):
135        stupid = Category(name="Stupid")
136        simpson = Category(name="Simpson")
137        old = Category(name="Old")
138
139        grampa = Person(name="Abe", categories=[simpson, old])
140        homer = Person(name="Homer", categories=[simpson, stupid])
141        bart = Person(name="Bart")
142        lisa = Person(name="Lisa")
143       
144        simpson.persons.extend([bart, lisa])
145       
146        objectstore.flush()
147        objectstore.clear()
148       
149        c = Category.get_by(name="Simpson")
150        grampa = Person.get_by(name="Abe")
151       
152        print "Persons in the '%s' category: %s." % (
153                c.name, 
154                ", ".join(p.name for p in c.persons))
155       
156        assert len(c.persons) == 4
157        assert c in grampa.categories
158
159    def test_autoload_has_and_belongs_to_many_selfref(self):
160        barney = Person(name="Barney")
161        homer = Person(name="Homer", appreciate=[barney])
162
163        objectstore.flush()
164        objectstore.clear()
165       
166        homer = Person.get_by(name="Homer")
167        barney = Person.get_by(name="Barney")
168
169        assert barney in homer.appreciate
170        assert homer in barney.isappreciatedby
171
172if __name__ == '__main__':
173    setup()
174
175    test = TestAutoload()
176    test.setup()
177    test.test_autoload()
178    test.teardown()
179
180    test.setup()
181    test.test_autoload_selfref()
182    test.teardown()
183
184    test.setup()
185    test.test_autoload_has_and_belongs_to_many()
186    test.teardown()
187
188    test.setup()
189    test.test_autoload_has_and_belongs_to_many_selfref()
190    test.teardown()
191
192    teardown()
Note: See TracBrowser for help on using the browser.