root / elixir / tags / 0.7.0 / tests / test_through.py

Revision 484, 2.8 kB (checked in by ged, 3 years ago)

update all web links

Line 
1"""
2    test has_*(..., through=...) syntax
3"""
4
5from elixir import *
6from datetime import datetime
7
8def setup():
9    metadata.bind = 'sqlite://'
10
11
12class TestThrough(object):
13    def teardown(self):
14        cleanup_all(True)
15
16    def test_rel_through(self):
17        # converted from
18        # http://www.sqlalchemy.org/docs/05/reference/ext/associationproxy.html
19        class User(Entity):
20            has_field('name', String(64))
21            has_many('user_keywords', of_kind='UserKeyword')
22            has_many('keywords', through='user_keywords', via='keyword',
23                     creator=lambda kw: UserKeyword(keyword=kw))
24
25        class Keyword(Entity):
26            has_field('keyword', String(64))
27
28            def __init__(self, keyword):
29                self.keyword = keyword
30
31        class UserKeyword(Entity):
32            belongs_to('user', of_kind='User', primary_key=True)
33            belongs_to('keyword', of_kind='Keyword', primary_key=True)
34
35            # add some auditing columns
36            has_field('updated_at', DateTime, default=datetime.now)
37
38        setup_all(True)
39
40        user = User(name='log')
41        keywords = [Keyword('its_big'), Keyword('its_heavy'), Keyword('its_wood')]
42        for kw in keywords:
43            user.keywords.append(kw)
44
45        assert user.keywords == keywords
46
47    def test_rel_through_to_value_list(self):
48        class User(Entity):
49            has_field('name', String(64))
50            has_and_belongs_to_many('kw', of_kind='Keyword')
51            has_many('keywords', through='kw', via='keyword')
52
53        class Keyword(Entity):
54            has_field('keyword', String(64))
55
56            def __init__(self, keyword):
57                self.keyword = keyword
58
59        setup_all(True)
60
61        user = User(name='jek')
62        user.kw.append(Keyword('cheese inspector'))
63
64        assert user.kw[0].keyword == 'cheese inspector'
65        assert user.keywords == ['cheese inspector']
66
67        user.keywords.append('snack ninja')
68
69        assert user.keywords == ['cheese inspector', 'snack ninja']
70        assert len(user.kw) == 2
71
72    def test_field_through(self):
73        class User(Entity):
74            has_field('name', String(64))
75            belongs_to('kw', of_kind='Keyword')
76            has_field('keyword', through='kw')
77            has_field('kw2', through='kw', attribute='keyword')
78
79        class Keyword(Entity):
80            has_field('keyword', String(64))
81
82            def __init__(self, keyword):
83                self.keyword = keyword
84
85        setup_all(True)
86
87        user = User(name='jek')
88        user.kw = Keyword('cheese inspector')
89
90        assert user.kw.keyword == 'cheese inspector'
91        assert user.keyword == 'cheese inspector'
92
93        user.keyword = 'snack ninja'
94
95        assert user.kw.keyword == 'snack ninja'
96        assert user.kw2 == 'snack ninja'
Note: See TracBrowser for help on using the browser.