/[public]/erp5/sandbox/amount_generator/products/ERP5/tests/testMovementGroup.py
ERP5 logo

Contents of /erp5/sandbox/amount_generator/products/ERP5/tests/testMovementGroup.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 38604 - (show annotations)
Thu Sep 23 18:30:37 2010 UTC (2 years, 7 months ago) by jm
File MIME type: text/x-python
File size: 21031 byte(s)
Fix and speed up testMovementGroup
1 # -*- coding: utf-8 -*-
2 ##############################################################################
3 #
4 # Copyright (c) 2008 Nexedi SA and Contributors. All Rights Reserved.
5 #
6 # WARNING: This program as such is intended to be used by professional
7 # programmers who take the whole responsibility of assessing all potential
8 # consequences resulting from its eventual inadequacies and bugs
9 # End users who are looking for a ready-to-use solution with commercial
10 # guarantees and support are strongly adviced to contract a Free Software
11 # Service Company
12 #
13 # This program is Free Software; you can redistribute it and/or
14 # modify it under the terms of the GNU General Public License
15 # as published by the Free Software Foundation; either version 2
16 # of the License, or (at your option) any later version.
17 #
18 # This program is distributed in the hope that it will be useful,
19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 # GNU General Public License for more details.
22 #
23 # You should have received a copy of the GNU General Public License
24 # along with this program; if not, write to the Free Software
25 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26 #
27 ##############################################################################
28
29 import os
30 import unittest
31 from DateTime import DateTime
32 from Products.ERP5.mixin.builder import DuplicatedPropertyDictKeysError
33 from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
34
35 class MovementGroupTestCase(ERP5TypeTestCase):
36
37 def getPortalName(self):
38 """ID of the portal. """
39 return os.environ.get('erp5_tests_portal_id') or 'movement_group_test'
40
41 def getBusinessTemplateList(self):
42 return ('erp5_base', 'erp5_pdm', 'erp5_simulation', 'erp5_trade')
43
44 def afterSetUp(self):
45 self.builder = self.portal.portal_deliveries.newContent(
46 portal_type='Delivery Builder',
47 delivery_module = 'internal_packing_list_module',
48 delivery_portal_type = 'Internal Packing List',
49 delivery_line_portal_type = 'Internal Packing List Line',
50 delivery_cell_portal_type = 'Internal Packing List Cell',
51 )
52 self.folder = self.portal.portal_simulation.newContent(
53 portal_type='Applied Rule')
54
55 class TestPropertyMovementGroup(MovementGroupTestCase):
56 def test_property_movement_group_grouping(self):
57 movement_list = ( self.folder.newContent(
58 temp_object=1,
59 portal_type='Simulation Movement',
60 start_date=DateTime(2001, 1, 1)),
61 self.folder.newContent(
62 temp_object=1,
63 portal_type='Simulation Movement',
64 start_date=DateTime(2001, 1, 1)))
65 self.builder.newContent(
66 portal_type='Property Movement Group',
67 collect_order_group='delivery',
68 tested_property_list=('start_date',))
69 movement_group_node = self.builder.collectMovement(movement_list)
70 group_list = movement_group_node.getGroupList()
71 self.assertEquals(1, len(group_list))
72 self.assertEquals(dict(start_date=DateTime(2001, 1, 1)),
73 group_list[0].getGroupEditDict())
74
75 def test_property_movement_group_separating(self):
76 movement_list = ( self.folder.newContent(
77 temp_object=1,
78 portal_type='Simulation Movement',
79 start_date=DateTime(2001, 1, 1)),
80 self.folder.newContent(
81 temp_object=1,
82 portal_type='Simulation Movement',
83 start_date=DateTime(2001, 1, 2)))
84 self.builder.newContent(
85 portal_type='Property Movement Group',
86 collect_order_group='delivery',
87 tested_property_list=('start_date',))
88 movement_group_node = self.builder.collectMovement(movement_list)
89 group_list = movement_group_node.getGroupList()
90 self.assertEquals(2, len(group_list))
91 self.assertEquals(1, len([group for group in group_list if
92 group.getGroupEditDict() == dict(start_date=DateTime(2001, 1, 1))]))
93 self.assertEquals(1, len([group for group in group_list if
94 group.getGroupEditDict() == dict(start_date=DateTime(2001, 1, 2))]))
95
96 def test_property_movement_group_and_separating(self):
97 movement_list = ( self.folder.newContent(
98 temp_object=1,
99 portal_type='Simulation Movement',
100 title='A',
101 start_date=DateTime(2001, 1, 1)),
102 self.folder.newContent(
103 temp_object=1,
104 title='A',
105 portal_type='Simulation Movement',
106 start_date=DateTime(2001, 1, 2)))
107 self.builder.newContent(
108 portal_type='Property Movement Group',
109 collect_order_group='delivery',
110 tested_property_list=('start_date', 'title'))
111 movement_group_node = self.builder.collectMovement(movement_list)
112 group_list = movement_group_node.getGroupList()
113 self.assertEquals(2, len(group_list))
114 self.assertEquals(1, len([group for group in group_list if
115 group.getGroupEditDict() == dict(title='A',
116 start_date=DateTime(2001, 1, 1))]))
117 self.assertEquals(1, len([group for group in group_list if
118 group.getGroupEditDict() == dict(title='A',
119 start_date=DateTime(2001, 1, 2))]))
120
121
122 class TestPropertyAssignmentMovementGroup(MovementGroupTestCase):
123 def test_property_assignment_movement_group_max(self):
124 movement_list = ( self.folder.newContent(
125 temp_object=1,
126 portal_type='Simulation Movement',
127 start_date=DateTime(2001, 1, 1)),
128 self.folder.newContent(
129 temp_object=1,
130 portal_type='Simulation Movement',
131 start_date=DateTime(2001, 1, 2)))
132 self.builder.newContent(
133 portal_type='Property Assignment Movement Group',
134 collect_order_group='delivery',
135 tested_property_list=('start_date',),
136 grouping_method='max',)
137 movement_group_node = self.builder.collectMovement(movement_list)
138 group_list = movement_group_node.getGroupList()
139 self.assertEquals(1, len(group_list))
140 self.assertEquals(dict(start_date=DateTime(2001, 1, 2)),
141 group_list[0].getGroupEditDict())
142
143 def test_property_assignment_movement_group_min(self):
144 movement_list = ( self.folder.newContent(
145 temp_object=1,
146 portal_type='Simulation Movement',
147 start_date=DateTime(2001, 1, 1)),
148 self.folder.newContent(
149 temp_object=1,
150 portal_type='Simulation Movement',
151 start_date=DateTime(2001, 1, 2)))
152 self.builder.newContent(
153 portal_type='Property Assignment Movement Group',
154 collect_order_group='delivery',
155 tested_property_list=('start_date',),
156 grouping_method='min',)
157 movement_group_node = self.builder.collectMovement(movement_list)
158 group_list = movement_group_node.getGroupList()
159 self.assertEquals(1, len(group_list))
160 self.assertEquals(dict(start_date=DateTime(2001, 1, 1)),
161 group_list[0].getGroupEditDict())
162
163 def test_property_assignment_movement_group_avg(self):
164 movement_list = ( self.folder.newContent(
165 temp_object=1,
166 portal_type='Simulation Movement',
167 int_index=1,),
168 self.folder.newContent(
169 temp_object=1,
170 portal_type='Simulation Movement',
171 int_index=3,),)
172 self.builder.newContent(
173 portal_type='Property Assignment Movement Group',
174 collect_order_group='delivery',
175 tested_property_list=('int_index',),
176 grouping_method='avg',)
177 movement_group_node = self.builder.collectMovement(movement_list)
178 group_list = movement_group_node.getGroupList()
179 self.assertEquals(1, len(group_list))
180 self.assertEquals(dict(int_index=2),
181 group_list[0].getGroupEditDict())
182
183 def test_property_assignment_movement_group_common_match(self):
184 movement_list = ( self.folder.newContent(
185 temp_object=1,
186 portal_type='Simulation Movement',
187 start_date=DateTime(2001, 1, 1)),
188 self.folder.newContent(
189 temp_object=1,
190 portal_type='Simulation Movement',
191 start_date=DateTime(2001, 1, 1)))
192 self.builder.newContent(
193 portal_type='Property Assignment Movement Group',
194 collect_order_group='delivery',
195 tested_property_list=('start_date',),
196 grouping_method='common',)
197 movement_group_node = self.builder.collectMovement(movement_list)
198 group_list = movement_group_node.getGroupList()
199 self.assertEquals(1, len(group_list))
200 self.assertEquals(dict(start_date=DateTime(2001, 1, 1)),
201 group_list[0].getGroupEditDict())
202
203 def test_property_assignment_movement_group_common_doesnot_match(self):
204 movement_list = ( self.folder.newContent(
205 temp_object=1,
206 portal_type='Simulation Movement',
207 start_date=DateTime(2001, 1, 1)),
208 self.folder.newContent(
209 temp_object=1,
210 portal_type='Simulation Movement',
211 start_date=DateTime(2001, 1, 2)))
212 self.builder.newContent(
213 portal_type='Property Assignment Movement Group',
214 collect_order_group='delivery',
215 tested_property_list=('start_date',),
216 grouping_method='common',)
217 movement_group_node = self.builder.collectMovement(movement_list)
218 group_list = movement_group_node.getGroupList()
219 self.assertEquals(1, len(group_list))
220 self.assertEquals(dict(), group_list[0].getGroupEditDict())
221
222 class TestOrderMovementGroup(MovementGroupTestCase):
223 """Tests Order Movement Group - grouping and separating by
224 root Applied Rule Causality, in case if that causality is Order"""
225 document_portal_type = 'Sale Order'
226 def test_order_movement_group_grouping(self):
227 order = self.portal.getDefaultModule(self.document_portal_type) \
228 .newContent(portal_type=self.document_portal_type)
229 applied_rule = self.portal.portal_simulation.newContent(
230 portal_type='Applied Rule',
231 causality_value = order
232 )
233
234 movement_list = (
235 applied_rule.newContent(portal_type='Simulation Movement'),
236 applied_rule.newContent(portal_type='Simulation Movement')
237 )
238
239 self.builder.newContent(
240 portal_type='Order Movement Group',
241 collect_order_group='delivery')
242
243 movement_group_node = self.builder.collectMovement(movement_list)
244 group_list = movement_group_node.getGroupList()
245 self.assertEquals(1, len(group_list))
246 self.assertEquals(dict(causality_list=[order.getRelativeUrl()]),
247 group_list[0].getGroupEditDict())
248
249 def test_order_movement_group_separating(self):
250 order_1 = self.portal.getDefaultModule(self.document_portal_type) \
251 .newContent(portal_type=self.document_portal_type)
252 applied_rule_1 = self.portal.portal_simulation.newContent(
253 portal_type='Applied Rule',
254 causality_value = order_1
255 )
256
257 order_2 = self.portal.getDefaultModule(self.document_portal_type) \
258 .newContent(portal_type=self.document_portal_type)
259 applied_rule_2 = self.portal.portal_simulation.newContent(
260 portal_type='Applied Rule',
261 causality_value = order_2
262 )
263
264 movement_list = (
265 applied_rule_1.newContent(portal_type='Simulation Movement'),
266 applied_rule_2.newContent(portal_type='Simulation Movement')
267 )
268
269 self.builder.newContent(
270 portal_type='Order Movement Group',
271 collect_order_group='delivery')
272
273 movement_group_node = self.builder.collectMovement(movement_list)
274 group_list = movement_group_node.getGroupList()
275 self.assertEquals(2, len(group_list))
276 self.assertEquals(1, len([group for group in group_list if
277 group.getGroupEditDict() == dict(causality_list=[order_1.getRelativeUrl()])]))
278 self.assertEquals(1, len([group for group in group_list if
279 group.getGroupEditDict() == dict(causality_list=[order_2.getRelativeUrl()])]))
280
281 class TestOrderMovementGroupDelivery(TestOrderMovementGroup):
282 """Tests Order Movement Group - grouping and separating by
283 root Applied Rule Causality, in case if that causality is Delivery"""
284 document_portal_type = 'Sale Packing List'
285
286 class TestDeliveryCausalityAssignmentMovementGroup(MovementGroupTestCase):
287 """Tests Delivery Causality Assignment Movement Group
288 This Movement Group never separates"""
289 order_portal_type = 'Sale Order'
290 order_line_portal_type = 'Sale Order Line'
291 delivery_portal_type = 'Sale Packing List'
292 delivery_line_portal_type = 'Sale Packing List Line'
293
294 def test_delivery_causality_assignment_movement_group(self):
295 order = self.portal.getDefaultModule(self.order_portal_type) \
296 .newContent(portal_type=self.order_portal_type)
297 order_line_1 = order.newContent(portal_type=self.order_line_portal_type)
298 order_line_2 = order.newContent(portal_type=self.order_line_portal_type)
299
300 delivery_1 = self.portal.getDefaultModule(self.delivery_portal_type) \
301 .newContent(portal_type=self.delivery_portal_type)
302 delivery_1_line = delivery_1.newContent(portal_type=self.delivery_line_portal_type)
303
304 delivery_2 = self.portal.getDefaultModule(self.delivery_portal_type) \
305 .newContent(portal_type=self.delivery_portal_type)
306 delivery_2_line = delivery_2.newContent(portal_type=self.delivery_line_portal_type)
307
308 applied_rule = self.portal.portal_simulation.newContent(
309 portal_type='Applied Rule',
310 causality_value = order
311 )
312 order_movement_list = (
313 applied_rule.newContent(
314 portal_type='Simulation Movement',
315 order_value = order_line_1,
316 delivery_value = delivery_1_line),
317 applied_rule.newContent(
318 portal_type='Simulation Movement',
319 order_value = order_line_2,
320 delivery_value = delivery_2_line),
321 )
322
323 movement_list = [
324 q.newContent(portal_type='Applied Rule') \
325 .newContent(portal_type='Simulation Movement') \
326 for q in order_movement_list
327 ]
328
329 self.builder.newContent(
330 portal_type='Delivery Causality Assignment Movement Group',
331 collect_order_group='delivery')
332
333 movement_group_node = self.builder.collectMovement(movement_list)
334 group_list = movement_group_node.getGroupList()
335
336 self.assertEquals(1, len(group_list))
337 self.assertEquals(dict(causality_list=[delivery_1.getRelativeUrl(),
338 delivery_2.getRelativeUrl()]),
339 group_list[0].getGroupEditDict())
340
341 class TestDuplicatedKeyRaiseException(MovementGroupTestCase):
342 """Test, that it is not allowed to have more than one movement group to update
343 same key during building process"""
344 document_portal_type = 'Sale Order'
345 def test(self):
346 order = self.portal.getDefaultModule(self.document_portal_type) \
347 .newContent(portal_type=self.document_portal_type)
348 applied_rule = self.portal.portal_simulation.newContent(
349 portal_type='Applied Rule',
350 causality_value = order
351 )
352
353 movement_list = (
354 applied_rule.newContent(portal_type='Simulation Movement'),
355 applied_rule.newContent(portal_type='Simulation Movement')
356 )
357
358 self.builder.newContent(
359 portal_type='Order Movement Group',
360 collect_order_group='delivery')
361
362 self.builder.newContent(
363 portal_type='Order Movement Group',
364 collect_order_group='delivery')
365
366 movement_relative_url_list = [q.getRelativeUrl() for q in movement_list]
367 self.assertRaises(
368 DuplicatedPropertyDictKeysError,
369 self.builder.build,
370 movement_relative_url_list = movement_relative_url_list
371 )
372
373 class TestCategoryMovementGroup(MovementGroupTestCase):
374 def test_category_movement_group_grouping(self):
375 movement_list = ( self.folder.newContent(
376 temp_object=1,
377 portal_type='Simulation Movement',
378 source='1'),
379 self.folder.newContent(
380 temp_object=1,
381 portal_type='Simulation Movement',
382 source='1'))
383 self.builder.newContent(
384 portal_type='Category Movement Group',
385 collect_order_group='delivery',
386 tested_property_list=('source',))
387 movement_group_node = self.builder.collectMovement(movement_list)
388 group_list = movement_group_node.getGroupList()
389 self.assertEquals(1, len(group_list))
390 self.assertEquals(dict(source_list=['1']),
391 group_list[0].getGroupEditDict())
392
393 def test_category_movement_group_separating(self):
394 movement_list = ( self.folder.newContent(
395 temp_object=1,
396 portal_type='Simulation Movement',
397 source='1'),
398 self.folder.newContent(
399 temp_object=1,
400 portal_type='Simulation Movement',
401 source='2'))
402 self.builder.newContent(
403 portal_type='Category Movement Group',
404 collect_order_group='delivery',
405 tested_property_list=('source',))
406 movement_group_node = self.builder.collectMovement(movement_list)
407 group_list = movement_group_node.getGroupList()
408 self.assertEquals(2, len(group_list))
409 self.assertEquals(1, len([group for group in group_list if
410 group.getGroupEditDict() == dict(source_list=['1'])]))
411 self.assertEquals(1, len([group for group in group_list if
412 group.getGroupEditDict() == dict(source_list=['2'])]))
413
414 def test_category_movement_group_and_separating(self):
415 movement_list = ( self.folder.newContent(
416 temp_object=1,
417 portal_type='Simulation Movement',
418 destination='A',
419 source='1'),
420 self.folder.newContent(
421 temp_object=1,
422 destination='A',
423 portal_type='Simulation Movement',
424 source='2'))
425 self.builder.newContent(
426 portal_type='Category Movement Group',
427 collect_order_group='delivery',
428 tested_property_list=('destination', 'source'))
429 movement_group_node = self.builder.collectMovement(movement_list)
430 group_list = movement_group_node.getGroupList()
431 self.assertEquals(2, len(group_list))
432 self.assertEquals(1, len([group for group in group_list if
433 group.getGroupEditDict() == dict(destination_list=['A'],
434 source_list=['1'])]))
435 self.assertEquals(1, len([group for group in group_list if
436 group.getGroupEditDict() == dict(destination_list=['A'],
437 source_list=['2'])]))
438
439
440 class TestMovementGroupCommonAPI(MovementGroupTestCase):
441
442 def test_separateMethod(self):
443 """Make sure that _separate method works if argument is an empty list."""
444 import Products.ERP5Type.Document
445 for name in Products.ERP5Type.Document.__dict__:
446 if name[0].isupper() and name.endswith('MovementGroup'):
447 module = getattr(Products.ERP5Type.Document, name)
448 class_ = getattr(module, name)
449 instance = class_('dummy')
450 self.assertEqual(instance._separate([]), [])
451
452
453 def test_suite():
454 suite = unittest.TestSuite()
455 suite.addTest(unittest.makeSuite(TestPropertyMovementGroup))
456 suite.addTest(unittest.makeSuite(TestPropertyAssignmentMovementGroup))
457 suite.addTest(unittest.makeSuite(TestOrderMovementGroup))
458 suite.addTest(unittest.makeSuite(TestOrderMovementGroupDelivery))
459 suite.addTest(unittest.makeSuite(TestDeliveryCausalityAssignmentMovementGroup))
460 suite.addTest(unittest.makeSuite(TestDuplicatedKeyRaiseException))
461 suite.addTest(unittest.makeSuite(TestCategoryMovementGroup))
462 suite.addTest(unittest.makeSuite(TestMovementGroupCommonAPI))
463 return suite

  ViewVC Help
Powered by ViewVC 1.1.2