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