[Erp5-report] r13221 - /erp5/trunk/products/ERP5/tests/testAccounting.py

nobody at svn.erp5.org nobody at svn.erp5.org
Mon Mar 5 13:36:58 CET 2007


Author: jerome
Date: Mon Mar  5 13:36:56 2007
New Revision: 13221

URL: http://svn.erp5.org?rev=13221&view=rev
Log:
Added an easy to use TestCase for Accounting.


Modified:
    erp5/trunk/products/ERP5/tests/testAccounting.py

Modified: erp5/trunk/products/ERP5/tests/testAccounting.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/tests/testAccounting.py?rev=13221&r1=13220&r2=13221&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/tests/testAccounting.py (original)
+++ erp5/trunk/products/ERP5/tests/testAccounting.py Mon Mar  5 13:36:56 2007
@@ -26,22 +26,15 @@
 #
 ##############################################################################
 
+"""Tests some accounting functionality.
+
 """
-  Tests some functionnalities of accounting.
-
-"""
-import os, sys
-if __name__ == '__main__':
-  execfile(os.path.join(sys.path[0], 'framework.py'))
-
-# Needed in order to have a log file inside the current folder
-os.environ['EVENT_LOG_FILE'] = os.path.join(os.getcwd(), 'zLOG.log')
-os.environ['EVENT_LOG_SEVERITY'] = '-300'
-
+
+import unittest
 from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
+from Products.ERP5Type.tests.utils import reindex
 from Products.DCWorkflow.DCWorkflow import ValidationFailed
 from AccessControl.SecurityManagement import newSecurityManager
-from zLOG import LOG
 from Products.ERP5Type.tests.Sequence import Sequence, SequenceList
 from Products.ERP5.Document.Delivery import Delivery
 from DateTime import DateTime
@@ -50,6 +43,167 @@
 DESTINATION = 'destination'
 RUN_ALL_TESTS = 1
 QUIET = 1
+
+# Associate transaction portal type to the corresponding line portal type.
+transaction_to_line_mapping = {
+    'Accounting Transaction': 'Accounting Transaction Line',
+    'Balance Transaction': 'Balance Transaction Line',
+    'Purchase Invoice Transaction': 'Purchase Invoice Transaction Line',
+    'Sale Invoice Transaction': 'Sale Invoice Transaction Line',
+    'Payment Transaction': 'Accounting Transaction Line',
+    'Closing Transaction': 'Closing Transaction Line',
+  }
+
+
+class AccountingTestCase(ERP5TypeTestCase):
+  """A test case for all accounting tests.
+
+  Like in erp5_accounting_ui_test, the testing environment is made of:
+
+  Currencies:
+    * EUR with precision 2
+    * USD with precision 2
+    * JPY with precision 0
+
+  Regions:
+    * region/europe/west/france
+    
+  Group:
+    * group/demo_group
+    * group/demo_group/sub1
+    * group/demo_group/sub2
+    * group/client
+    * group/vendor'
+    
+  Payment Mode:
+    * payment_mode/cash
+    * payment_mode/check
+  
+  Organisations:
+    * `self.section` an organisation in region europe/west/france
+    using EUR as default currency, without any openned accounting period by
+    default. This organisation is member of group/demo_group/sub1
+    * self.client_1, self.client_2 & self.vendor, some other organisations
+  
+  Accounts:
+      All accounts are associated to a virtual GAP category named "My Accounting
+    Standards":
+    * bank
+    * collected_vat
+    * equity
+    * fixed_assets
+    * goods_purchase
+    * goods_sales
+    * payable
+    * receivable
+    * refundable_vat
+    * stocks
+  
+  Tests starts with a preference activated for self.my_organisation, logged in
+  as a user with Assignee, Assignor and Author role.
+
+  All documents created appart from this configuration will be deleted in
+  teardown. So users of this test case are encouraged to create new documents
+  rather than modifying default documents. 
+  """
+  
+  username = 'username'
+
+  @reindex
+  def _makeOne(self, portal_type='Accounting Transaction', lines=None, **kw):
+    """Creates an accounting transaction, and edit it with kw.
+    
+    The default settings is for self.section.
+    You can pass a list of mapping as lines, then lines will be created
+    using this information.
+    """
+    created_by_builder = kw.pop('created_by_builder', lines is not None)
+    kw.setdefault('start_date', DateTime())
+    kw.setdefault('resource', 'currency_module/euro')
+    if portal_type in ('Purchase Invoice Transaction', ):
+      if 'destination_section' not in kw:
+        kw.setdefault('destination_section_value', self.section)
+    else:
+      if 'source_section' not in kw:
+        kw.setdefault('source_section_value', self.section)
+    tr = self.accounting_module.newContent(portal_type=portal_type,
+                         created_by_builder=created_by_builder, **kw)
+    if lines:
+      for line in lines:
+        line.setdefault('portal_type', transaction_to_line_mapping[portal_type])
+        tr.newContent(**line)
+    return tr
+
+
+  def login(self):
+    """login with Assignee, Assignor & Author roles."""
+    uf = self.getPortal().acl_users
+    uf._doAddUser(self.username, '', ['Assignee', 'Assignor', 'Author'], [])
+    user = uf.getUserById(self.username).__of__(uf)
+    newSecurityManager(None, user)
+
+
+  def setUp(self):
+    """Setup the fixture.
+    """
+    ERP5TypeTestCase.setUp(self)
+    self.portal = self.getPortal()
+    self.account_module = self.portal.account_module
+    self.accounting_module = self.portal.accounting_module
+    self.organisation_module = self.portal.organisation_module
+    self.person_module = self.portal.person_module
+    self.currency_module = self.portal.currency_module
+    self.section = self.organisation_module.my_organisation
+    
+    # make sure documents are validated
+    for module in (self.account_module, self.organisation_module,
+                   self.person_module):
+      for doc in module.objectValues():
+        doc.validate()
+    
+    # and the preference enabled
+    self.portal.portal_preferences.accounting_zuite_preference\
+                      .manage_addLocalRoles(self.username, ('Auditor', ))
+    self.portal.portal_preferences.accounting_zuite_preference.enable()
+    
+    # and all this available to catalog
+    get_transaction().commit()
+    self.tic()
+
+
+  def tearDown(self):
+    """Remove all documents, except the default ones.
+    """
+    get_transaction().abort()
+    allowAccountingTransactionDeletion()
+    self.accounting_module.manage_delObjects(
+                      list(self.accounting_module.objectIds()))
+    self.organisation_module.manage_delObjects([x for x in 
+          self.accounting_module.objectIds() if x not in ('my_organisation',
+            'client_1', 'client_2', 'client_3')])
+    self.organisation_module.my_organisation.manage_delObjects([x.getId()
+        for x in self.organisation_module.my_organisation.objectValues(
+                                   portal_type='Accounting Period')])
+    self.person_module.manage_delObjects([x for x in 
+          self.person_module.objectIds() if x not in ('john_smith',)])
+    self.account_module.manage_delObjects([x for x in 
+          self.account_module.objectIds() if x not in ('bank', 'collected_vat',
+            'equity', 'fixed_assets', 'goods_purchase', 'goods_sales',
+            'payable', 'receivable', 'refundable_vat', 'stocks',)])
+    self.portal.portal_preferences.manage_delObjects([x for x in
+          self.portal.portal_preferences.objectIds() if x not in
+          ('accounting_zuite_preference', 'default_site_preference')])
+    self.portal.portal_simulation.manage_delObjects(list(
+          self.portal.portal_simulation.objectIds()))
+    get_transaction().commit()
+    self.tic()
+    ERP5TypeTestCase.tearDown(self)
+
+
+  def getBusinessTemplateList(self):
+    """Returns list of BT to be installed."""
+    return ('erp5_base', 'erp5_pdm', 'erp5_trade', 'erp5_accounting',
+            'erp5_accounting_ui_test')
 
 
 def manage_beforeDelete(self, item, container):
@@ -69,9 +223,10 @@
     # registry has been initialized.
     pass
 
+
 class TestAccounting(ERP5TypeTestCase):
-  """Test Accounting. """
-  
+  """The first test for Accounting
+  """
   def getAccountingModule(self):
     return getattr(self.getPortal(), 'accounting_module',
            getattr(self.getPortal(), 'accounting', None))
@@ -1408,7 +1563,7 @@
     # this transaction can be validated
     eq([], payment.checkConsistency())
     self.workflow_tool.doActionFor(payment, 'stop_action')
-    self.assertEquals('stopped', payment.getSimulationState())
+    eq('stopped', payment.getSimulationState())
 
   def test_Invoice_createRelatedPaymentTransactionSimple(self):
     """Simple case of creating a related payment transaction.
@@ -1536,12 +1691,8 @@
                                   batch_mode=1)
     self._checkRelatedSalePayment(invoice, payment, payment_node, 100)
     
-if __name__ == '__main__':
-  framework()
-else:
-  import unittest
-  def test_suite():
-    suite = unittest.TestSuite()
-    suite.addTest(unittest.makeSuite(TestAccounting))
-    return suite
-
+def test_suite():
+  suite = unittest.TestSuite()
+  suite.addTest(unittest.makeSuite(TestAccounting))
+  return suite
+




More information about the Erp5-report mailing list