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