Fixed problem when message is false (i think)
[odoo/odoo.git] / openerp / tests / test_ir_sequence.py
1 # -*- coding: utf-8 -*-
2 # Run with one of these commands:
3 #    > OPENERP_ADDONS_PATH='../../addons/trunk' OPENERP_PORT=8069 \
4 #      OPENERP_DATABASE=yy PYTHONPATH=. python tests/test_ir_sequence.py
5 #    > OPENERP_ADDONS_PATH='../../addons/trunk' OPENERP_PORT=8069 \
6 #      OPENERP_DATABASE=yy nosetests tests/test_ir_sequence.py
7 #    > OPENERP_ADDONS_PATH='../../../addons/trunk' OPENERP_PORT=8069 \
8 #      OPENERP_DATABASE=yy PYTHONPATH=../:. unit2 test_ir_sequence
9 # This assume an existing database.
10 import psycopg2
11 import unittest2
12
13 import openerp
14 import common
15
16 DB = common.DB
17 ADMIN_USER_ID = common.ADMIN_USER_ID
18
19 def registry(model):
20     return openerp.modules.registry.RegistryManager.get(DB)[model]
21
22 def cursor():
23     return openerp.modules.registry.RegistryManager.get(DB).db.cursor()
24
25 class test_ir_sequence_standard(unittest2.TestCase):
26     """ A few tests for a 'Standard' (i.e. PostgreSQL) sequence. """
27
28     def test_ir_sequence_create(self):
29         """ Try to create a sequence object. """
30         cr = cursor()
31         d = dict(code='test_sequence_type', name='Test sequence type')
32         c = registry('ir.sequence.type').create(cr, ADMIN_USER_ID, d, {})
33         assert c
34         d = dict(code='test_sequence_type', name='Test sequence')
35         c = registry('ir.sequence').create(cr, ADMIN_USER_ID, d, {})
36         assert c
37         cr.commit()
38         cr.close()
39
40     def test_ir_sequence_search(self):
41         """ Try a search. """
42         cr = cursor()
43         ids = registry('ir.sequence').search(cr, ADMIN_USER_ID, [], {})
44         assert ids
45         cr.commit()
46         cr.close()
47
48     def test_ir_sequence_draw(self):
49         """ Try to draw a number. """
50         cr = cursor()
51         n = registry('ir.sequence').get(cr, ADMIN_USER_ID, 'test_sequence_type', {})
52         assert n
53         cr.commit()
54         cr.close()
55
56     def test_ir_sequence_draw_twice(self):
57         """ Try to draw a number from two transactions. """
58         cr0 = cursor()
59         cr1 = cursor()
60         n0 = registry('ir.sequence').get(cr0, ADMIN_USER_ID, 'test_sequence_type', {})
61         assert n0
62         n1 = registry('ir.sequence').get(cr1, ADMIN_USER_ID, 'test_sequence_type', {})
63         assert n1
64         cr0.commit()
65         cr1.commit()
66         cr0.close()
67         cr1.close()
68
69 class test_ir_sequence_no_gap(unittest2.TestCase):
70     """ Copy of the previous tests for a 'No gap' sequence. """
71
72     def test_ir_sequence_create_no_gap(self):
73         """ Try to create a sequence object. """
74         cr = cursor()
75         d = dict(code='test_sequence_type_2', name='Test sequence type')
76         c = registry('ir.sequence.type').create(cr, ADMIN_USER_ID, d, {})
77         assert c
78         d = dict(code='test_sequence_type_2', name='Test sequence',
79             implementation='no_gap')
80         c = registry('ir.sequence').create(cr, ADMIN_USER_ID, d, {})
81         assert c
82         cr.commit()
83         cr.close()
84
85     def test_ir_sequence_draw_no_gap(self):
86         """ Try to draw a number. """
87         cr = cursor()
88         n = registry('ir.sequence').get(cr, ADMIN_USER_ID, 'test_sequence_type_2', {})
89         assert n
90         cr.commit()
91         cr.close()
92
93     def test_ir_sequence_draw_twice_no_gap(self):
94         """ Try to draw a number from two transactions.
95         This is expected to not work.
96         """
97         cr0 = cursor()
98         cr1 = cursor()
99         cr1._default_log_exceptions = False # Prevent logging a traceback
100         msg_re = '^could not obtain lock on row in relation "ir_sequence"$'
101         with self.assertRaisesRegexp(psycopg2.OperationalError, msg_re):
102             n0 = registry('ir.sequence').get(cr0, ADMIN_USER_ID, 'test_sequence_type_2', {})
103             assert n0
104             n1 = registry('ir.sequence').get(cr1, ADMIN_USER_ID, 'test_sequence_type_2', {})
105         cr0.close()
106         cr1.close()
107
108 class test_ir_sequence_change_implementation(unittest2.TestCase):
109     """ Create sequence objects and change their ``implementation`` field. """
110
111     def test_ir_sequence_1_create(self):
112         """ Try to create a sequence object. """
113         cr = cursor()
114         d = dict(code='test_sequence_type_3', name='Test sequence type')
115         c = registry('ir.sequence.type').create(cr, ADMIN_USER_ID, d, {})
116         assert c
117         d = dict(code='test_sequence_type_3', name='Test sequence')
118         c = registry('ir.sequence').create(cr, ADMIN_USER_ID, d, {})
119         assert c
120         d = dict(code='test_sequence_type_4', name='Test sequence type')
121         c = registry('ir.sequence.type').create(cr, ADMIN_USER_ID, d, {})
122         assert c
123         d = dict(code='test_sequence_type_4', name='Test sequence',
124             implementation='no_gap')
125         c = registry('ir.sequence').create(cr, ADMIN_USER_ID, d, {})
126         assert c
127         cr.commit()
128         cr.close()
129
130     def test_ir_sequence_2_write(self):
131         cr = cursor()
132         ids = registry('ir.sequence').search(cr, ADMIN_USER_ID,
133             [('code', 'in', ['test_sequence_type_3', 'test_sequence_type_4'])], {})
134         registry('ir.sequence').write(cr, ADMIN_USER_ID, ids,
135             {'implementation': 'standard'}, {})
136         registry('ir.sequence').write(cr, ADMIN_USER_ID, ids,
137             {'implementation': 'no_gap'}, {})
138         cr.commit()
139         cr.close()
140
141     def test_ir_sequence_3_unlink(self):
142         cr = cursor()
143         ids = registry('ir.sequence').search(cr, ADMIN_USER_ID,
144             [('code', 'in', ['test_sequence_type_3', 'test_sequence_type_4'])], {})
145         registry('ir.sequence').unlink(cr, ADMIN_USER_ID, ids, {})
146         cr.commit()
147         cr.close()
148
149 class test_ir_sequence_generate(unittest2.TestCase):
150     """ Create sequence objects and generate some values. """
151
152     def test_ir_sequence_create(self):
153         """ Try to create a sequence object. """
154         cr = cursor()
155         d = dict(code='test_sequence_type_5', name='Test sequence type')
156         c = registry('ir.sequence.type').create(cr, ADMIN_USER_ID, d, {})
157         assert c
158         d = dict(code='test_sequence_type_5', name='Test sequence')
159         c = registry('ir.sequence').create(cr, ADMIN_USER_ID, d, {})
160         assert c
161         cr.commit()
162         cr.close()
163
164         cr = cursor()
165         f = lambda *a: registry('ir.sequence').get(cr, ADMIN_USER_ID, 'test_sequence_type_5', {})
166         assert all(str(x) == f() for x in xrange(1,1000))
167         cr.commit()
168         cr.close()
169
170     def test_ir_sequence_create_no_gap(self):
171         """ Try to create a sequence object. """
172         cr = cursor()
173         d = dict(code='test_sequence_type_6', name='Test sequence type')
174         c = registry('ir.sequence.type').create(cr, ADMIN_USER_ID, d, {})
175         assert c
176         d = dict(code='test_sequence_type_6', name='Test sequence')
177         c = registry('ir.sequence').create(cr, ADMIN_USER_ID, d, {})
178         assert c
179         cr.commit()
180         cr.close()
181
182         cr = cursor()
183         f = lambda *a: registry('ir.sequence').get(cr, ADMIN_USER_ID, 'test_sequence_type_6', {})
184         assert all(str(x) == f() for x in xrange(1,1000))
185         cr.commit()
186         cr.close()
187         
188
189
190 if __name__ == '__main__':
191     unittest2.main()
192
193
194 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: