diff --git a/product/ERP5/tests/testCRM.py b/product/ERP5/tests/testCRM.py
index 3225a4167b9a850557b5aebc00823a59e65cbbfa..869bc2f7cac3e0067d7d872f745df21860f9f40a 100644
--- a/product/ERP5/tests/testCRM.py
+++ b/product/ERP5/tests/testCRM.py
@@ -114,6 +114,50 @@ class TestCRM(ERP5TypeTestCase):
     # XXX this fail when no persons are selected in listbox
     raise NotImplementedError
 
+  def test_SaleOpportunitySold(self):
+    # test the workflow of sale opportunities, when the sale opportunity is
+    # finaly sold
+    so = self.portal.sale_opportunity_module.newContent(
+                              portal_type='Sale Opportunity')
+    self.assertEquals('draft', so.getSimulationState())
+    self.portal.portal_workflow.doActionFor(so, 'submit_action')
+    self.assertEquals('submitted', so.getSimulationState())
+    self.portal.portal_workflow.doActionFor(so, 'validate_action')
+    self.assertEquals('contacted', so.getSimulationState())
+    self.portal.portal_workflow.doActionFor(so, 'enquire_action')
+    self.assertEquals('enquired', so.getSimulationState())
+    self.portal.portal_workflow.doActionFor(so, 'offer_action')
+    self.assertEquals('offered', so.getSimulationState())
+    self.portal.portal_workflow.doActionFor(so, 'sell_action')
+    self.assertEquals('sold', so.getSimulationState())
+
+  def test_SaleOpportunityRejected(self):
+    # test the workflow of sale opportunities, when the sale opportunity is
+    # finaly rejected.
+    # Uses different transitions than test_SaleOpportunitySold
+    so = self.portal.sale_opportunity_module.newContent(
+                              portal_type='Sale Opportunity')
+    self.assertEquals('draft', so.getSimulationState())
+    self.portal.portal_workflow.doActionFor(so, 'validate_action')
+    self.assertEquals('contacted', so.getSimulationState())
+    self.portal.portal_workflow.doActionFor(so, 'enquire_action')
+    self.assertEquals('enquired', so.getSimulationState())
+    self.portal.portal_workflow.doActionFor(so, 'offer_action')
+    self.assertEquals('offered', so.getSimulationState())
+    self.portal.portal_workflow.doActionFor(so, 'reject_action')
+    self.assertEquals('rejected', so.getSimulationState())
+
+  def test_SaleOpportunityExpired(self):
+    # test the workflow of sale opportunities, when the sale opportunity
+    # expires
+    so = self.portal.sale_opportunity_module.newContent(
+                              portal_type='Sale Opportunity')
+    self.assertEquals('draft', so.getSimulationState())
+    self.portal.portal_workflow.doActionFor(so, 'validate_action')
+    self.assertEquals('contacted', so.getSimulationState())
+    self.portal.portal_workflow.doActionFor(so, 'expire_action')
+    self.assertEquals('expired', so.getSimulationState())
+
 
 class TestCRMMailIngestion(ERP5TypeTestCase):
   """Test Mail Ingestion for CRM.