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

Revision 271, 3.1 kB (checked in by ged, 5 years ago)

- changed all Unicode fields to String since we don't send unicode data to

those fields and now SQLAlchemy complains when that happens

- added test for multi-pk case to M2M

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(String(60))
19            bs_ = ManyToMany('B')
20
21        class B(Entity):
22            name = Field(String(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_pk_in_target(self):
39        class A(Entity):
40            key1 = Field(Integer, primary_key=True, autoincrement=False)
41            key2 = Field(String(40), primary_key=True)
42
43            bs_ = ManyToMany('B')
44
45        class B(Entity):
46            name = Field(String(60))
47            as_ = ManyToMany('A')
48
49        setup_all(True)
50
51        b1 = B(name='b1', as_=[A(key1=10, key2='a1')])
52
53        session.flush()
54        session.clear()
55
56        a = A.query.one()
57        b = B.query.one()
58
59        assert a in b.as_
60        assert b in a.bs_
61
62    def test_multi(self):
63        class A(Entity):
64            name = Field(String(100))
65
66            rel1 = ManyToMany('B')
67            rel2 = ManyToMany('B')
68           
69        class B(Entity):
70            name = Field(String(20), primary_key=True)
71
72        setup_all(True)
73       
74        b1 = B(name='b1')
75        a1 = A(name='a1', rel1=[B(name='b2'), b1],
76                          rel2=[B(name='b3'), B(name='b4'), b1])
77
78        session.flush()
79        session.clear()
80       
81        a1 = A.query.one()
82        b1 = B.get_by(name='b1')
83        b2 = B.get_by(name='b2')
84
85        assert b1 in a1.rel1 
86        assert b1 in a1.rel2
87        assert b2 in a1.rel1
88
89    def test_selfref(self):
90        class Person(Entity):
91            name = Field(String(30))
92           
93            friends = ManyToMany('Person')
94
95        setup_all(True)
96
97        barney = Person(name="Barney")
98        homer = Person(name="Homer", friends=[barney])
99        barney.friends.append(homer)
100
101        session.flush()
102        session.clear()
103       
104        homer = Person.get_by(name="Homer")
105        barney = Person.get_by(name="Barney")
106
107        assert homer in barney.friends
108        assert barney in homer.friends
109
110    def test_has_and_belongs_to_many(self):
111        class A(Entity):
112            has_field('name', String(100))
113
114            has_and_belongs_to_many('bs', of_kind='B')
115           
116        class B(Entity):
117            has_field('name', String(100), primary_key=True)
118
119        setup_all(True)
120       
121        b1 = B(name='b1')
122        a1 = A(name='a1', bs=[B(name='b2'), b1])
123        a2 = A(name='a2', bs=[B(name='b3'), b1])
124        a3 = A(name='a3')
125
126        session.flush()
127        session.clear()
128       
129        a1 = A.get_by(name='a1')
130        a2 = A.get_by(name='a2')
131        a3 = A.get_by(name='a3')
132        b1 = B.get_by(name='b1')
133        b2 = B.get_by(name='b2')
134
135        assert b1 in a1.bs
136        assert b2 in a1.bs
137        assert b1 in a2.bs
138        assert not a3.bs
Note: See TracBrowser for help on using the browser.