mirror of
https://github.com/OCA/intrastat-extrastat.git
synced 2025-02-16 17:13:41 +02:00
[14.0][IMP] intrastat_product: Add tests for Excel generation
This commit is contained in:
@@ -28,6 +28,10 @@ class IntrastatProductDeclarationXlsx(models.AbstractModel):
|
||||
return val
|
||||
|
||||
def _get_template(self, declaration):
|
||||
"""
|
||||
Return a dictionary that contains columns specifications
|
||||
see: report_xlsx_helper / _write_line() method
|
||||
"""
|
||||
|
||||
template = {
|
||||
"product": {
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
# Copyright 2021 ACSONE SA/NV
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
import xlrd
|
||||
from werkzeug.urls import url_encode
|
||||
|
||||
from odoo.addons.intrastat_base.tests.common import IntrastatCommon
|
||||
|
||||
@@ -63,6 +65,10 @@ class IntrastatProductCommon(IntrastatCommon):
|
||||
cls.declaration_obj = cls.env["intrastat.product.declaration"]
|
||||
cls.position_obj = cls.env["account.fiscal.position"]
|
||||
cls.hs_code_computer = cls.env.ref("product_harmonized_system.84715000")
|
||||
cls.report_obj = cls.env["ir.actions.report"]
|
||||
cls.xls_declaration = cls.env[
|
||||
"report.intrastat_product.product_declaration_xls"
|
||||
]
|
||||
|
||||
cls.transport_rail = cls.env.ref("intrastat_product.intrastat_transport_2")
|
||||
cls.transport_road = cls.env.ref("intrastat_product.intrastat_transport_3")
|
||||
@@ -72,6 +78,78 @@ class IntrastatProductCommon(IntrastatCommon):
|
||||
cls._init_fiscal_position()
|
||||
cls._init_products()
|
||||
|
||||
@classmethod
|
||||
def _create_xls(cls, declaration=False):
|
||||
"""
|
||||
Prepare the Excel report to be tested
|
||||
|
||||
:return: The Excel file
|
||||
:rtype: bytes
|
||||
"""
|
||||
report = cls.declaration.with_context(
|
||||
active_ids=cls.declaration.ids
|
||||
).create_xls()
|
||||
report_name = report.get("report_name")
|
||||
cls.report = cls.report_obj._get_report_from_name(report_name)
|
||||
datas = {
|
||||
"context": {
|
||||
"active_ids": [cls.declaration.id],
|
||||
}
|
||||
}
|
||||
data = {}
|
||||
encoded_data = "report/report_xlsx/" + report_name + "?" + url_encode(data)
|
||||
datas["data"] = encoded_data
|
||||
context = {
|
||||
"active_model": cls.declaration._name,
|
||||
}
|
||||
if not declaration:
|
||||
context.update({"computation_lines": True})
|
||||
else:
|
||||
context.update({"declaration_lines": True})
|
||||
file_data = cls.xls_declaration.with_context(context).create_xlsx_report(
|
||||
None, datas
|
||||
)
|
||||
return file_data
|
||||
|
||||
def check_xls(self, xls, declaration=False):
|
||||
"""
|
||||
Check that the xls content correspond to computation/declaration
|
||||
lines values
|
||||
|
||||
:param xls: the Excel file content
|
||||
:type xls: bytes
|
||||
:param declaration: By default, check computation lines, either declaration ones
|
||||
:type declaration: bool, optional
|
||||
"""
|
||||
book = xlrd.open_workbook(file_contents=xls)
|
||||
sheet = book.sheet_by_index(0)
|
||||
# Get the template used to build the Excel file lines
|
||||
template = self.xls_declaration._get_template(self.declaration)
|
||||
# Get the declaration lines or the computation ones
|
||||
if not declaration:
|
||||
declaration_lines = self.declaration.computation_line_ids
|
||||
line_fields = self.declaration._xls_computation_line_fields()
|
||||
else:
|
||||
declaration_lines = self.declaration.declaration_line_ids
|
||||
line_fields = self.declaration._xls_declaration_line_fields()
|
||||
i = 0
|
||||
# Iterate on each row beginning on third one (two headers)
|
||||
for rx in range(3, sheet.nrows):
|
||||
line = declaration_lines[i]
|
||||
row = sheet.row(rx)
|
||||
j = 0
|
||||
dict_compare = dict()
|
||||
for line_field in line_fields:
|
||||
column_spec = template.get(line_field)
|
||||
dict_compare.update(
|
||||
{row[j].value: column_spec.get("line").get("value")}
|
||||
)
|
||||
j += 1
|
||||
for key, value in dict_compare.items():
|
||||
value_eval = self.xls_declaration._eval(value, {"line": line})
|
||||
self.assertEqual(key, value_eval)
|
||||
i += 1
|
||||
|
||||
@classmethod
|
||||
def _create_region(cls, vals=None):
|
||||
values = {
|
||||
|
||||
@@ -48,6 +48,14 @@ class TestIntrastatProductPurchase(IntrastatPurchaseCommon):
|
||||
self.declaration.generate_declaration()
|
||||
self._check_line_values(final=True)
|
||||
|
||||
# Check the Excel computation file
|
||||
file_data = self._create_xls()
|
||||
self.check_xls(file_data[0])
|
||||
|
||||
# Check the Excel declaration file
|
||||
file_data = self._create_xls(True)
|
||||
self.check_xls(file_data[0], True)
|
||||
|
||||
|
||||
class TestIntrastatProductPurchaseCase(TestIntrastatProductPurchase, SavepointCase):
|
||||
"""Test Intrastat Purchase"""
|
||||
|
||||
@@ -83,6 +83,14 @@ class TestIntrastatProductSale(IntrastatSaleCommon):
|
||||
self.declaration.generate_declaration()
|
||||
self._check_line_values(final=True)
|
||||
|
||||
# Check the Excel computation file
|
||||
file_data = self._create_xls()
|
||||
self.check_xls(file_data[0])
|
||||
|
||||
# Check the Excel declaration file
|
||||
file_data = self._create_xls(True)
|
||||
self.check_xls(file_data[0], True)
|
||||
|
||||
|
||||
class TestIntrastatProductSaleCase(TestIntrastatProductSale, SavepointCase):
|
||||
"""Test Intrastat Sale"""
|
||||
|
||||
Reference in New Issue
Block a user