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

Revision 234, 5.0 kB (checked in by ged, 6 years ago)

converted most tests to the attribute syntax + reorganized tests around

Line 
1"""
2test autoloaded entities
3"""
4
5from sqlalchemy import Table, Column, ForeignKey, MetaData
6from elixir import *
7import elixir
8
9def setup():
10    # First create the tables (it would be better to use an external db)
11    meta = MetaData('sqlite:///')
12
13    person_table = Table('person', meta,
14        Column('id', Integer, primary_key=True),
15        Column('father_id', Integer, ForeignKey('person.id')),
16        Column('name', Unicode(32)))
17
18    animal_table = Table('animal', meta,
19        Column('id', Integer, primary_key=True),
20        Column('name', String(30)),
21        Column('color', String(15)),
22        Column('owner_id', Integer, ForeignKey('person.id')),
23        Column('feeder_id', Integer, ForeignKey('person.id')))
24
25    category_table = Table('category', meta,
26        Column('name', String, primary_key=True))
27
28    person_category_table = Table('person_category', meta,
29        Column('person_id', Integer, ForeignKey('person.id')),
30        Column('category_name', String, ForeignKey('category.name')))
31
32    person_person_table = Table('person_person', meta,
33        Column('person_id1', Integer, ForeignKey('person.id')),
34        Column('person_id2', Integer, ForeignKey('person.id')))
35
36    meta.create_all()
37
38    elixir.options_defaults.update(dict(autoload=True, shortnames=True))
39
40    global Person, Animal, Category
41
42    #TODO: split these into individual classes for each test. It's best to wait
43    # till we can define several classes in a method with reference between them
44    # without having to make them global.
45    class Person(Entity):
46        father = ManyToOne('Person')
47        children = OneToMany('Person')
48        pets = OneToMany('Animal', inverse='owner')
49        animals = OneToMany('Animal', inverse='feeder')
50        categories = ManyToMany('Category', 
51                                tablename='person_category')
52        appreciate = ManyToMany('Person',
53                                tablename='person_person',
54                                local_side='person_id1')
55        isappreciatedby = ManyToMany('Person',
56                                tablename='person_person',
57                                local_side='person_id2')
58
59    class Animal(Entity):
60        owner = ManyToOne('Person', colname='owner_id')
61        feeder = ManyToOne('Person', colname='feeder_id')
62
63
64    class Category(Entity):
65        persons = ManyToMany('Person', 
66                                tablename='person_category')
67
68    elixir.options_defaults.update(dict(autoload=False, shortnames=False))
69
70    metadata.bind = meta.bind
71    setup_all()
72
73
74def teardown():
75    cleanup_all()
76
77#-----------
78
79class TestAutoload(object):
80    def setup(self):
81        create_all()
82       
83    def teardown(self):
84        drop_all()
85        session.clear()
86   
87    def test_autoload(self):
88        snowball = Animal(name="Snowball II", color="grey")
89        slh = Animal(name="Santa's Little Helper")
90        homer = Person(name="Homer", animals=[snowball, slh], pets=[slh])
91        lisa = Person(name="Lisa", pets=[snowball])
92       
93        session.flush()
94        session.clear()
95       
96        homer = Person.get_by(name="Homer")
97        lisa = Person.get_by(name="Lisa")
98        slh = Animal.get_by(name="Santa's Little Helper")
99       
100        assert len(homer.animals) == 2
101        assert homer == lisa.pets[0].feeder
102        assert homer == slh.owner
103
104    def test_autoload_selfref(self):
105        grampa = Person(name="Abe")
106        homer = Person(name="Homer")
107        bart = Person(name="Bart")
108        lisa = Person(name="Lisa")
109       
110        grampa.children.append(homer)
111        homer.children.append(bart)
112        lisa.father = homer
113       
114        session.flush()
115        session.clear()
116       
117        p = Person.get_by(name="Homer")
118       
119        assert p in p.father.children
120        assert p.father.name == "Abe"
121        assert p.father is Person.get_by(name="Abe")
122        assert p is Person.get_by(name="Lisa").father
123
124    def test_autoload_m2m(self):
125        stupid = Category(name="Stupid")
126        simpson = Category(name="Simpson")
127        old = Category(name="Old")
128
129        grampa = Person(name="Abe", categories=[simpson, old])
130        homer = Person(name="Homer", categories=[simpson, stupid])
131        bart = Person(name="Bart")
132        lisa = Person(name="Lisa")
133       
134        simpson.persons.extend([bart, lisa])
135       
136        session.flush()
137        session.clear()
138       
139        c = Category.get_by(name="Simpson")
140        grampa = Person.get_by(name="Abe")
141       
142        print "Persons in the '%s' category: %s." % (
143                c.name, 
144                ", ".join(p.name for p in c.persons))
145       
146        assert len(c.persons) == 4
147        assert c in grampa.categories
148
149    def test_autoload_m2m_selfref(self):
150        barney = Person(name="Barney")
151        homer = Person(name="Homer", appreciate=[barney])
152
153        session.flush()
154        session.clear()
155       
156        homer = Person.get_by(name="Homer")
157        barney = Person.get_by(name="Barney")
158
159        assert barney in homer.appreciate
160        assert homer in barney.isappreciatedby
Note: See TracBrowser for help on using the browser.