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

Revision 54, 3.2 kB (checked in by ged, 8 years ago)

fixed selfref for autoloaded tables (complete autoload test to check that)

Line 
1"""
2    simple test case
3"""
4
5import sqlalchemy
6from sqlalchemy import Table, Column, ForeignKey, BoundMetaData
7from sqlalchemy.types import *
8from elixir import *
9from elixir import metadata, objectstore
10import elixir
11import datetime
12
13# First create two tables (it would be better to user an external db)
14engine = sqlalchemy.create_engine('sqlite:///')
15meta = BoundMetaData(engine)
16
17person_table = Table('person', meta,
18    Column('id', Integer, primary_key=True),
19    Column('father_id', Integer, ForeignKey('person.id')),
20    Column('name', Unicode(32)))
21person_table.create()
22
23animal_table = Table('animal', meta,
24    Column('id', Integer, primary_key=True),
25    Column('name', String(15)),
26    Column('color', String(15)),
27    Column('owner_id', Integer, ForeignKey('person.id')),
28    Column('feeder_id', Integer, ForeignKey('person.id')))
29animal_table.create()
30
31elixir.delay_setup = True
32
33class Person(Entity):
34#    has_field('name', Unicode(32))
35   
36    belongs_to('father', of_kind='Person', colname='father_id')
37    has_many('children', of_kind='Person')
38    has_many('pets', of_kind='Animal', inverse='owner')
39    has_many('animals', of_kind='Animal', inverse='feeder')
40   
41    using_options(autoload=True, shortnames=True)
42
43    def __str__(self):
44        s = '%s\n' % self.name.encode('utf-8') 
45        for pet in self.pets:
46            s += '  * pet: %s\n' % pet.name
47        return s
48
49class Animal(Entity):
50#    has_field('name', String(15))
51#    has_field('color', String(15))
52   
53    belongs_to('owner', of_kind='Person', colname='owner_id')
54    belongs_to('feeder', of_kind='Person', colname='feeder_id')
55
56    using_options(autoload=True, shortnames=True)
57
58elixir.delay_setup = False
59
60#-----------
61
62class TestAutoload(object):
63    def setup(self):
64        metadata.connect(engine)
65        setup_all()
66   
67    def teardown(self):
68        drop_all()
69   
70    def test_autoload(self):
71        snowball = Animal(name="Snowball II", color="grey")
72        slh = Animal(name="Santa's Little Helper")
73        homer = Person(name="Homer", animals=[snowball, slh], pets=[slh])
74        lisa = Person(name="Lisa", pets=[snowball])
75       
76        objectstore.flush()
77        objectstore.clear()
78       
79        homer = Person.get_by(name="Homer")
80        lisa = Person.get_by(name="Lisa")
81       
82        print homer
83
84        assert len(homer.animals) == 2
85        assert homer == lisa.pets[0].feeder
86        assert homer == slh.owner
87
88    def test_autoload_selfref(self):
89        grampa = Person(name="Abe")
90        homer = Person(name="Homer")
91        bart = Person(name="Bart")
92        lisa = Person(name="Lisa")
93       
94        grampa.children.append(homer)       
95        homer.children.append(bart)
96        lisa.father = homer
97       
98        objectstore.flush()
99        objectstore.clear()
100       
101        p = Person.get_by(name="Homer")
102       
103        print "%s is %s's child." % (p.name, p.father.name)
104        print "His children are: %s." % (
105                " and ".join(c.name for c in p.children))
106       
107        assert p in p.father.children
108        assert p.father is Person.get_by(name="Abe")
109        assert p is Person.get_by(name="Lisa").father
110
111if __name__ == '__main__':
112    test = TestAutoload()
113    test.setup()
114    test.test_autoload()
115    test.teardown()
Note: See TracBrowser for help on using the browser.