root / elixir / trunk / tests / test_through.py

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

fix too long line

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'),
42                    Keyword('its_wood')]
43        for kw in keywords:
44            user.keywords.append(kw)
45
46        assert user.keywords == keywords
47
48    def test_rel_through_to_value_list(self):
49        class User(Entity):
50            has_field('name', String(64))
51            has_and_belongs_to_many('kw', of_kind='Keyword')
52            has_many('keywords', through='kw', via='keyword')
53
54        class Keyword(Entity):
55            has_field('keyword', String(64))
56
57            def __init__(self, keyword):
58                self.keyword = keyword
59
60        setup_all(True)
61
62        user = User(name='jek')
63        user.kw.append(Keyword('cheese inspector'))
64
65        assert user.kw[0].keyword == 'cheese inspector'
66        assert user.keywords == ['cheese inspector']
67
68        user.keywords.append('snack ninja')
69
70        assert user.keywords == ['cheese inspector', 'snack ninja']
71        assert len(user.kw) == 2
72
73    def test_field_through(self):
74        class User(Entity):
75            has_field('name', String(64))
76            belongs_to('kw', of_kind='Keyword')
77            has_field('keyword', through='kw')
78            has_field('kw2', through='kw', attribute='keyword')
79
80        class Keyword(Entity):
81            has_field('keyword', String(64))
82
83            def __init__(self, keyword):
84                self.keyword = keyword
85
86        setup_all(True)
87
88        user = User(name='jek')
89        user.kw = Keyword('cheese inspector')
90
91        assert user.kw.keyword == 'cheese inspector'
92        assert user.keyword == 'cheese inspector'
93
94        user.keyword = 'snack ninja'
95
96        assert user.kw.keyword == 'snack ninja'
97        assert user.kw2 == 'snack ninja'
Note: See TracBrowser for help on using the browser.