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

Revision 480, 6.8 kB (checked in by ged, 3 years ago)

- Provide our own Session.mapper equivalent to avoid SQLAlchemy 0.5.5+

deprecation warning. This mapper autosave object instances on init unless
save_on_init=False is passed as a mapper argument (closes #92).

- simplified a few tests in test_options.py

Line 
1"""
2test options
3"""
4
5from sqlalchemy import UniqueConstraint, create_engine, Column
6from sqlalchemy.orm import scoped_session, sessionmaker
7from sqlalchemy.exceptions import SQLError, ConcurrentModificationError
8from elixir import *
9
10class TestOptions(object):
11    def setup(self):
12        metadata.bind = 'sqlite://'
13
14    def teardown(self):
15        cleanup_all(True)
16
17    # this test is a rip-off SQLAlchemy's activemapper's update test
18    def test_version_id_col(self):
19        class Person(Entity):
20            name = Field(String(30))
21
22            using_options(version_id_col=True)
23
24        setup_all(True)
25
26        p1 = Person(name='Daniel')
27        session.commit()
28        session.clear()
29
30        person = Person.query.first()
31        person.name = 'Gaetan'
32        session.commit()
33        assert person.row_version == 2
34        session.clear()
35
36        person = Person.query.first()
37        person.name = 'Jonathan'
38        session.commit()
39        assert person.row_version == 3
40        session.clear()
41
42        # check that a concurrent modification raises exception
43        p1 = Person.query.first()
44        s2 = sessionmaker()()
45        p2 = s2.query(Person).first()
46        p1.name = "Daniel"
47        p2.name = "Gaetan"
48        s2.commit()
49        try:
50            session.commit()
51            assert False
52        except ConcurrentModificationError:
53            pass
54        s2.close()
55
56    def test_allowcoloverride_false(self):
57        class MyEntity(Entity):
58            name = Field(String(30))
59
60        setup_all(True)
61
62        raised = False
63        try:
64            MyEntity._descriptor.add_column(Column('name', String(30)))
65        except Exception:
66            raised = True
67
68        assert raised
69
70    def test_allowcoloverride_true(self):
71        class MyEntity(Entity):
72            name = Field(String(30))
73            using_options(allowcoloverride=True)
74
75        setup_all()
76
77        # Note that this test is bogus as you cannot just change a column this
78        # way since the mapper is already constructed at this point and will
79        # use the old column!!! This test is only meant as a way to check no
80        # exception is raised.
81        #TODO: provide a proper test (using autoloaded tables)
82        MyEntity._descriptor.add_column(Column('name', String(30),
83                                               default='test'))
84
85    def test_tablename_func(self):
86        import re
87
88        def camel_to_underscore(entity):
89            return re.sub(r'(.+?)([A-Z])+?', r'\1_\2', entity.__name__).lower()
90
91        options_defaults['tablename'] = camel_to_underscore
92
93        class MyEntity(Entity):
94            name = Field(String(30))
95
96        class MySuperTestEntity(Entity):
97            name = Field(String(30))
98
99        setup_all(True)
100
101        assert MyEntity.table.name == 'my_entity'
102        assert MySuperTestEntity.table.name == 'my_super_test_entity'
103
104        options_defaults['tablename'] = None
105
106
107class TestSessionOptions(object):
108    def setup(self):
109        metadata.bind = None
110
111    def teardown(self):
112        cleanup_all()
113
114    def test_manual_session(self):
115        engine = create_engine('sqlite://')
116
117        class Person(Entity):
118            using_options(session=None)
119            name = Field(String(30))
120
121        setup_all()
122        create_all(engine)
123
124        Session = sessionmaker(bind=engine)
125        session = Session()
126
127        homer = Person(name="Homer")
128        bart = Person(name="Bart")
129
130        session.add(homer)
131        session.add(bart)
132        session.commit()
133
134        bart.delete()
135        session.commit()
136
137        assert session.query(Person).filter_by(name='Homer').one() is \
138               homer
139        assert session.query(Person).count() == 1
140
141    def test_scoped_session(self):
142        engine = create_engine('sqlite://')
143        Session = scoped_session(sessionmaker(bind=engine))
144
145        class Person(Entity):
146            using_options(session=Session)
147            name = Field(String(30))
148
149        setup_all()
150        create_all(engine)
151
152        homer = Person(name="Homer")
153        bart = Person(name="Bart")
154        Session.commit()
155
156        assert Person.query.session is Session()
157        assert Person.query.filter_by(name='Homer').one() is homer
158
159    def test_scoped_session_no_save_on_init(self):
160        metadata.bind = 'sqlite://'
161
162        class Person(Entity):
163            using_mapper_options(save_on_init=False)
164            name = Field(String(30))
165
166        setup_all(True)
167
168        homer = Person(name="Homer")
169        bart = Person(name="Bart")
170        assert homer not in session
171        assert bart not in session
172        session.add(homer)
173        session.add(bart)
174        session.commit()
175
176        assert Person.query.filter_by(name='Homer').one() is homer
177
178    def test_global_scoped_session(self):
179        global __session__
180
181        engine = create_engine('sqlite://')
182        session = scoped_session(sessionmaker(bind=engine))
183        __session__ = session
184
185        class Person(Entity):
186            name = Field(String(30))
187
188        setup_all()
189        create_all(engine)
190
191        homer = Person(name="Homer")
192        bart = Person(name="Bart")
193        session.commit()
194
195        assert Person.query.session is session()
196        assert Person.query.filter_by(name='Homer').one() is homer
197
198        del __session__
199
200
201class TestTableOptions(object):
202    def setup(self):
203        metadata.bind = 'sqlite://'
204
205    def teardown(self):
206        cleanup_all()
207
208    def test_unique_constraint(self):
209
210        class Person(Entity):
211            firstname = Field(String(30))
212            surname = Field(String(30))
213
214            using_table_options(UniqueConstraint('firstname', 'surname'))
215
216        setup_all(True)
217
218        homer = Person(firstname="Homer", surname='Simpson')
219        bart = Person(firstname="Bart", surname='Simpson')
220
221        session.commit()
222
223        homer2 = Person(firstname="Homer", surname='Simpson')
224
225        raised = False
226        try:
227            session.commit()
228        except SQLError:
229            raised = True
230
231        assert raised
232
233    def test_unique_constraint_many_to_one(self):
234        class Author(Entity):
235            name = Field(String(50))
236
237        class Book(Entity):
238            title = Field(String(200), required=True)
239            author = ManyToOne("Author")
240
241            using_table_options(UniqueConstraint("title", "author_id"))
242
243        setup_all(True)
244
245        tolkien = Author(name="J. R. R. Tolkien")
246        lotr = Book(title="The Lord of the Rings", author=tolkien)
247        hobbit = Book(title="The Hobbit", author=tolkien)
248
249        session.commit()
250
251        tolkien2 = Author(name="Tolkien")
252        hobbit2 = Book(title="The Hobbit", author=tolkien2)
253
254        session.commit()
255
256        hobbit3 = Book(title="The Hobbit", author=tolkien)
257
258        raised = False
259        try:
260            session.commit()
261        except SQLError:
262            raised = True
263
264        assert raised
Note: See TracBrowser for help on using the browser.