From cc4d52b4a2cdbac42771b33ea33bc118a5b99103 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?C=C3=A9dric=20Le=20Ninivin?= <cedric.leninivin@tiolive.com>
Date: Wed, 8 Apr 2020 11:31:17 +0200
Subject: [PATCH] testPackingList: Check Simulation can be expand once frozen
 after Split

* Check that frozen Simulation from a Split and Defer can be expanded

testPackingList: test_11_01 Check Expand is stable
---
 product/ERP5/tests/testPackingList.py | 92 +++++++++++++++++++++++++++
 1 file changed, 92 insertions(+)

diff --git a/product/ERP5/tests/testPackingList.py b/product/ERP5/tests/testPackingList.py
index dbb5b09d7a..3a284ad664 100644
--- a/product/ERP5/tests/testPackingList.py
+++ b/product/ERP5/tests/testPackingList.py
@@ -26,6 +26,7 @@
 #
 ##############################################################################
 
+from collections import deque
 import unittest
 
 from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
@@ -36,6 +37,15 @@ from Products.ERP5Type.tests.Sequence import SequenceList
 from Products.ERP5.tests.testOrder import TestOrderMixin
 from DateTime import DateTime
 
+def getTree(self):
+  tree = []
+  object_list = deque((self,))
+  while object_list:
+    self = object_list.popleft()
+    tree.append(self)
+    object_list += self.objectValues()
+  return tree
+
 class TestPackingListMixin(TestOrderMixin):
   """
     Test business template erp5_trade
@@ -1504,6 +1514,88 @@ class TestPackingList(TestPackingListMixin, ERP5TypeTestCase) :
     sequence_list.play(self, quiet=quiet)
 
 
+  def stepDeliverPackingList(self, sequence=None, sequence_list=None, **kw):
+    """
+      Deliver Packing List
+    """
+    packing_list = sequence.get('packing_list')
+    packing_list.stop()
+    packing_list.deliver()
+
+  def stepDeliverNewPackingList(self, sequence=None, sequence_list=None, **kw):
+    """
+      Deliver New Packing List
+    """
+    packing_list = sequence.get('new_packing_list')
+    packing_list.stop()
+    packing_list.deliver()
+
+  def stepCheckExpandOrderRootAppliedRuleIsStable(self, sequence=None, sequence_list=None, **kw):
+    """
+      Check Order Applied Rule can be expanded without error
+    """
+    order = sequence.get('order')
+    related_applied_rule_list = order.getCausalityRelatedValueList( \
+                                  portal_type=self.applied_rule_portal_type)
+    applied_rule = related_applied_rule_list[0].getObject()
+    before = set(getTree(applied_rule))
+    applied_rule.expand("immediate")
+    after = getTree(applied_rule)
+    self.assertTrue(before.issubset(after))
+    for element in after:
+      if element in before:
+        if (element.getPortalType() == 'Simulation Movement' and
+            element.getDelivery() and
+            element.getParentValue().getSpecialiseValue().getPortalType()
+            != 'Order Root Simulation Rule'):
+          self.assertFalse(element.getDivergenceList())
+      else:
+        if element.getPortalType() == 'Simulation Movement':
+          element = element.getParentValue()
+          self.assertNotIn(element, before)
+
+  def test_11_02_PackingListDecreaseTwoTimesQuantityAndUpdateDeliveryAndDeliver(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.
+      Deliver Packing Lists and make sure the root can be expanded
+    """
+    if not run: return
+    sequence_list = SequenceList()
+
+    sequence_string = self.default_sequence + """
+        DecreasePackingListLineQuantity
+        CheckPackingListIsCalculating
+        Tic
+        CheckPackingListIsDiverged
+        SplitAndDeferPackingList
+        Tic
+        CheckPackingListIsSolved
+        CheckPackingListSplitted
+        DecreasePackingListLineQuantity
+        CheckPackingListIsCalculating
+        Tic
+        CheckPackingListIsDiverged
+        SplitAndDeferPackingList
+        Tic
+        CheckNewPackingListIsDivergent
+        NewPackingListAdoptPrevisionQuantity
+        Tic
+        CheckPackingListIsSolved
+        CheckNewPackingListIsSolved
+        CheckPackingListSplittedTwoTimes
+        DeliverPackingList
+        DeliverNewPackingList
+        Tic
+        CheckExpandOrderRootAppliedRuleIsStable
+        """
+    sequence_list.addSequenceString(sequence_string)
+
+    sequence_list.play(self, quiet=quiet)
+
+
   def stepSplitAndMovePackingList(self, sequence=None, sequence_list=None, **kw):
     """
       Do the split and move to another delivery action
-- 
2.30.9