summaryrefslogtreecommitdiff
path: root/addons/account_edi/tests/common.py
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/account_edi/tests/common.py
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/account_edi/tests/common.py')
-rw-r--r--addons/account_edi/tests/common.py116
1 files changed, 116 insertions, 0 deletions
diff --git a/addons/account_edi/tests/common.py b/addons/account_edi/tests/common.py
new file mode 100644
index 00000000..d0cc2754
--- /dev/null
+++ b/addons/account_edi/tests/common.py
@@ -0,0 +1,116 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+from odoo.modules.module import get_module_resource
+from odoo.addons.account.tests.common import AccountTestInvoicingCommon
+
+from contextlib import contextmanager
+from unittest.mock import patch
+from unittest import mock
+
+import base64
+
+
+class AccountEdiTestCommon(AccountTestInvoicingCommon):
+
+ @classmethod
+ def setUpClass(cls, chart_template_ref=None, edi_format_ref=None):
+ super().setUpClass(chart_template_ref=chart_template_ref)
+
+ # ==== EDI ====
+ if edi_format_ref:
+ cls.edi_format = cls.env.ref(edi_format_ref)
+ else:
+ cls.edi_format = cls.env['account.edi.format'].sudo().create({
+ 'name': 'Test EDI format',
+ 'code': 'test_edi',
+ })
+ cls.journal = cls.company_data['default_journal_sale']
+ cls.journal.edi_format_ids = [(6, 0, cls.edi_format.ids)]
+
+ ####################################################
+ # EDI helpers
+ ####################################################
+
+ def edi_cron(self):
+ self.env['account.edi.document'].sudo().with_context(edi_test_mode=True).search([('state', 'in', ('to_send', 'to_cancel'))])._process_documents_web_services(with_commit=False)
+
+ def _create_empty_vendor_bill(self):
+ invoice = self.env['account.move'].create({
+ 'move_type': 'in_invoice',
+ 'journal_id': self.company_data['default_journal_purchase'].id,
+ })
+ if 'extract_state' in invoice._fields:
+ invoice.extract_state = 'done' # prevent ocr
+ return invoice
+
+ def update_invoice_from_file(self, module_name, subfolder, filename, invoice):
+ file_path = get_module_resource(module_name, subfolder, filename)
+ file = open(file_path, 'rb').read()
+
+ attachment = self.env['ir.attachment'].create({
+ 'name': filename,
+ 'datas': base64.encodebytes(file),
+ 'res_id': invoice.id,
+ 'res_model': 'account.move',
+ })
+
+ invoice.message_post(attachment_ids=[attachment.id])
+
+ def create_invoice_from_file(self, module_name, subfolder, filename):
+ file_path = get_module_resource(module_name, subfolder, filename)
+ file = open(file_path, 'rb').read()
+
+ attachment = self.env['ir.attachment'].create({
+ 'name': filename,
+ 'datas': base64.encodebytes(file),
+ 'res_model': 'account.move',
+ })
+ journal_id = self.company_data['default_journal_sale']
+ action_vals = journal_id.with_context(default_move_type='in_invoice').create_invoice_from_attachment(attachment.ids)
+ return self.env['account.move'].browse(action_vals['res_id'])
+
+ def assert_generated_file_equal(self, invoice, expected_values, applied_xpath=None):
+ invoice.action_post()
+ invoice.edi_document_ids._process_documents_web_services(with_commit=False) # synchronous are called in post, but there's no CRON in tests for asynchronous
+ attachment = invoice._get_edi_attachment(self.edi_format)
+ if not attachment:
+ raise ValueError('No attachment was generated after posting EDI')
+ xml_content = base64.b64decode(attachment.with_context(bin_size=False).datas)
+ current_etree = self.get_xml_tree_from_string(xml_content)
+ expected_etree = self.get_xml_tree_from_string(expected_values)
+ if applied_xpath:
+ expected_etree = self.with_applied_xpath(expected_etree, applied_xpath)
+ self.assertXmlTreeEqual(current_etree, expected_etree)
+
+ def create_edi_document(self, edi_format, state, move=None, move_type=None):
+ """ Creates a document based on an existing invoice or creates one, too.
+
+ :param edi_format: The edi_format of the document.
+ :param state: The state of the document.
+ :param move: The move of the document or None to create a new one.
+ :param move_type: If move is None, the type of the invoice to create, defaults to 'out_invoice'.
+ """
+ move = move or self.init_invoice(move_type or 'out_invoice', products=self.product_a)
+ return self.env['account.edi.document'].create({
+ 'edi_format_id': edi_format.id,
+ 'move_id': move.id,
+ 'state': state
+ })
+
+ def _process_documents_web_services(self, moves, formats_to_return=None):
+ """ Generates and returns EDI files for the specified moves.
+ formats_to_return is an optional parameter used to pass a set of codes from
+ the formats we want to return the files for (in case we want to test specific formats).
+ Other formats will still generate documents, they simply won't be returned.
+ """
+ moves.edi_document_ids.with_context(edi_test_mode=True)._process_documents_web_services(with_commit=False)
+
+ documents_to_return = moves.edi_document_ids
+ if formats_to_return != None:
+ documents_to_return = documents_to_return.filtered(lambda x: x.edi_format_id.code in formats_to_return)
+
+ attachments = documents_to_return.attachment_id
+ data_str_list = []
+ for attachment in attachments.with_context(bin_size=False):
+ data_str_list.append(base64.decodebytes(attachment.datas))
+ return data_str_list