root / elixir / trunk / tests / test_m2o.py @ 319

Revision 319, 5.2 kB (checked in by ged, 5 years ago)

- Fixed ManyToOne relationships using 'key' kwarg in their column_kwargs

(patch by Jason R. Coombs)

- drop tables after test_through test

Line 
1"""
2test many to one relationships
3"""
4
5from elixir import *
6
7def setup():
8    metadata.bind = 'sqlite:///'
9
10class TestManyToOne(object):
11    def teardown(self):
12        cleanup_all(True)
13   
14    def test_simple(self):
15        class A(Entity):
16            name = Field(String(60))
17
18        class B(Entity):
19            name = Field(String(60))
20            a = ManyToOne('A')
21
22        setup_all(True)
23
24        b1 = B(name='b1', a=A(name='a1'))
25
26        session.flush()
27        session.clear()
28
29        b = B.query.one()
30
31        assert b.a.name == 'a1'
32
33    # this test is in test_o2m.py
34    # def test_selfref(self):
35
36    def test_with_key_pk(self):
37        class A(Entity):
38            test = Field(Integer, primary_key=True, key='testx')
39
40        class B(Entity):
41            a = ManyToOne('A')
42           
43        setup_all(True)
44       
45        b1 = B(a=A(testx=1))
46       
47        session.flush()
48        session.clear()
49       
50        b = B.query.one()
51
52        assert b.a.testx == 1
53
54    def test_wh_key_in_m2o_col_kwargs(self):
55        class A(Entity):
56            name = Field(String(128), default="foo")
57       
58        class B(Entity):
59            # specify a different key for the column so that
60            #  it doesn't override the property when the column
61            #  gets created.
62            a = ManyToOne('A', colname='a',
63                          column_kwargs=dict(key='a_id'))
64         
65        setup_all(True)
66
67        assert A.table.primary_key.columns.has_key('id')
68        assert B.table.columns.has_key('a_id')
69
70        a = A()
71        session.flush()
72        b = B(a=a)
73        session.flush()
74        session.clear()
75
76        assert B.query.first().a == A.query.first()
77
78    def test_one_pk(self):
79        class A(Entity):
80            name = Field(String(40), primary_key=True)
81         
82        class B(Entity):
83            a = ManyToOne('A', primary_key=True)
84         
85        class C(Entity):
86            b = ManyToOne('B', primary_key=True)
87
88        setup_all()
89
90        assert A.table.primary_key.columns.has_key('name')
91        assert B.table.primary_key.columns.has_key('a_name')
92        assert C.table.primary_key.columns.has_key('b_a_name')
93
94    def test_m2o_is_only_pk(self):
95        class A(Entity):
96            pass
97         
98        class B(Entity):
99            a = ManyToOne('A', primary_key=True)
100         
101        setup_all()
102
103        assert A.table.primary_key.columns.has_key('id')
104        assert B.table.primary_key.columns.has_key('a_id')
105        assert not B.table.primary_key.columns.has_key('id')
106
107    def test_multi_pk_in_target(self):
108        class A(Entity):
109            key1 = Field(Integer, primary_key=True)
110            key2 = Field(String(40), primary_key=True)
111         
112        class B(Entity):
113            num = Field(Integer, primary_key=True)
114            a = ManyToOne('A', primary_key=True)
115         
116        class C(Entity):
117            num = Field(Integer, primary_key=True)
118            b = ManyToOne('B', primary_key=True)
119
120        setup_all()
121
122        assert A.table.primary_key.columns.has_key('key1')
123        assert A.table.primary_key.columns.has_key('key2')
124
125        assert B.table.primary_key.columns.has_key('num')
126        assert B.table.primary_key.columns.has_key('a_key1')
127        assert B.table.primary_key.columns.has_key('a_key2')
128
129        assert C.table.primary_key.columns.has_key('num')
130        assert C.table.primary_key.columns.has_key('b_num')
131        assert C.table.primary_key.columns.has_key('b_a_key1')
132        assert C.table.primary_key.columns.has_key('b_a_key2')
133
134    def test_cycle_but_use_alter(self):
135        class A(Entity):
136            c = ManyToOne('C', use_alter=True)
137         
138        class B(Entity):
139            a = ManyToOne('A', primary_key=True)
140         
141        class C(Entity):
142            b = ManyToOne('B', primary_key=True)
143
144        setup_all()
145
146        assert B.table.primary_key.columns.has_key('a_id')
147        assert C.table.primary_key.columns.has_key('b_a_id')
148        assert A.table.primary_key.columns.has_key('id')
149        assert A.table.columns.has_key('c_b_a_id')
150
151    def test_multi(self):
152        class A(Entity):
153            name = Field(String(32))
154           
155        class B(Entity):
156            name = Field(String(15))
157           
158            a_rel1 = ManyToOne('A')
159            a_rel2 = ManyToOne('A')
160
161        setup_all(True)
162
163        a1 = A(name="a1")
164        a2 = A(name="a2")
165        b1 = B(name="b1", a_rel1=a1, a_rel2=a2)
166        b2 = B(name="b2", a_rel1=a1, a_rel2=a1)
167       
168        session.flush()
169        session.clear()
170       
171        a1 = A.get_by(name="a1")
172        a2 = A.get_by(name="a2")
173        b1 = B.get_by(name="b1")
174        b2 = B.get_by(name="b2")
175       
176        assert a1 == b2.a_rel1
177        assert a2 == b1.a_rel2
178
179    def test_belongs_to_syntax(self):
180        class Person(Entity):
181            has_field('name', String(30))
182
183        class Animal(Entity):
184            has_field('name', String(30))
185            belongs_to('owner', of_kind='Person')
186
187        setup_all(True)
188       
189        santa = Person(name="Santa Claus")
190        rudolph = Animal(name="Rudolph", owner=santa)
191       
192        session.flush()
193        session.clear()
194       
195        assert "Claus" in Animal.get_by(name="Rudolph").owner.name
Note: See TracBrowser for help on using the browser.