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

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

converted most tests to the attribute syntax + reorganized tests around

Line 
1"""
2test many to many relationships
3"""
4
5from elixir import *
6
7#-----------
8
9class TestManyToMany(object):
10    def setup(self):
11        metadata.bind = 'sqlite:///'
12   
13    def teardown(self):
14        cleanup_all(True)
15   
16    def test_simple(self):
17        class A(Entity):
18            name = Field(Unicode(60))
19            bs_ = ManyToMany('B')
20
21        class B(Entity):
22            name = Field(Unicode(60))
23            as_ = ManyToMany('A')
24
25        setup_all(True)
26
27        b1 = B(name='b1', as_=[A(name='a1')])
28
29        session.flush()
30        session.clear()
31
32        a = A.query.one()
33        b = B.query.one()
34
35        assert a in b.as_
36        assert b in a.bs_
37
38    def test_multi(self):
39        class A(Entity):
40            name = Field(String(100))
41
42            rel1 = ManyToMany('B')
43            rel2 = ManyToMany('B')
44           
45        class B(Entity):
46            name = Field(String(20), primary_key=True)
47
48        setup_all(True)
49       
50        b1 = B(name='b1')
51        a1 = A(name='a1', rel1=[B(name='b2'), b1],
52                          rel2=[B(name='b3'), B(name='b4'), b1])
53
54        session.flush()
55        session.clear()
56       
57        a1 = A.query.one()
58        b1 = B.get_by(name='b1')
59        b2 = B.get_by(name='b2')
60
61        assert b1 in a1.rel1 
62        assert b1 in a1.rel2
63        assert b2 in a1.rel1
64
65    def test_selfref(self):
66        class Person(Entity):
67            name = Field(Unicode(30))
68           
69            friends = ManyToMany('Person')
70
71        create_all()
72
73        barney = Person(name="Barney")
74        homer = Person(name="Homer", friends=[barney])
75        barney.friends.append(homer)
76
77        session.flush()
78        session.clear()
79       
80        homer = Person.get_by(name="Homer")
81        barney = Person.get_by(name="Barney")
82
83        assert homer in barney.friends
84        assert barney in homer.friends
85
86    def test_has_and_belongs_to_many(self):
87        class A(Entity):
88            has_field('name', String(100))
89
90            has_and_belongs_to_many('bs', of_kind='B')
91           
92        class B(Entity):
93            has_field('name', String(100), primary_key=True)
94
95        setup_all(True)
96       
97        b1 = B(name='b1')
98        a1 = A(name='a1', bs=[B(name='b2'), b1])
99        a2 = A(name='a2', bs=[B(name='b3'), b1])
100        a3 = A(name='a3')
101
102        session.flush()
103        session.clear()
104       
105        a1 = A.get_by(name='a1')
106        a2 = A.get_by(name='a2')
107        a3 = A.get_by(name='a3')
108        b1 = B.get_by(name='b1')
109        b2 = B.get_by(name='b2')
110
111        assert b1 in a1.bs
112        assert b2 in a1.bs
113        assert b1 in a2.bs
114        assert not a3.bs
Note: See TracBrowser for help on using the browser.