[Erp5-report] r31396 kazuhiko - /erp5/trunk/products/ERP5/tests/testERP5Simulation.py

nobody at svn.erp5.org nobody at svn.erp5.org
Fri Dec 18 15:41:30 CET 2009


Author: kazuhiko
Date: Fri Dec 18 15:41:30 2009
New Revision: 31396

URL: http://svn.erp5.org?rev=31396&view=rev
Log:
create a simple test class that will check new simulation API.

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

Modified: erp5/trunk/products/ERP5/tests/testERP5Simulation.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/tests/testERP5Simulation.py?rev=31396&r1=31395&r2=31396&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/tests/testERP5Simulation.py [utf8] (original)
+++ erp5/trunk/products/ERP5/tests/testERP5Simulation.py [utf8] Fri Dec 18 15:41:30 2009
@@ -32,6 +32,8 @@
 import unittest
 import transaction
 
+from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
+from Products.ERP5Type.tests.Sequence import SequenceList
 from testPackingList import TestPackingList, TestPackingListMixin
 
 class TestERP5SimulationMixin(TestPackingListMixin):
@@ -49,6 +51,160 @@
       if rule.getValidationState() == 'validated':
         rule.invalidate()
 
+class TestERP5Simulation(TestERP5SimulationMixin, ERP5TypeTestCase):
+  run_all_test = 1
+  quiet = 0
+
+  def validateNewRules(self):
+    # create a New Order Rule document.
+    portal_rules = self.portal.portal_rules
+    try:
+      new_order_rule = filter(
+        lambda x:x.title == 'New Default Order Rule',
+        portal_rules.objectValues(portal_type='New Order Rule'))[0]
+    except IndexError:
+      new_order_rule = portal_rules.newContent(
+        title='New Default Order Rule',
+        portal_type='New Order Rule',
+        reference='default_order_rule',
+        version=2,
+        )
+      # create category divergence testers that is only used for matching
+      for i in ('order',):
+        new_order_rule.newContent(
+          title='%s divergence tester' % i,
+          portal_type='Category Membership Divergence Tester',
+          tested_property=i,
+          divergence_provider=0,
+          matching_provider=1)
+      # create float divergence testers
+      for i in ('converted_quantity',):
+        new_order_rule.newContent(
+          title='%s divergence tester' % i,
+          portal_type='Float Divergence Tester',
+          tested_property=i,
+          use_delivery_ratio=1,
+          quantity_range_min=-1,
+          quantity_range_max=2)
+    if new_order_rule.getValidationState() != 'validated':
+      new_order_rule.validate()
+
+  def _modifyPackingListLineQuantity(self, sequence=None,
+      sequence_list=None, delta=0.0):
+    """
+    Set a increased quantity on packing list lines
+    """
+    packing_list = sequence.get('packing_list')
+    quantity = self.default_quantity + delta
+    sequence.edit(line_quantity=quantity)
+    for packing_list_line in packing_list.objectValues(
+        portal_type=self.packing_list_line_portal_type):
+      packing_list_line.edit(quantity=quantity)
+    sequence.edit(last_delta=delta)
+
+  def stepIncreasePackingListLineQuantity2(self, sequence=None,
+      sequence_list=None, **kw):
+    return self._modifyPackingListLineQuantity(sequence, sequence_list, 2.0)
+
+  def stepDecreasePackingListLineQuantity1(self, sequence=None,
+      sequence_list=None, **kw):
+    return self._modifyPackingListLineQuantity(sequence, sequence_list, -1.0)
+
+  def stepDecreasePackingListLineQuantity10(self, sequence=None,
+      sequence_list=None, **kw):
+    return self._modifyPackingListLineQuantity(sequence, sequence_list, -10.0)
+
+  def stepSplitAndDeferPackingList(self, sequence=None, sequence_list=None, **kw):
+    """
+      Do the split and defer action
+    """
+    packing_list = sequence.get('packing_list')
+    solver_tool = self.portal.portal_solvers
+    solver_process = solver_tool.newSolverProcess(packing_list)
+    quantity_solver_decision = filter(
+      lambda x:x.getCausalityValue().getTestedProperty()=='converted_quantity',
+      solver_process.contentValues())[0]
+    # use Quantity Split Solver.
+    quantity_solver_decision.setSolverValue(self.portal.portal_types['Quantity Split Solver'])
+    # configure for Quantity Split Solver.
+    kw = {'delivery_solver':'FIFO',
+          'start_date':packing_list.getStartDate() + 10}
+    quantity_solver_decision.updateConfiguration(**kw)
+    solver_process.buildTargetSolverList()
+    solver_process.solve()
+    # build split deliveries manually. XXX ad-hoc
+    previous_tag = None
+    for delivery_builder in packing_list.getBuilderList():
+      this_builder_tag = '%s_split_%s' % (packing_list.getPath(),
+                                          delivery_builder.getId())
+      after_tag = []
+      if previous_tag:
+        after_tag.append(previous_tag)
+      delivery_builder.activate(
+        after_method_id=('solve',
+                         'immediateReindexObject',
+                         'recursiveImmediateReindexObject',), # XXX too brutal.
+        after_tag=after_tag,
+        ).build(explanation_uid=packing_list.getCausalityValue().getUid())
+
+  def stepCheckPackingListSplitted(self, sequence=None, sequence_list=None, **kw):
+    """
+      Test if packing list was splitted
+    """
+    order = sequence.get('order')
+    packing_list_list = order.getCausalityRelatedValueList(
+                               portal_type=self.packing_list_portal_type)
+    self.assertEquals(2,len(packing_list_list))
+    packing_list1 = None
+    packing_list2 = None
+    for packing_list in packing_list_list:
+      if packing_list.getUid() == sequence.get('packing_list').getUid():
+        packing_list1 = packing_list
+      else:
+        packing_list2 = packing_list
+    sequence.edit(new_packing_list=packing_list2)
+    for line in packing_list1.objectValues(
+          portal_type= self.packing_list_line_portal_type):
+      self.assertEquals(self.default_quantity-10,line.getQuantity())
+    for line in packing_list2.objectValues(
+          portal_type= self.packing_list_line_portal_type):
+      self.assertEquals(10,line.getQuantity())
+
+  def test_01_splitAndDefer(self, quiet=quiet, run=run_all_test):
+    """
+      Change the quantity on an delivery line, then
+      see if the packing list is divergent and then
+      split and defer the packing list
+    """
+    if not run: return
+    sequence_list = SequenceList()
+
+    # Test with a simply order without cell
+    sequence_string = self.default_sequence + '\
+                      stepIncreasePackingListLineQuantity2 \
+                      stepCheckPackingListIsCalculating \
+                      stepTic \
+                      stepCheckPackingListIsNotDivergent \
+                      stepCheckPackingListIsSolved \
+                      stepDecreasePackingListLineQuantity1 \
+                      stepCheckPackingListIsCalculating \
+                      stepTic \
+                      stepCheckPackingListIsNotDivergent \
+                      stepCheckPackingListIsSolved \
+                      stepDecreasePackingListLineQuantity10 \
+                      stepCheckPackingListIsCalculating \
+                      stepTic \
+                      stepCheckPackingListIsDiverged \
+                      stepSplitAndDeferPackingList \
+                      stepTic \
+                      stepCheckPackingListSplitted \
+                      stepCheckPackingListIsSolved \
+                      '
+    sequence_list.addSequenceString(sequence_string)
+
+    sequence_list.play(self, quiet=quiet)
+
+class TestERP5SimulationPackingList(TestERP5SimulationMixin, TestPackingList):
   def validateNewRules(self):
     # create a New Order Rule document.
     portal_rules = self.portal.portal_rules
@@ -124,7 +280,6 @@
     if new_order_rule.getValidationState() != 'validated':
       new_order_rule.validate()
 
-class TestERP5Simulation(TestERP5SimulationMixin, TestPackingList):
   def stepAcceptDecisionQuantity(self,sequence=None, sequence_list=None, **kw):
     """
     Solve quantity divergence by using solver tool.
@@ -195,4 +350,5 @@
 def test_suite():
   suite = unittest.TestSuite()
   suite.addTest(unittest.makeSuite(TestERP5Simulation))
+  suite.addTest(unittest.makeSuite(TestERP5SimulationPackingList))
   return suite




More information about the Erp5-report mailing list