[Erp5-report] r28141 - /erp5/trunk/products/ERP5/tests/testBPMEvaluation.py
nobody at svn.erp5.org
nobody at svn.erp5.org
Wed Jul 22 16:10:52 CEST 2009
Author: luke
Date: Wed Jul 22 16:10:52 2009
New Revision: 28141
URL: http://svn.erp5.org?rev=28141&view=rev
Log:
- provide tests for experimental BPM features
Added:
erp5/trunk/products/ERP5/tests/testBPMEvaluation.py
Added: erp5/trunk/products/ERP5/tests/testBPMEvaluation.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/tests/testBPMEvaluation.py?rev=28141&view=auto
==============================================================================
--- erp5/trunk/products/ERP5/tests/testBPMEvaluation.py (added)
+++ erp5/trunk/products/ERP5/tests/testBPMEvaluation.py [utf8] Wed Jul 22 16:10:52 2009
@@ -1,0 +1,312 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+# Copyright (c) 2009 Nexedi SA and Contributors. All Rights Reserved.
+# Łukasz Nowak <luke at nexedi.com>
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsibility of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# guarantees and support are strongly advised to contract a Free Software
+# Service Company
+#
+# This program is Free Software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+##############################################################################
+"""
+This is BPM Evaluation Test class using erp5_bpm development Business Template
+
+Generally it tries to use two Business Processes - one with sequence very
+similar to normal ERP5 - TestBPMEvaluationDefaultProcessMixin, second one
+inverted - TestBPMEvaluationDifferentProcessMixin.
+
+It uses only Sale path to demonstrate BPM.
+
+It is advised to *NOT* remove erp5_administration.
+"""
+import unittest
+
+from Products.ERP5.tests.testBPMCore import TestBPMMixin
+from DateTime import DateTime
+
+class TestBPMEvaluationMixin(TestBPMMixin):
+ node_portal_type = 'Organisation'
+ order_portal_type = 'Sale Order'
+ order_line_portal_type = 'Sale Order Line'
+ trade_condition_portal_type = 'Sale Trade Condition'
+ product_portal_type = 'Product'
+ order_start_date = DateTime()
+ order_stop_date = order_start_date + 10
+
+ def getBusinessTemplateList(self):
+ return TestBPMMixin.getBusinessTemplateList(self) + ('erp5_bpm',
+ 'erp5_administration')
+
+ def afterSetUp(self):
+ TestBPMMixin.afterSetUp(self)
+ self._createNodes()
+ self._createBusinessProcess()
+ self._createTradeCondition()
+ self._createOrder()
+ self.stepTic()
+
+ def _createDocument(self, portal_type, **kw):
+ module = self.portal.getDefaultModule(portal_type=portal_type)
+ return module.newContent(portal_type=portal_type, **kw)
+
+ def _createProduct(self, **kw):
+ return self._createDocument(self.product_portal_type, **kw)
+
+ def _createNode(self, **kw):
+ return self._createDocument(self.node_portal_type, **kw)
+
+ def _createTradeCondition(self, **kw):
+ self.trade_condition = self._createDocument(
+ self.trade_condition_portal_type,
+ specialise_value=self.business_process, **kw)
+
+ def _createOrderLine(self, **kw):
+ return self.order.newContent(portal_type=self.order_line_portal_type, **kw)
+
+ def _createNodes(self):
+ self.source, self.source_section = self._createNode(), self._createNode()
+ self.destination, self.destination_section = self._createNode() \
+ , self._createNode()
+
+ def _createOrder(self):
+ self.order = self._createDocument(self.order_portal_type,
+ source_value = self.source,
+ source_section_value = self.source_section,
+ destination_value = self.destination,
+ destination_section_value = self.destination_section,
+ start_date = self.order_start_date,
+ stop_date = self.order_stop_date,
+ specialise_value = self.trade_condition)
+
+ def _checkOrderBPMSimulation(self):
+ """Checks BPM related simumation.
+
+ Note: Simulation tree is the same, it is totally independent from
+ BPM sequence"""
+ # TODO:
+ # - gather errors into one list
+ bpm_order_rule = self.order.getCausalityRelatedValue(
+ portal_type='Applied Rule')
+ self.assertEqual(bpm_order_rule.getSpecialiseValue().getPortalType(),
+ 'BPM Order Rule')
+ order_simulation_movement_list = bpm_order_rule.contentValues()
+ self.assertEqual(len(self.order.getMovementList()),
+ len(order_simulation_movement_list))
+ for order_simulation_movement in order_simulation_movement_list:
+ self.assertEqual(order_simulation_movement.getPortalType(),
+ 'Simulation Movement')
+ order_line = order_simulation_movement.getOrderValue()
+ property_problem_list = []
+ for property in 'resource', 'price', 'quantity', 'start_date', \
+ 'stop_date', 'source', 'destination', 'source_section', \
+ 'destination_section':
+ if order_line.getProperty(property) != order_simulation_movement \
+ .getProperty(property):
+ property_problem_list.append('property %s movement %s '
+ 'simulation %s' % (property, order_line.getProperty(property),
+ order_simulation_movement.getProperty(property)))
+ if len(property_problem_list) > 0:
+ self.fail('\n'.join(property_problem_list))
+ for bpm_invoicing_rule in order_simulation_movement.contentValues():
+ self.assertEqual(bpm_invoicing_rule.getPortalType(), 'Applied Rule')
+ self.assertEqual(bpm_invoicing_rule.getSpecialiseValue() \
+ .getPortalType(), 'BPM Invoicing Rule')
+ for invoicing_simulation_movement in bpm_invoicing_rule \
+ .contentValues():
+ self.assertEqual(invoicing_simulation_movement.getPortalType(),
+ 'Simulation Movement')
+ self.assertEqual(invoicing_simulation_movement.getCausalityValue(),
+ self.invoice_path)
+ for trade_model_rule in invoicing_simulation_movement \
+ .contentValues():
+ self.assertEqual(trade_model_rule.getPortalType(), 'Applied Rule')
+ self.assertEqual(trade_model_rule.getSpecialiseValue() \
+ .getPortalType(), 'Trade Model Rule')
+ self.assertSameSet(trade_model_rule.contentValues(
+ portal_type='Simulation Movement'), [])
+
+class TestBPMEvaluationDefaultProcessMixin:
+ def _createBusinessProcess(self):
+ self.business_process = self.createBusinessProcess()
+ ordered = self.createBusinessState(self.business_process)
+ delivered = self.createBusinessState(self.business_process)
+ invoiced = self.createBusinessState(self.business_process)
+ accounted = self.createBusinessState(self.business_process)
+ paid = self.createBusinessState(self.business_process)
+
+ self.delivery_path = self.createBusinessPath(self.business_process,
+ predecessor_value = ordered, successor_value = delivered,
+ trade_phase = 'default/delivery',
+ deliverable = 1,
+ completed_state_list = ['delivered'],
+ frozen_state_list = ['stopped', 'delivered'])
+
+ self.invoice_path = self.createBusinessPath(self.business_process,
+ predecessor_value = delivered, successor_value = invoiced,
+ completed_state_list = ['delivered'],
+ frozen_state_list = ['stopped', 'delivered'],
+ trade_phase='default/invoicing')
+
+ self.account_path = self.createBusinessPath(self.business_process,
+ predecessor_value = invoiced, successor_value = accounted,
+ completed_state_list = ['delivered'],
+ frozen_state_list = ['stopped', 'delivered'],
+ trade_phase='default/accounting')
+
+ self.pay_path = self.createBusinessPath(self.business_process,
+ predecessor_value = invoiced, successor_value = accounted,
+ completed_state_list = ['delivered'],
+ frozen_state_list = ['stopped', 'delivered'],
+ trade_phase='default/payment')
+
+ self.stepTic()
+
+class TestBPMEvaluationDifferentProcessMixin:
+ def _createBusinessProcess(self):
+ self.business_process = self.createBusinessProcess()
+ ordered = self.createBusinessState(self.business_process)
+ delivered = self.createBusinessState(self.business_process)
+ invoiced = self.createBusinessState(self.business_process)
+ accounted = self.createBusinessState(self.business_process)
+ paid = self.createBusinessState(self.business_process)
+
+ self.invoice_path = self.createBusinessPath(self.business_process,
+ predecessor_value = ordered, successor_value = invoiced,
+ completed_state_list = ['delivered'],
+ frozen_state_list = ['stopped', 'delivered'],
+ trade_phase='default/invoicing')
+
+ self.account_path = self.createBusinessPath(self.business_process,
+ predecessor_value = invoiced, successor_value = accounted,
+ completed_state_list = ['delivered'],
+ frozen_state_list = ['stopped', 'delivered'],
+ trade_phase='default/accounting')
+
+ self.pay_path = self.createBusinessPath(self.business_process,
+ predecessor_value = invoiced, successor_value = accounted,
+ completed_state_list = ['delivered'],
+ frozen_state_list = ['stopped', 'delivered'],
+ trade_phase='default/payment')
+
+ self.delivery_path = self.createBusinessPath(self.business_process,
+ predecessor_value = accounted, successor_value = delivered,
+ trade_phase = 'default/delivery',
+ deliverable = 1,
+ completed_state_list = ['delivered'],
+ frozen_state_list = ['stopped', 'delivered'])
+
+ self.stepTic()
+
+class TestOrder(TestBPMEvaluationMixin):
+ """Evaluation of BPM Sale Order system"""
+
+ def test_planning(self):
+ self.order_line = self._createOrderLine(resource_value = self._createProduct(),
+ quantity = 10, price = 5)
+ self.stepTic()
+
+ self.order.plan()
+ self.stepTic()
+ self._checkOrderBPMSimulation()
+
+ def test_planning_line_edit(self):
+ self.test_planning()
+ self.order_line.edit(quantity = 8, price = 6)
+ self.stepTic()
+ self._checkOrderBPMSimulation()
+
+ def test_planning_line_edit_add(self):
+ self.test_planning_line_edit()
+ self.order_line_2 = self._createOrderLine(
+ resource_value = self._createProduct(), quantity = 4, price = 2)
+ self.stepTic()
+ self._checkOrderBPMSimulation()
+
+ def test_planning_line_edit_add_many_transactions(self):
+ self.test_planning_line_edit()
+ self.order_line_9 = self._createOrderLine()
+ self.stepTic()
+ self._checkOrderBPMSimulation()
+
+ self.order_line_9.edit(resource_value = self._createProduct())
+ self.stepTic()
+ self._checkOrderBPMSimulation()
+
+ self.order_line_9.edit(quantity = 1)
+ self.stepTic()
+ self._checkOrderBPMSimulation()
+
+ self.order_line_9.edit(price = 33)
+ self.stepTic()
+ self._checkOrderBPMSimulation()
+
+ self.order_line_9.edit(resource_value = self._createProduct())
+ self.stepTic()
+ self._checkOrderBPMSimulation()
+
+ def test_planning_line_edit_add_same_resource(self):
+ self.test_planning_line_edit()
+ resource = self.order_line.getResourceValue()
+ self.order_line_10 = self._createOrderLine(resource_value = resource,
+ quantity = 9, price = 2)
+ self.stepTic()
+ self._checkOrderBPMSimulation()
+
+ def test_planning_line_edit_add_same_resource_than_order(self):
+ self.test_planning_line_edit_add_same_resource()
+ self.order.order()
+ self.stepTic()
+ self._checkOrderBPMSimulation()
+
+class TestPackingList(TestBPMEvaluationMixin):
+ """Evaluation of BPM Order to Packing List"""
+ pass
+
+class TestInvoice(TestBPMEvaluationMixin):
+ """Evaluation of BPM Order through Packing List to Invoice Transaction"""
+ pass
+
+class TestOrderDefaultProcess(TestOrder, TestBPMEvaluationDefaultProcessMixin):
+ pass
+
+class TestPackingListDefaultProcess(TestPackingList, TestBPMEvaluationDefaultProcessMixin):
+ pass
+
+class TestInvoiceDefaultProcess(TestInvoice, TestBPMEvaluationDefaultProcessMixin):
+ pass
+
+class TestOrderDifferentProcess(TestOrder, TestBPMEvaluationDifferentProcessMixin):
+ pass
+
+class TestPackingListDifferentProcess(TestPackingList, TestBPMEvaluationDifferentProcessMixin):
+ pass
+
+class TestInvoiceDifferentProcess(TestInvoice, TestBPMEvaluationDifferentProcessMixin):
+ pass
+
+def test_suite():
+ suite = unittest.TestSuite()
+ suite.addTest(unittest.makeSuite(TestOrderDefaultProcess))
+ suite.addTest(unittest.makeSuite(TestPackingListDefaultProcess))
+ suite.addTest(unittest.makeSuite(TestInvoiceDefaultProcess))
+ suite.addTest(unittest.makeSuite(TestOrderDifferentProcess))
+ suite.addTest(unittest.makeSuite(TestPackingListDifferentProcess))
+ suite.addTest(unittest.makeSuite(TestInvoiceDifferentProcess))
+ return suite
More information about the Erp5-report
mailing list