From 0756f69b5157380acf7c8b95158a3644adab5704 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C5=81ukasz=20Nowak?= <luke@nexedi.com>
Date: Mon, 19 Nov 2012 14:22:33 +0100
Subject: [PATCH] Cover default_trade_model_rule

---
 ...stSlapOSAccountingDefaultTradeModelRule.py | 130 ++++++++++++++++++
 master/bt5/slapos_accounting/bt/revision      |   2 +-
 .../bt/template_test_id_list                  |   1 +
 3 files changed, 132 insertions(+), 1 deletion(-)
 create mode 100644 master/bt5/slapos_accounting/TestTemplateItem/testSlapOSAccountingDefaultTradeModelRule.py

diff --git a/master/bt5/slapos_accounting/TestTemplateItem/testSlapOSAccountingDefaultTradeModelRule.py b/master/bt5/slapos_accounting/TestTemplateItem/testSlapOSAccountingDefaultTradeModelRule.py
new file mode 100644
index 000000000..cf2fa85f7
--- /dev/null
+++ b/master/bt5/slapos_accounting/TestTemplateItem/testSlapOSAccountingDefaultTradeModelRule.py
@@ -0,0 +1,130 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# Copyright (c) 2012 Nexedi SA and Contributors. All Rights Reserved.
+#
+##############################################################################
+
+from Products.SlapOS.tests.testSlapOSMixin import \
+  testSlapOSMixin
+from DateTime import DateTime
+import transaction
+import functools
+
+def withAbort(func):
+  @functools.wraps(func)
+  def wrapped(self, *args, **kwargs):
+    try:
+      func(self, *args, **kwargs)
+    finally:
+      transaction.abort()
+  return wrapped
+
+class TestDefaultInvoiceTransactionRule(testSlapOSMixin):
+  @withAbort
+  def test_simulation(self):
+    from Products.ERP5.Document.SimulationMovement import SimulationMovement
+    SimulationMovement.original_getSimulationState = SimulationMovement\
+        .getSimulationState
+    try:
+      def getSimulationStatePlanned(self, *args, **kwargs):
+        return 'planned'
+      SimulationMovement.getSimulationState = getSimulationStatePlanned
+
+      source = self.portal.person_module.template_member\
+          .Base_createCloneDocument(batch_mode=1)
+      destination = self.portal.person_module.template_member\
+          .Base_createCloneDocument(batch_mode=1)
+      aggregate = self.portal.hosting_subscription_module\
+          .template_hosting_subscription.Base_createCloneDocument(batch_mode=1)
+      resource = self.portal.service_module.slapos_instance_subscription
+      start_date = DateTime('2011/02/16')
+      stop_date = DateTime('2011/03/16')
+
+      root_applied_rule = self.portal.portal_simulation.newContent(
+          specialise_value=self.portal.portal_rules\
+              .slapos_invoice_simulation_rule,
+          portal_type='Applied Rule')
+
+      root_simulation_movement = root_applied_rule.newContent(
+          id='root_simulation_movement',
+          portal_type='Simulation Movement',
+          price=2.4,
+          quantity=4.6,
+          source_value=source,
+          source_section_value=source,
+          destination_value=destination,
+          destination_section_value=destination,
+          resource_value=resource,
+          aggregate_value=aggregate,
+          start_date=start_date,
+          stop_date=stop_date,
+          base_contribution_list=['base_amount/invoicing/discounted',
+              'base_amount/invoicing/taxable'],
+          price_currency='currency_module/EUR',
+          use='trade/sale',
+          trade_phase='slapos/invoicing',
+          quantity_unit='unit/piece',
+          specialise='sale_trade_condition_module/slapos_trade_condition',
+          causality_list=['business_process_module/slapos_sale_business_p'
+          'rocess/invoice_path', 'business_process_module/slapos_sale_b'
+          'usiness_process/invoice'],
+          delivery_value=self.portal.accounting_module.newContent(
+              portal_type='Sale Invoice Transaction').newContent(
+                  portal_type='Invoice Line')
+          )
+
+      self.assertEqual('planned',
+          root_simulation_movement.getSimulationState())
+      root_simulation_movement.expand(expand_policy='immediate')
+
+      applied_rule_list = [q for q in root_simulation_movement.contentValues(
+          portal_type='Applied Rule') if q.getSpecialiseReference() == \
+              'default_trade_model_rule']
+
+      # movement is in final state, it shall be expanded
+      self.assertEqual(1, len(applied_rule_list))
+
+      applied_rule = applied_rule_list[0]
+      simulation_movement_list = applied_rule.contentValues(
+          portal_type='Simulation Movement')
+      self.assertEqual(1, len(simulation_movement_list))
+      simulation_movement = simulation_movement_list[0]
+      self.assertEqual('planned', simulation_movement.getSimulationState())
+      self.assertEqual(root_simulation_movement.getSource(),
+          simulation_movement.getSource())
+      self.assertEqual(root_simulation_movement.getSourceSection(),
+          simulation_movement.getSourceSection())
+      self.assertEqual(root_simulation_movement.getDestination(),
+          simulation_movement.getDestination())
+      self.assertEqual(root_simulation_movement.getDestinationSection(),
+          simulation_movement.getDestinationSection())
+      self.assertEqual(root_simulation_movement.getTotalPrice(),
+          simulation_movement.getQuantity())
+      self.assertEqual(root_simulation_movement.getPriceCurrency(),
+          simulation_movement.getPriceCurrency())
+      self.assertEqual([], simulation_movement.getAggregateList())
+      self.assertEqual(root_simulation_movement.getStopDate(),
+          simulation_movement.getStartDate())
+      self.assertEqual(root_simulation_movement.getStopDate(),
+          simulation_movement.getStopDate())
+      self.assertEqual(None, simulation_movement.getUse())
+
+      trade_model_line_list = simulation_movement.getCausalityValueList(
+          portal_type='Trade Model Line')
+      self.assertEqual(1, len(trade_model_line_list))
+      trade_model_line = trade_model_line_list[0]
+      self.assertEqual(trade_model_line.getPrice(),
+          simulation_movement.getPrice())
+      self.assertEqual(trade_model_line.getResource(),
+          simulation_movement.getResource())
+      self.assertEqual([], simulation_movement.getBaseContributionList())
+      self.assertEqual('slapos/tax',
+          simulation_movement.getTradePhase())
+      self.assertEqual(root_simulation_movement.getQuantityUnit(),
+          simulation_movement.getQuantityUnit())
+      self.assertEqual(root_simulation_movement.getSpecialise(),
+          simulation_movement.getSpecialise())
+    finally:
+      SimulationMovement.getSimulationState = SimulationMovement\
+        .original_getSimulationState
diff --git a/master/bt5/slapos_accounting/bt/revision b/master/bt5/slapos_accounting/bt/revision
index d7765fe47..2fb681e3f 100644
--- a/master/bt5/slapos_accounting/bt/revision
+++ b/master/bt5/slapos_accounting/bt/revision
@@ -1 +1 @@
-70
\ No newline at end of file
+71
\ No newline at end of file
diff --git a/master/bt5/slapos_accounting/bt/template_test_id_list b/master/bt5/slapos_accounting/bt/template_test_id_list
index 727eec62a..b7c50d270 100644
--- a/master/bt5/slapos_accounting/bt/template_test_id_list
+++ b/master/bt5/slapos_accounting/bt/template_test_id_list
@@ -2,6 +2,7 @@ testSlapOSAccountingConstraint
 testSlapOSAccountingDefaultInvoiceTransactionRule
 testSlapOSAccountingDefaultInvoicingRule
 testSlapOSAccountingDefaultSubscriptionItemRule
+testSlapOSAccountingDefaultTradeModelRule
 testSlapOSAccountingInstanceInvoicingAlarm
 testSlapOSAccountingInteractionWorkflow
 testSlapOSAccountingSlapOSManageBuildingCalculatingDelivery
-- 
2.30.9