[Erp5-report] r22564 - /erp5/trunk/products/ERP5/tests/testOrderBuilder.py
nobody at svn.erp5.org
nobody at svn.erp5.org
Fri Jul 18 18:11:19 CEST 2008
Author: luke
Date: Fri Jul 18 18:11:18 2008
New Revision: 22564
URL: http://svn.erp5.org?rev=22564&view=rev
Log:
- added basic functionality test for Order Builder
Added:
erp5/trunk/products/ERP5/tests/testOrderBuilder.py
Added: erp5/trunk/products/ERP5/tests/testOrderBuilder.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/tests/testOrderBuilder.py?rev=22564&view=auto
==============================================================================
--- erp5/trunk/products/ERP5/tests/testOrderBuilder.py (added)
+++ erp5/trunk/products/ERP5/tests/testOrderBuilder.py Fri Jul 18 18:11:18 2008
@@ -1,0 +1,479 @@
+##############################################################################
+# -*- coding: utf8 -*-
+#
+# Copyright (c) 2008 Nexedi SARL and Contributors. All Rights Reserved.
+# Åukasz Nowak <lukasz.nowak at ventis.com.pl>
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsability of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# garantees and support are strongly adviced to contract a Free Software
+# Service Company
+#
+# This program is Free Software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+##############################################################################
+
+import unittest
+
+from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
+from zLOG import LOG
+from Products.ERP5Type.tests.Sequence import SequenceList
+from Products.CMFCore.utils import getToolByName
+
+from Products.ERP5.tests.testOrder import TestOrderMixin
+
+class TestOrderBuilderMixin(TestOrderMixin):
+
+ run_all_test = 1
+
+ order_builder_portal_type = 'Order Builder'
+
+ order_module = 'purchase_order_module'
+ order_portal_type = 'Purchase Order'
+ order_line_portal_type = 'Purchase Order Line'
+ order_cell_portal_type = 'Purchase Order Cell'
+
+ packing_list_portal_type = 'Internal Packing List'
+ packing_list_line_portal_type = 'Internal Packing List Line'
+ packing_list_cell_portal_type = 'Internal Packing List Cell'
+
+ delivery_cell_collect_order_tuple = ('VariantMovementGroup',)
+ delivery_collect_order_tuple = ('PathMovementGroup',
+ 'SectionPathMovementGroup', 'DateMovementGroup')
+ delivery_line_collect_order_tuple = ('ResourceMovementGroup',
+ 'BaseVariantMovementGroup')
+
+ # hardcoded values
+ order_builder_hardcoded_time_diff = 10.0
+
+ # defaults
+ decrease_quantity = 1.0
+ max_delay = 0.0
+ min_flow = 0.0
+
+ def stepClearActivities(self, sequence=None, sequence_list=None,
+ **kw):
+ """
+ Clear activity tables
+ """
+ activity_tool = self.getPortal().portal_activities
+ activity_tool.manageClearActivities(keep=0)
+
+ def stepSetMaxDelayOnResource(self, sequence=None, sequence_list=None,
+ **kw):
+ """
+ Sets max_delay on resource
+ """
+ resource = sequence.get('resource')
+
+ resource.edit(
+ max_delay = self.max_delay,
+ )
+
+ def stepSetMinFlowOnResource(self, sequence=None, sequence_list=None,
+ **kw):
+ """
+ Sets min_flow on resource
+ """
+ resource = sequence.get('resource')
+
+ resource.edit(
+ min_flow = self.min_flow,
+ )
+
+ def stepFillOrderBuilder(self, sequence=None, sequence_list=None,
+ **kw):
+ """
+ Fills Order Builder with proper quantites
+ """
+ order_builder = sequence.get('order_builder')
+ organisation = sequence.get('organisation')
+
+ order_builder.edit(
+ delivery_module = self.order_module,
+ delivery_portal_type = self.order_portal_type,
+ delivery_line_portal_type = self.order_line_portal_type,
+ delivery_cell_portal_type = self.order_cell_portal_type,
+
+ delivery_collect_order = self.delivery_collect_order_tuple,
+ delivery_line_collect_order = self.delivery_line_collect_order_tuple,
+ delivery_cell_collect_order = self.delivery_cell_collect_order_tuple,
+
+ destination_value = organisation,
+
+ resource_portal_type = self.resource_portal_type,
+ )
+
+ def stepCheckGeneratedDocumentListVariated(self, sequence=None, sequence_list=None,
+ **kw):
+ """
+ Checks documents generated by Order Builders with its properties for variated resource
+ """
+ # XXX: Some values still hardcoded
+ organisation = sequence.get('organisation')
+ resource = sequence.get('resource')
+
+ generated_document_list = sequence.get('generated_document_list')
+
+ self.assertEquals(
+ 1, # XXX
+ len(generated_document_list)
+ )
+
+ order = generated_document_list[0]
+
+ self.assertEquals(
+ order.getDestinationValue(),
+ organisation
+ )
+
+ self.assertEquals(
+ order.getStartDate(),
+ self.wanted_start_date
+ )
+
+ self.assertEquals(
+ order.getStopDate(),
+ self.wanted_stop_date
+ )
+
+ order_line_list = order.contentValues(filter={'portal_type':self.order_line_portal_type})
+ self.assertEquals(
+ 1, # XXX
+ len(order_line_list)
+ )
+
+ order_line = order_line_list[0] # XXX: add support for more lines and cells too
+
+ self.assertEquals(
+ order_line.getResourceValue(),
+ resource
+ )
+
+ self.assertEquals(
+ order_line.getTotalQuantity(),
+ sum(self.wanted_quantity_matrix.itervalues())
+ )
+
+ order_cell_list = order_line.contentValues(filter={'portal_type':self.order_cell_portal_type})
+ self.assertEquals(
+ len(order_cell_list),
+ len(self.wanted_quantity_matrix.itervalues())
+ )
+
+ for order_cell in order_cell_list:
+ self.assertEquals(
+ order_cell.getQuantity(),
+ self.wanted_quantity_matrix[
+ order_cell.getProperty('membership_criterion_category')
+ ]
+ )
+
+ def stepCheckGeneratedDocumentList(self, sequence=None, sequence_list=None,
+ **kw):
+ """
+ Checks documents generated by Order Builders with its properties
+ """
+ # XXX: Some values still hardcoded
+ organisation = sequence.get('organisation')
+ resource = sequence.get('resource')
+
+ generated_document_list = sequence.get('generated_document_list')
+
+ self.assertEquals(
+ 1, # XXX
+ len(generated_document_list)
+ )
+
+ order = generated_document_list[0]
+
+ self.assertEquals(
+ order.getDestinationValue(),
+ organisation
+ )
+
+ self.assertEquals(
+ order.getStartDate(),
+ self.wanted_start_date
+ )
+
+ self.assertEquals(
+ order.getStopDate(),
+ self.wanted_stop_date
+ )
+
+ order_line_list = order.contentValues(filter={'portal_type':self.order_line_portal_type})
+ self.assertEquals(
+ 1, # XXX
+ len(order_line_list)
+ )
+
+ order_line = order_line_list[0] # XXX: add support for more lines and cells too
+
+ self.assertEquals(
+ order_line.getResourceValue(),
+ resource
+ )
+
+ self.assertEquals(
+ order_line.getQuantity(),
+ self.wanted_quantity
+ )
+
+ def stepBuildOrderBuilder(self, sequence=None, sequence_list=None,
+ **kw):
+ """
+ Invokes build method for Order Builder
+ """
+ order_builder = sequence.get('order_builder')
+ generated_document_list = order_builder.build()
+ sequence.edit(generated_document_list = generated_document_list)
+
+ def stepCreateOrderBuilder(self, sequence=None, sequence_list=None,
+ **kw):
+ """
+ Creates empty Order Builder
+ """
+ portal_orders = self.portal.portal_orders
+
+ order_builder = portal_orders.newContent(
+ portal_type = self.order_builder_portal_type
+ )
+
+ sequence.edit(
+ order_builder = order_builder
+ )
+
+ def stepDecreaseOrganisationResourceQuantityVariated(self, sequence=None, sequence_list=None,
+ **kw):
+ """
+ Creates movement with variation from organisation to None.
+ Using Internal Packing List, confirms it.
+
+ Note: Maybe use InventoryAPITestCase::_makeMovement instead of IPL ?
+ """
+ organisation = sequence.get('organisation')
+ resource = sequence.get('resource')
+
+ packing_list_module = self.portal.getDefaultModule(
+ portal_type = self.packing_list_portal_type
+ )
+
+ packing_list = packing_list_module.newContent(
+ portal_type = self.packing_list_portal_type,
+ source_value = organisation,
+ start_date = self.datetime
+ )
+
+ packing_list_line = packing_list.newContent(
+ portal_type = self.packing_list_line_portal_type,
+ resource_value = resource,
+ quantity = self.decrease_quantity,
+ )
+
+ packing_list_line.setVariationCategoryList(
+ list(self.decrease_quantity_matrix.iterkeys())
+ )
+
+ get_transaction().commit()
+ self.tic()
+
+ base_id = 'movement'
+ cell_key_list = list(packing_list_line.getCellKeyList(base_id=base_id))
+ cell_key_list.sort()
+
+ for cell_key in cell_key_list:
+ cell = packing_list_line.newCell(base_id=base_id, \
+ portal_type=self.packing_list_cell_portal_type, *cell_key)
+ cell.edit(mapped_value_property_list=['price','quantity'],
+ quantity=self.decrease_quantity_matrix[cell_key[0]],
+ predicate_category_list=cell_key,
+ variation_category_list=cell_key)
+
+ packing_list.confirm()
+
+ def stepDecreaseOrganisationResourceQuantity(self, sequence=None, sequence_list=None,
+ **kw):
+ """
+ Creates movement from organisation to None.
+ Using Internal Packing List, confirms it.
+
+ Note: Maybe use InventoryAPITestCase::_makeMovement instead of IPL ?
+ """
+ organisation = sequence.get('organisation')
+ resource = sequence.get('resource')
+
+ packing_list_module = self.portal.getDefaultModule(
+ portal_type = self.packing_list_portal_type
+ )
+
+ packing_list = packing_list_module.newContent(
+ portal_type = self.packing_list_portal_type,
+ source_value = organisation,
+ start_date = self.datetime
+ )
+
+ packing_list.newContent(
+ portal_type = self.packing_list_line_portal_type,
+ resource_value = resource,
+ quantity = self.decrease_quantity,
+ )
+
+ packing_list.confirm()
+
+class TestOrderBuilder(TestOrderBuilderMixin, ERP5TypeTestCase):
+ """
+ Test Order Builder functionality
+ """
+ run_all_test = 1
+
+ common_sequence_string = '\
+ ClearActivities \
+ CreateOrganisation \
+ CreateNotVariatedResource \
+ SetMaxDelayOnResource \
+ SetMinFlowOnResource \
+ Tic \
+ DecreaseOrganisationResourceQuantity \
+ Tic \
+ CreateOrderBuilder \
+ FillOrderBuilder \
+ Tic \
+ BuildOrderBuilder \
+ Tic \
+ CheckGeneratedDocumentList \
+ '
+
+ def getTitle(self):
+ return "Order Builder"
+
+ def test_01_simpleOrderBuilder(self, quiet=0, run=run_all_test):
+ """
+ Test simple Order Builder
+ """
+ if not run: return
+
+ self.wanted_quantity = 1.0
+ self.wanted_start_date = self.datetime.earliestTime() \
+ + self.order_builder_hardcoded_time_diff
+
+ self.wanted_stop_date = self.datetime.earliestTime() \
+ + self.order_builder_hardcoded_time_diff
+
+ sequence_list = SequenceList()
+ sequence_list.addSequenceString(self.common_sequence_string)
+ sequence_list.play(self)
+
+ def test_01a_simpleOrderBuilderVariatedResource(self, quiet=0, run=run_all_test):
+ """
+ Test simple Order Builder for Variated Resource
+ """
+ if not run: return
+
+ sequence_string = '\
+ ClearActivities \
+ CreateOrganisation \
+ CreateVariatedResource \
+ SetMaxDelayOnResource \
+ SetMinFlowOnResource \
+ Tic \
+ DecreaseOrganisationResourceQuantityVariated \
+ Tic \
+ CreateOrderBuilder \
+ FillOrderBuilder \
+ Tic \
+ BuildOrderBuilder \
+ Tic \
+ CheckGeneratedDocumentListVariated \
+ '
+
+ self.wanted_quantity = 1.0
+ self.wanted_start_date = self.datetime.earliestTime() \
+ + self.order_builder_hardcoded_time_diff
+
+ self.wanted_stop_date = self.datetime.earliestTime() \
+ + self.order_builder_hardcoded_time_diff
+
+ self.decrease_quantity_matrix = {
+ 'size/Man' : 1.0,
+ 'size/Woman' : 2.0,
+ }
+
+ self.wanted_quantity_matrix = self.decrease_quantity_matrix.copy()
+
+ sequence_list = SequenceList()
+ sequence_list.addSequenceString(sequence_string)
+ sequence_list.play(self)
+
+ def test_02_maxDelayResourceOrderBuilder(self, quiet=0, run=run_all_test):
+ """
+ Test max_delay impact on generated order start date
+ """
+ if not run: return
+
+ self.max_delay = 14.0
+
+ self.wanted_quantity = 1.0
+ self.wanted_start_date = self.datetime.earliestTime() \
+ - self.max_delay \
+ + self.order_builder_hardcoded_time_diff
+
+ self.wanted_stop_date = self.datetime.earliestTime() \
+ + self.order_builder_hardcoded_time_diff
+
+ sequence_list = SequenceList()
+ sequence_list.addSequenceString(self.common_sequence_string)
+ sequence_list.play(self)
+
+ def test_03_minFlowResourceOrderBuilder(self, quiet=0, run=run_all_test):
+ """
+ Test min_flow impact on generated order line quantity
+ """
+ if not run: return
+
+ self.wanted_quantity = 1.0
+ self.wanted_start_date = self.datetime.earliestTime() \
+ + self.order_builder_hardcoded_time_diff
+
+ self.wanted_stop_date = self.datetime.earliestTime() \
+ + self.order_builder_hardcoded_time_diff
+
+ sequence_list = SequenceList()
+ sequence_list.addSequenceString(self.common_sequence_string)
+
+ # case when min_flow > decreased_quantity
+ self.min_flow = 144.0
+ self.wanted_quantity = self.min_flow + self.decrease_quantity
+ # why to order more than needed?
+ # self.wanted_quantity = self.min_flow
+
+ sequence_list.play(self)
+
+ # case when min_flow < decreased_quantity
+ self.min_flow = 15.0
+ self.decrease_quantity = 20.0
+
+ self.wanted_quantity = self.min_flow + self.decrease_quantity
+ # why to order more than needed?
+ # self.wanted_quantity = self.decreased_quantity
+
+ sequence_list.play(self)
+
+def test_suite():
+ suite = unittest.TestSuite()
+ suite.addTest(unittest.makeSuite(TestOrderBuilder))
+ return suite
More information about the Erp5-report
mailing list