[Erp5-report] r28786 - /erp5/trunk/products/ERP5/tests/testBPMEvaluation.py

nobody at svn.erp5.org nobody at svn.erp5.org
Thu Sep 3 15:24:11 CEST 2009


Author: luke
Date: Thu Sep  3 15:24:10 2009
New Revision: 28786

URL: http://svn.erp5.org?rev=28786&view=rev
Log:
 - implement test for new divergence solving (accept, accept with force, adopt and split)

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

Modified: erp5/trunk/products/ERP5/tests/testBPMEvaluation.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/tests/testBPMEvaluation.py?rev=28786&r1=28785&r2=28786&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/tests/testBPMEvaluation.py [utf8] (original)
+++ erp5/trunk/products/ERP5/tests/testBPMEvaluation.py [utf8] Thu Sep  3 15:24:10 2009
@@ -40,6 +40,8 @@
 import transaction
 
 from Products.ERP5.tests.testBPMCore import TestBPMMixin
+from Products.ERP5.DivergenceSolutionDecision import DivergenceSolutionDecision
+
 from DateTime import DateTime
 
 class TestBPMEvaluationMixin(TestBPMMixin):
@@ -348,7 +350,8 @@
 
 class TestBPMEvaluationDefaultProcessMixin:
   def _createBusinessProcess(self):
-    self.business_process = self.createBusinessProcess(title=self.id())
+    self.business_process = self.createBusinessProcess(title=self.id(),
+        referential_date='start_date')
     self._createBusinessStateList()
 
     self.delivery_path = self.createBusinessPath(self.business_process,
@@ -387,7 +390,8 @@
 
 class TestBPMEvaluationDifferentProcessMixin:
   def _createBusinessProcess(self):
-    self.business_process = self.createBusinessProcess(title=self.id())
+    self.business_process = self.createBusinessProcess(title=self.id(),
+        referential_date='start_date')
     self._createBusinessStateList()
 
     self.invoice_path = self.createBusinessPath(self.business_process,
@@ -701,6 +705,190 @@
         portal_type='Applied Rule').getPortalType()
     )
 
+class TestDivergenceSolving(TestBPMEvaluationMixin,
+    TestBPMEvaluationDefaultProcessMixin):
+  # FIXME: make it more generic:
+  #  * use erp5_dummy_movement
+  #  * use dummy Rule class
+  #  * do manual reexpanding
+  root_document_portal_type = 'Sale Order'
+  root_document_line_portal_type = 'Sale Order Line'
+  root_rule_portal_type = 'Order Rule'
+
+  quantity = 10
+  price = 5
+  new_quantity = 9
+
+  def afterSetUp(self):
+    TestBPMEvaluationMixin.afterSetUp(self)
+
+    self.order_line = self._createRootDocumentLine(
+      resource_value = self._createProduct(), quantity = self.quantity,
+      price = self.price)
+
+    self.stepTic()
+
+    self.root_document.confirm()
+    self.stepTic()
+    self._checkBPMSimulation()
+    self.assertEqual(
+      2,
+      len(self.root_document.getCausalityRelatedList())
+    )
+    self.assertEqual(
+      'Applied Rule',
+      self.root_document.getCausalityRelatedValue(
+        portal_type='Applied Rule').getPortalType()
+    )
+
+    self.assertEqual(
+      self.packing_list_portal_type,
+      self.root_document.getCausalityRelatedValue(
+        portal_type=self.packing_list_portal_type).getPortalType()
+    )
+    self.packing_list = self.root_document.getCausalityRelatedValue(
+        portal_type=self.packing_list_portal_type)
+    self.movement = self.packing_list.getMovementList()[0]
+    self.simulation_movement = self.movement.getDeliveryRelatedValue()
+
+    # change quantity on movement
+    self.movement.edit(quantity = self.new_quantity)
+    self.stepTic()
+
+    self.assertEqual('diverged', self.packing_list.getCausalityState())
+    self.assertEqual(self.quantity,
+        self.simulation_movement.getQuantity())
+    self.assertEqual(self.new_quantity, self.movement.getQuantity())
+
+    divergence_list = self.movement.getDivergenceList()
+
+    self.assertEqual(1, len(divergence_list))
+
+    self.divergence = divergence_list[0]
+
+    self.assertEqual('quantity', self.divergence.divergence_scope)
+    self.assertEqual(self.new_quantity, self.divergence.decision_value)
+    self.assertEqual(self.quantity, self.divergence.prevision_value)
+    self.assertEqual(self.simulation_movement,
+        self.divergence.simulation_movement)
+
+  def test_divergence_adopt(self):
+    decision = DivergenceSolutionDecision(self.divergence, 'adopt')
+    self.movement.solve([decision])
+    transaction.commit()
+
+    self.assertEqual(self.quantity, self.simulation_movement.getQuantity())
+    self.assertEqual(self.quantity, self.movement.getQuantity())
+
+    simulation_movement_solution_history_list = self.simulation_movement \
+        .divergence_solution_history['quantity']
+    self.assertEqual(1, len(simulation_movement_solution_history_list))
+    simulation_movement_solution \
+        = simulation_movement_solution_history_list[0]
+
+    self.assertEqual(decision, simulation_movement_solution)
+
+    # reexpand
+    self.packing_list.Delivery_updateAppliedRule()
+    transaction.commit()
+    self.tic()
+    self.assertEqual(self.quantity, self.simulation_movement.getQuantity())
+    self.assertEqual('solved', self.packing_list.getCausalityState())
+
+  def test_divergence_accept(self):
+    decision = DivergenceSolutionDecision(self.divergence, 'accept',
+        'Distribute', 'CopyAndPropagate')
+    self.movement.solve([decision])
+    transaction.commit()
+
+    self.assertEqual(self.new_quantity,
+        self.simulation_movement.getQuantity())
+    self.assertEqual(self.new_quantity, self.movement.getQuantity())
+
+    simulation_movement_solution_history_list = self.simulation_movement \
+        .divergence_solution_history['quantity']
+    self.assertEqual(1, len(simulation_movement_solution_history_list))
+    simulation_movement_solution \
+        = simulation_movement_solution_history_list[0]
+
+    self.assertEqual(decision, simulation_movement_solution)
+
+    # reexpand
+    self.packing_list.Delivery_updateAppliedRule()
+    transaction.commit()
+    self.tic()
+    # property is not forced - so change after expand
+    self.assertEqual(self.quantity, self.simulation_movement.getQuantity())
+    self.assertEqual('diverged', self.packing_list.getCausalityState())
+
+  def test_divergence_accept_force(self):
+    decision = DivergenceSolutionDecision(self.divergence, 'accept',
+        'Distribute', 'CopyAndPropagate', True)
+    self.movement.solve([decision])
+    transaction.commit()
+
+    self.assertEqual(self.new_quantity,
+        self.simulation_movement.getQuantity())
+    self.assertEqual(self.new_quantity, self.movement.getQuantity())
+
+    simulation_movement_solution_history_list = self.simulation_movement \
+        .divergence_solution_history['quantity']
+    self.assertEqual(1, len(simulation_movement_solution_history_list))
+    simulation_movement_solution \
+        = simulation_movement_solution_history_list[0]
+
+    self.assertEqual(decision, simulation_movement_solution)
+
+    # reexpand
+    self.packing_list.Delivery_updateAppliedRule()
+    transaction.commit()
+    self.tic()
+    # property is forced - so no change after expand
+    self.assertEqual(self.new_quantity,
+        self.simulation_movement.getQuantity())
+    self.assertEqual('solved', self.packing_list.getCausalityState())
+
+  def test_divergence_split(self):
+    split_kw = {}
+    split_kw.update(start_date = DateTime(), stop_date = DateTime())
+    decision = DivergenceSolutionDecision(self.divergence, 'split', None,
+        'SplitAndDefer', split_kw = split_kw)
+    self.movement.solve([decision])
+    transaction.commit()
+
+    self.assertEqual(self.new_quantity,
+        self.simulation_movement.getQuantity())
+    self.assertEqual(self.new_quantity, self.movement.getQuantity())
+
+    simulation_movement_solution_history_list = self.simulation_movement \
+        .divergence_solution_history['quantity']
+    self.assertEqual(1, len(simulation_movement_solution_history_list))
+    simulation_movement_solution \
+        = simulation_movement_solution_history_list[0]
+
+    self.assertEqual(decision, simulation_movement_solution)
+
+    new_simulation_movement_list = [simulation_movement \
+        for simulation_movement \
+        in self.simulation_movement.getParentValue().contentValues(
+          portal_type='Simulation Movement') \
+        if simulation_movement != self.simulation_movement]
+    self.assertEqual(1, len(new_simulation_movement_list))
+    new_simulation_movement = new_simulation_movement_list[0]
+
+    self.assertEqual(self.quantity - self.new_quantity,
+        new_simulation_movement.getQuantity())
+
+    # reexpand
+    self.packing_list.Delivery_updateAppliedRule()
+    transaction.commit()
+    self.tic()
+    self.assertEqual(self.new_quantity,
+        self.simulation_movement.getQuantity())
+    self.assertEqual(self.quantity - self.new_quantity,
+        new_simulation_movement.getQuantity())
+    self.assertEqual('solved', self.packing_list.getCausalityState())
+
 class TestInvoiceDifferentProcess(TestInvoice,
     TestBPMEvaluationDifferentProcessMixin):
   pass
@@ -715,4 +903,5 @@
   suite.addTest(unittest.makeSuite(TestPackingListDifferentProcess))
 #  suite.addTest(unittest.makeSuite(TestInvoiceDifferentProcess))
 
+  suite.addTest(unittest.makeSuite(TestDivergenceSolving))
   return suite




More information about the Erp5-report mailing list