[Erp5-report] r44492 seb - /erp5/trunk/products/ERP5/tests/testBPMCore.py
nobody at svn.erp5.org
nobody at svn.erp5.org
Tue Mar 22 10:07:15 CET 2011
Author: seb
Date: Tue Mar 22 10:07:15 2011
New Revision: 44492
URL: http://svn.erp5.org?rev=44492&view=rev
Log:
* make the test checking expected start and stop date working
with new simulation
* simplify this test, it will be needed to extend it once
more complex cases can be handled by the code
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=44492&r1=44491&r2=44492&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/tests/testBPMCore.py [utf8] (original)
+++ erp5/trunk/products/ERP5/tests/testBPMCore.py [utf8] Tue Mar 22 10:07:15 2011
@@ -87,6 +87,17 @@ class TestBPMMixin(ERP5TypeTestCase):
specialise=self.default_business_process)
self.business_process = business_process
business_process._edit(**kw)
+ self.createTradeModelPath(self.business_process,
+ reference='order_path',
+ trade_phase_value_list=('default/order',))
+ self.createTradeModelPath(self.business_process,
+ reference='delivery_path',
+ trade_phase_value_list=('default/delivery',),
+ trade_date='trade_phase/default/order')
+ self.createTradeModelPath(self.business_process,
+ reference='invoice_path',
+ trade_phase_value_list=('default/invoicing',),
+ trade_date='trade_phase/default/delivery')
self.createTradeModelPath(business_process,
reference='default_path',
trade_phase_value_list=('default/discount', 'default/tax'),
@@ -156,6 +167,9 @@ class TestBPMMixin(ERP5TypeTestCase):
trade_model_path._setCriterionPropertyList(tuple(criterion_property_dict))
for property, identity in criterion_property_dict.iteritems():
trade_model_path.setCriterion(property, identity)
+ reference = kw.get('reference', None)
+ if reference is not None:
+ setattr(self, reference, trade_model_path)
return trade_model_path
def createMovement(self):
@@ -250,18 +264,24 @@ class TestBPMDummyDeliveryMovementMixin(
trade_phase='default/invoicing')
self.stepTic()
- def constructSimulationTreeAndDeliveries(self):
+ def constructSimulationTreeAndDeliveries(self, simulation_depth=None,
+ dummy_split=False):
"""
Construct a simple simulation tree with deliveries. This is
not real simulation tree, we only need the structure, most
usual properties are not there (quantities, arrow, etc)
+
+ simulation_depth : level of simulation where we should stop
"""
# create order and order line to have starting point for business process
self.order = order = self._createDelivery()
order_line = self._createMovement(order)
+ if simulation_depth is None:
+ simulation_depth = float('inf')
+
# first level rule with simulation movement
- applied_rule = self.portal.portal_simulation.newContent(
+ self.applied_rule = self.portal.portal_simulation.newContent(
portal_type='Applied Rule', causality_value=order)
def setTestClassProperty(prefix, property_name, document):
@@ -275,29 +295,38 @@ class TestBPMDummyDeliveryMovementMixin(
applied_rule.newContent(
portal_type = 'Simulation Movement',
delivery_value = order_line,
- causality_value = self.order_link
+ trade_phase='default/order',
+ causality_value_list=[self.order_link, self.order_path]
))
- # second level rule with simulation movement
- document = setTestClassProperty(prefix, 'delivery_rule',
- document.newContent(
- portal_type='Applied Rule'))
- document = setTestClassProperty(prefix, 'delivery_simulation_movement',
- document.newContent(
- portal_type='Simulation Movement',
- causality_value = self.delivery_link))
+ if simulation_depth > 1:
- # third level rule with simulation movement
- document = setTestClassProperty(prefix, 'invoicing_rule',
+ # second level rule with simulation movement
+ document = setTestClassProperty(prefix, 'delivery_rule',
document.newContent(
portal_type='Applied Rule'))
- document = setTestClassProperty(prefix, 'invoicing_simulation_movement',
+ document = setTestClassProperty(prefix, 'delivery_simulation_movement',
document.newContent(
portal_type='Simulation Movement',
- causality_value = self.invoice_link))
+ trade_phase='default/delivery',
+ causality_value_list=[self.delivery_link, self.delivery_path]))
- constructSimulationTree(applied_rule)
- constructSimulationTree(applied_rule, prefix='split')
+ if simulation_depth > 2:
+
+ # third level rule with simulation movement
+ document = setTestClassProperty(prefix, 'invoicing_rule',
+ document.newContent(
+ portal_type='Applied Rule'))
+ document = setTestClassProperty(prefix,
+ 'invoicing_simulation_movement',
+ document.newContent(
+ portal_type='Simulation Movement',
+ trade_phase='default/invoicing',
+ causality_value_list=[self.invoice_link, self.invoice_path]))
+
+ constructSimulationTree(self.applied_rule)
+ if dummy_split:
+ constructSimulationTree(self.applied_rule, prefix='split')
self.stepTic()
class TestBPMImplementation(TestBPMDummyDeliveryMovementMixin):
@@ -442,19 +471,44 @@ class TestBPMImplementation(TestBPMDummy
business_process.getRemainingTradePhaseList(
business_process.invoice))
- @newSimulationExpectedFailure
- def test_BusinessLink_calculateExpectedDate(self):
+ def test_BusinessProcess_getExpectedTradeModelPathStartAndStopDate(self):
"""
This test case is described for what start/stop date is expected on
- each path by explanation.
- In this case, root explanation is path of between "b" and "d", and
- lead time and wait time is set on each path.
- ("l" is lead time, "w" is wait_time)
+ path by explanation.
+ """
+ # define business process
+ self._createOrderedDeliveredInvoicedBusinessProcess()
- Each path must calculate most early day from getting most longest
- path in the simulation.
+ base_date = DateTime('2009/04/01 GMT+9')
+
+ self.constructSimulationTreeAndDeliveries(simulation_depth=1)
+ # Set dates manually since we have dummy simulation
+ self.simulation_movement.edit(start_date=base_date, stop_date=base_date)
+ self.tic()
+
+ def checkExpectedDates(explanation, start_date, stop_date, delay_mode=None):
+ self.assertEquals(
+ self.business_process.getExpectedTradeModelPathStartAndStopDate(
+ explanation, self.delivery_path, delay_mode=delay_mode),
+ (start_date, stop_date))
+
+ # Default behavior, no delay
+ checkExpectedDates(self.order, base_date, base_date)
+
+ # Update business process in order to introduce delay
+ self.delivery_path.edit(min_delay=1.0, max_delay=3.0)
+ self.constructSimulationTreeAndDeliveries(simulation_depth=2)
+ # Set dates manually since we have dummy simulation
+ self.simulation_movement.edit(start_date=base_date, stop_date=base_date)
+ checkExpectedDates(self.order, base_date, base_date + 2)
+ checkExpectedDates(self.order, base_date, base_date + 1, delay_mode='min')
+ checkExpectedDates(self.order, base_date, base_date + 3, delay_mode='max')
+ checkExpectedDates(self.delivery_simulation_movement.getParentValue(),
+ base_date, base_date + 2)
- "referential_date" represents for which date have to get of explanation from reality.
+ """
+ XXX More complex scenarios must be tested, like when several path are
+ possible like this :
(root_explanation)
l:2, w:1 l:3, w:1 l:4, w:2
@@ -467,109 +521,9 @@ class TestBPMImplementation(TestBPMDummy
\ /
\ /
c
- """
- # define business process
- category_tool = self.getCategoryTool()
- business_process = self.createBusinessProcess()
- business_link_a_b = self.createBusinessLink(business_process)
- business_link_b_c = self.createBusinessLink(business_process)
- business_link_b_d = self.createBusinessLink(business_process)
- business_link_c_d = self.createBusinessLink(business_process)
- business_link_d_e = self.createBusinessLink(business_process)
- business_state_a = category_tool.trade_state.state_a
- business_state_b = category_tool.trade_state.state_b
- business_state_c = category_tool.trade_state.state_c
- business_state_d = category_tool.trade_state.state_d
- business_state_e = category_tool.trade_state.state_e
- business_link_a_b.setPredecessorValue(business_state_a)
- business_link_b_c.setPredecessorValue(business_state_b)
- business_link_b_d.setPredecessorValue(business_state_b)
- business_link_c_d.setPredecessorValue(business_state_c)
- business_link_d_e.setPredecessorValue(business_state_d)
- business_link_a_b.setSuccessorValue(business_state_b)
- business_link_b_c.setSuccessorValue(business_state_c)
- business_link_b_d.setSuccessorValue(business_state_d)
- business_link_c_d.setSuccessorValue(business_state_d)
- business_link_d_e.setSuccessorValue(business_state_e)
-
- business_process.edit(referential_date='stop_date')
- business_link_a_b.edit(title='a_b', lead_time=2, wait_time=1)
- business_link_b_c.edit(title='b_c', lead_time=2, wait_time=1)
- business_link_b_d.edit(title='b_d', lead_time=3, wait_time=1)
- business_link_c_d.edit(title='c_d', lead_time=3, wait_time=0)
- business_link_d_e.edit(title='d_e', lead_time=4, wait_time=2)
-
- # root explanation
- business_link_b_d.edit(deliverable=True)
- self.stepTic()
-
- """
- Basic test, lead time of reality and simulation are consistent.
- """
- class Mock:
- def __init__(self, date):
- self.date = date
- def getStartDate(self):
- return self.date
- def getStopDate(self):
- return self.date + 3 # lead time of reality
-
- base_date = DateTime('2009/04/01 GMT+9')
- mock = Mock(base_date)
-
- # root explanation.
- self.assertEquals(business_link_b_d.getExpectedStartDate(mock), DateTime('2009/04/01 GMT+9'))
- self.assertEquals(business_link_b_d.getExpectedStopDate(mock), DateTime('2009/04/04 GMT+9'))
-
- # assertion for each path without root explanation.
- self.assertEquals(business_link_a_b.getExpectedStartDate(mock), DateTime('2009/03/27 GMT+9'))
- self.assertEquals(business_link_a_b.getExpectedStopDate(mock), DateTime('2009/03/29 GMT+9'))
- self.assertEquals(business_link_b_c.getExpectedStartDate(mock), DateTime('2009/03/30 GMT+9'))
- self.assertEquals(business_link_b_c.getExpectedStopDate(mock), DateTime('2009/04/01 GMT+9'))
- self.assertEquals(business_link_c_d.getExpectedStartDate(mock), DateTime('2009/04/01 GMT+9'))
- self.assertEquals(business_link_c_d.getExpectedStopDate(mock), DateTime('2009/04/04 GMT+9'))
- self.assertEquals(business_link_d_e.getExpectedStartDate(mock), DateTime('2009/04/06 GMT+9'))
- self.assertEquals(business_link_d_e.getExpectedStopDate(mock), DateTime('2009/04/10 GMT+9'))
+ For now the implementation and documentation is not clear enough.
"""
- Test of illegal case, lead time of reality and simulation are inconsistent,
- always reality is taken, but it depends on which date(e.g. start_date and stop_date) is referential.
-
- How we know which is referential, currently implementation of it can be known by
- BusinessProcess.isStartDateReferential and BusinessProcess.isStopDateReferential.
-
- In this test case, stop_date on business_link_b_d is referential, because business_link_b_d is
- root explanation and business_process refer to stop_date as referential.
-
- calculation example(when referential date is 2009/04/06 GMT+9):
- start_date of business_link_b_d = referential_date - 3(lead_time of business_link_b_d)
- = 2009/04/06 GMT+9 - 3
- = 2009/04/03 GMT+9
- """
- class Mock:
- def __init__(self, date):
- self.date = date
- def getStartDate(self):
- return self.date
- def getStopDate(self):
- return self.date + 5 # changed
-
- base_date = DateTime('2009/04/01 GMT+9')
- mock = Mock(base_date)
-
- self.assertEquals(business_link_b_d.getExpectedStartDate(mock), DateTime('2009/04/03 GMT+9'))
- # This is base in this context, because referential_date is 'stop_date'
- self.assertEquals(business_link_b_d.getExpectedStopDate(mock), DateTime('2009/04/06 GMT+9'))
-
- # assertion for each path without root explanation.
- self.assertEquals(business_link_a_b.getExpectedStartDate(mock), DateTime('2009/03/29 GMT+9'))
- self.assertEquals(business_link_a_b.getExpectedStopDate(mock), DateTime('2009/03/31 GMT+9'))
- self.assertEquals(business_link_b_c.getExpectedStartDate(mock), DateTime('2009/04/01 GMT+9'))
- self.assertEquals(business_link_b_c.getExpectedStopDate(mock), DateTime('2009/04/03 GMT+9'))
- self.assertEquals(business_link_c_d.getExpectedStartDate(mock), DateTime('2009/04/03 GMT+9'))
- self.assertEquals(business_link_c_d.getExpectedStopDate(mock), DateTime('2009/04/06 GMT+9'))
- self.assertEquals(business_link_d_e.getExpectedStartDate(mock), DateTime('2009/04/08 GMT+9'))
- self.assertEquals(business_link_d_e.getExpectedStopDate(mock), DateTime('2009/04/12 GMT+9'))
def test_isBuildable(self):
"""Test isBuildable for ordered, delivered and invoiced sequence
@@ -580,7 +534,7 @@ class TestBPMImplementation(TestBPMDummy
to rule below, and invoice_path is after delivery_path
"""
self._createOrderedDeliveredInvoicedBusinessProcess()
- self.constructSimulationTreeAndDeliveries()
+ self.constructSimulationTreeAndDeliveries(dummy_split=True)
self.order.setSimulationState(self.completed_state)
self.stepTic()
@@ -659,7 +613,7 @@ class TestBPMImplementation(TestBPMDummy
def test_isCompleted(self):
"""Test isCompleted for ordered, delivered and invoiced sequence"""
self._createOrderedDeliveredInvoicedBusinessProcess()
- self.constructSimulationTreeAndDeliveries()
+ self.constructSimulationTreeAndDeliveries(dummy_split=True)
self.assertEqual(self.delivery_link.isCompleted(self.order), False)
self.assertEqual(self.delivery_link.isPartiallyCompleted(self.order), False)
@@ -725,7 +679,7 @@ class TestBPMImplementation(TestBPMDummy
def test_isFrozen_OrderedDeliveredInvoiced(self):
"""Test isFrozen for ordered, delivered and invoiced sequence"""
self._createOrderedDeliveredInvoicedBusinessProcess()
- self.constructSimulationTreeAndDeliveries()
+ self.constructSimulationTreeAndDeliveries(dummy_split=True)
self.assertEqual(self.order_link.isFrozen(self.order), False)
self.assertEqual(self.delivery_link.isFrozen(self.order), False)
More information about the Erp5-report
mailing list