[Erp5-report] r28099 - /erp5/trunk/products/ERP5/tests/testBPMCore.py

nobody at svn.erp5.org nobody at svn.erp5.org
Thu Jul 16 17:55:27 CEST 2009


Author: luke
Date: Thu Jul 16 17:55:27 2009
New Revision: 28099

URL: http://svn.erp5.org?rev=28099&view=rev
Log:
 - implement test for isBuildable method on Business Path and Simulation Movement, marked as todo
 - allow to pass **kw to document creation methods

Modified:
    erp5/trunk/products/ERP5/tests/testBPMCore.py

Modified: erp5/trunk/products/ERP5/tests/testBPMCore.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/tests/testBPMCore.py?rev=28099&r1=28098&r2=28099&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/tests/testBPMCore.py [utf8] (original)
+++ erp5/trunk/products/ERP5/tests/testBPMCore.py [utf8] Thu Jul 16 17:55:27 2009
@@ -35,7 +35,7 @@
 from DateTime import DateTime
 
 from Products.CMFCore.utils import getToolByName
-from Products.ERP5Type.tests.utils import reindex
+from Products.ERP5Type.tests.utils import reindex, todo_erp5
 
 class TestBPMMixin(ERP5TypeTestCase):
   """Skeletons for tests which depend on BPM"""
@@ -79,21 +79,19 @@
     return module.newContent(portal_type=self.business_process_portal_type)
 
   @reindex
-  def createBusinessPath(self, business_process=None):
+  def createBusinessPath(self, business_process=None, **kw):
     if business_process is None:
-      business_process = self.portal.business_process_module.newContent(
-        portal_type=self.business_process_portal_type)
+      business_process = self.createBusinessProcess()
     business_path = business_process.newContent(
-      portal_type=self.business_path_portal_type)
+      portal_type=self.business_path_portal_type, **kw)
     return business_path
 
   @reindex
-  def createBusinessState(self, business_process=None):
+  def createBusinessState(self, business_process=None, **kw):
     if business_process is None:
-      business_process = self.portal.business_process_module.newContent(
-                           portal_type=self.business_process_portal_type)
+      business_process = self.createBusinessProcess()
     business_path = business_process.newContent(
-        portal_type=self.business_state_portal_type)
+        portal_type=self.business_state_portal_type, **kw)
     return business_path
 
   def createMovement(self):
@@ -595,7 +593,159 @@
     self.assertEquals(business_path_d_e.getExpectedStartDate(mock), DateTime('2009/04/08 GMT+9'))
     self.assertEquals(business_path_d_e.getExpectedStopDate(mock), DateTime('2009/04/12 GMT+9'))
 
+class TestBPMisBuildableImplementation(TestBPMMixin):
+
+  order_portal_type = 'Sale Order'
+  order_line_portal_type = 'Sale Order Line'
+  delivery_portal_type = 'Sale Packing List'
+  delivery_line_portal_type = 'Sale Packing List Line'
+
+  @todo_erp5
+  def test_isBuildable(self):
+    """Test isBuildable implementation for Business Paths and Simulation Movements"""
+
+    # disable interactions in workflow methods to do not have side effects and
+    # to increase readability of assertions and code
+    # FIXME:
+    #  * do it non destructive way
+    #  * trim list
+    #  * or do it other way
+    for workflow_id in (
+        'delivery_causality_interaction_workflow',
+        'delivery_causality_workflow',
+        'delivery_movement_causality_interaction_workflow',
+        'delivery_movement_simulation_interaction_workflow',
+        'delivery_simulation_interaction_workflow',
+        'order_movement_simulation_interaction_workflow',
+        'order_simulation_interaction_workflow',
+        'order_workflow',
+        'packing_list_workflow',
+      ):
+      workflow = getattr(self.portal.portal_workflow, workflow_id)
+      for script in workflow.scripts.objectValues():
+        script.write('return')
+    transaction.commit()
+
+    # simple business process preparation
+    business_process = self.createBusinessProcess()
+    first_state = self.createBusinessState(business_process)
+    middle_state = self.createBusinessState(business_process)
+    last_state = self.createBusinessState(business_process)
+
+    # path which is completed, as soon as related simulation movements are in
+    # proper state
+    delivery_path = self.createBusinessPath(business_process,
+        predecessor_value = first_state, successor_value = middle_state,
+        trade_phase='default/delivery', completed_state_list = ['confirmed'])
+
+    invoice_path = self.createBusinessPath(business_process,
+        predecessor_value = middle_state, successor_value = last_state,
+        trade_phase='default/invoicing')
+
+    # create order and order line to have starting point for business process
+    order = self.portal.getDefaultModule(
+        portal_type=self.order_portal_type).newContent(
+            portal_type=self.order_portal_type)
+    order_line = order.newContent(portal_type=self.order_line_portal_type)
+
+    # first level rule with simulation movement
+    applied_rule = self.portal.portal_simulation.newContent(
+        portal_type='Applied Rule', causality_value=order)
+
+    simulation_movement = applied_rule.newContent(
+      portal_type = 'Simulation Movement',
+      order_value = order_line,
+      causality_value = delivery_path
+    )
+
+    # second level rule with simulation movement
+    invoicing_rule = simulation_movement.newContent(
+        portal_type='Applied Rule')
+    invoicing_simulation_movement = invoicing_rule.newContent(
+        portal_type='Simulation Movement', causality_value = invoice_path)
+
+    # split simulation movement for first level applied rule
+    split_simulation_movement = applied_rule.newContent(
+      portal_type = 'Simulation Movement', order_value = order_line,
+      causality_value = delivery_path)
+
+    # second level rule with simulation movement for split parent movement
+    split_invoicing_rule = split_simulation_movement.newContent(
+        portal_type='Applied Rule')
+    split_invoicing_simulation_movement = split_invoicing_rule.newContent(
+        portal_type='Simulation Movement', causality_value = invoice_path)
+
+    self.stepTic()
+
+    # in the beginning only order related movements shall be buildable
+    self.assertEquals(delivery_path.isBuildable(order), True)
+    self.assertEquals(simulation_movement.isBuildable(), True)
+    self.assertEquals(split_simulation_movement.isBuildable(), True)
+
+    self.assertEquals(invoice_path.isBuildable(order), False)
+    self.assertEquals(invoicing_simulation_movement.isBuildable(), False)
+    self.assertEquals(split_invoicing_simulation_movement.isBuildable(),
+        False)
+
+    # add delivery
+    delivery = self.portal.getDefaultModule(
+        portal_type=self.delivery_portal_type).newContent(
+            portal_type=self.delivery_portal_type, causality_value = order)
+    delivery_line = delivery.newContent(
+        portal_type=self.delivery_line_portal_type)
+
+    # relate not split movement with delivery (deliver it)
+    simulation_movement.edit(delivery_value = delivery_line)
+
+    self.stepTic()
+
+    # delivery_path (for order) is still buildable, as split movement is not
+    # delivered yet
+    #
+    # invoice_path is not yet buildable, delivery is in inproper simulation state
+    #
+    # delivery_path (for delivery) is not buildable - delivery is already
+    # built for those movements
+    self.assertEquals(delivery_path.isBuildable(order), True)
+    self.assertEquals(split_simulation_movement.isBuildable(), True)
+
+    self.assertEquals(delivery_path.isBuildable(delivery), False)
+    self.assertEquals(invoice_path.isBuildable(delivery), False)
+    self.assertEquals(simulation_movement.isBuildable(), False)
+    self.assertEquals(invoicing_simulation_movement.isBuildable(), False)
+    self.assertEquals(invoice_path.isBuildable(order), False)
+    self.assertEquals(split_invoicing_simulation_movement.isBuildable(),
+        False)
+
+    # put delivery in simulation state configured on path (and this state is
+    # available directly on movements)
+    delivery.plan()
+    delivery.confirm()
+
+    self.assertEqual('confirmed', delivery.getSimulationState())
+
+    self.stepTic()
+
+    # delivery_path (for order) is still buildable, as split movement is not
+    # delivered yet
+    #
+    # invoicing_path (for delivery and order) buildable - in case of order,
+    # because part of tree is buildable
+    #
+    # split movement for invoicing is not buildable - no proper delivery
+    # related for previous path
+    self.assertEquals(delivery_path.isBuildable(order), True)
+    self.assertEquals(invoicing_simulation_movement.isBuildable(), True)
+    self.assertEquals(invoice_path.isBuildable(delivery), True)
+    self.assertEquals(invoice_path.isBuildable(order), True)
+
+    self.assertEquals(delivery_path.isBuildable(delivery), False)
+    self.assertEquals(simulation_movement.isBuildable(), False)
+    self.assertEquals(split_invoicing_simulation_movement.isBuildable(),
+        False)
+
 def test_suite():
   suite = unittest.TestSuite()
   suite.addTest(unittest.makeSuite(TestBPMImplementation))
+  suite.addTest(unittest.makeSuite(TestBPMisBuildableImplementation))
   return suite




More information about the Erp5-report mailing list