From e34bd39f17d2c989525f6d4e9786877d4e05b794 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Bidoul?= Date: Mon, 16 May 2016 19:38:49 +0200 Subject: [PATCH] [IMP] mis_builder: add a wide-coverage integration test This reveals a couple of bugs! --- mis_builder/models/mis_report.py | 2 + mis_builder/models/mis_report_instance.py | 2 +- .../report/mis_report_instance_xlsx.py | 5 +- mis_builder/tests/__init__.py | 1 + mis_builder/tests/test_mis_report_instance.py | 131 ++++++++++++++++++ 5 files changed, 139 insertions(+), 2 deletions(-) create mode 100644 mis_builder/tests/test_mis_report_instance.py diff --git a/mis_builder/models/mis_report.py b/mis_builder/models/mis_report.py index e319a3d9..c1cad51a 100644 --- a/mis_builder/models/mis_report.py +++ b/mis_builder/models/mis_report.py @@ -229,6 +229,7 @@ class KpiMatrix(object): col = self._cols[col_key] cell_tuple = [] assert len(vals) == col.colspan + assert len(drilldown_args) == col.colspan for val, drilldown_arg, subcol in \ izip(vals, drilldown_args, col.iter_subcols()): if isinstance(val, DataError): @@ -266,6 +267,7 @@ class KpiMatrix(object): cell = KpiMatrixCell(row, subcol, val, val_rendered, val_comment, cell_style_props, drilldown_arg) cell_tuple.append(cell) + assert len(cell_tuple) == col.colspan col._set_cell_tuple(row, cell_tuple) def compute_comparisons(self): diff --git a/mis_builder/models/mis_report_instance.py b/mis_builder/models/mis_report_instance.py index 431f9500..1c20efff 100644 --- a/mis_builder/models/mis_report_instance.py +++ b/mis_builder/models/mis_report_instance.py @@ -298,7 +298,7 @@ class MisReportInstance(models.Model): @api.multi def preview(self): - assert len(self) == 1 + self.ensure_one() view_id = self.env.ref('mis_builder.' 'mis_report_instance_result_view_form') return { diff --git a/mis_builder/report/mis_report_instance_xlsx.py b/mis_builder/report/mis_report_instance_xlsx.py index faf93fda..6bdcc689 100644 --- a/mis_builder/report/mis_report_instance_xlsx.py +++ b/mis_builder/report/mis_report_instance_xlsx.py @@ -115,7 +115,10 @@ class MisBuilderXslx(ReportXlsx): cell_xlsx_style = style_obj.to_xlsx_style(cell.style_props) cell_xlsx_style['align'] = 'right' cell_format = workbook.add_format(cell_xlsx_style) - val = cell.val / float(cell.style_props.get('divider', 1)) + if cell.val is None or cell.val is AccountingNone: + val = '' + else: + val = cell.val / float(cell.style_props.get('divider', 1)) sheet.write(row_pos, col_pos, val, cell_format) col_width[col_pos] = max(col_width[col_pos], len(cell.val_rendered or '')) diff --git a/mis_builder/tests/__init__.py b/mis_builder/tests/__init__.py index 21f45540..354d62fd 100644 --- a/mis_builder/tests/__init__.py +++ b/mis_builder/tests/__init__.py @@ -6,6 +6,7 @@ from . import test_accounting_none from . import test_aep from . import test_aggregate from . import test_fetch_query +from . import test_mis_report_instance from . import test_mis_safe_eval from . import test_render from . import test_simple_array diff --git a/mis_builder/tests/test_mis_report_instance.py b/mis_builder/tests/test_mis_report_instance.py new file mode 100644 index 00000000..c7b7cc2c --- /dev/null +++ b/mis_builder/tests/test_mis_report_instance.py @@ -0,0 +1,131 @@ +# -*- coding: utf-8 -*- +# © 2016 ACSONE SA/NV () +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +import openerp.tests.common as common +from openerp.tools import test_reports + + +class TestMisReportInstance(common.TransactionCase): + """ Basic integration test to exercise mis.report.instance. + + We don't check the actual results here too much as computation correctness + should be covered by lower level unit tests. + """ + + def setUp(self): + super(TestMisReportInstance, self).setUp() + partner_model_id = \ + self.env.ref('base.model_res_partner').id + partner_create_date_field_id = \ + self.env.ref('base.field_res_partner_create_date').id + partner_debit_field_id = \ + self.env.ref('account.field_res_partner_debit').id + # create a report with 2 subkpis and one query + self.report = self.env['mis.report'].create(dict( + name='test report', + subkpi_ids=[(0, 0, dict( + name='sk1', + description='subkpi 1', + sequence=1, + )), (0, 0, dict( + name='sk2', + description='subkpi 2', + sequence=2, + )), + ], + query_ids=[(0, 0, dict( + name='partner', + model_id=partner_model_id, + field_ids=[(4, partner_debit_field_id, None)], + date_field=partner_create_date_field_id, + aggregate='sum', + )), + ], + )) + # kpi with accounting formulas + self.env['mis.report.kpi'].create(dict( + report_id=self.report.id, + description='kpi 1', + name='k1', + multi=True, + expression_ids=[(0, 0, dict( + name='bale[200%]', + subkpi_id=self.report.subkpi_ids[0].id, + )), (0, 0, dict( + name='balp[200%]', + subkpi_id=self.report.subkpi_ids[1].id, + )), + ], + )) + # kpi with accounting formula and query + self.env['mis.report.kpi'].create(dict( + report_id=self.report.id, + description='kpi 2', + name='k2', + multi=True, + expression_ids=[(0, 0, dict( + name='balp[200%]', + subkpi_id=self.report.subkpi_ids[0].id, + )), (0, 0, dict( + name='partner.debit', + subkpi_id=self.report.subkpi_ids[1].id, + )), + ], + )) + # kpi with 2 constants + self.env['mis.report.kpi'].create(dict( + report_id=self.report.id, + description='kpi 3', + name='k3', + multi=True, + expression_ids=[(0, 0, dict( + name='AccountingNone', + subkpi_id=self.report.subkpi_ids[0].id, + )), (0, 0, dict( + name='1.0', + subkpi_id=self.report.subkpi_ids[1].id, + )), + ], + )) + # kpi with a simple expression summing other multi-valued kpis + self.env['mis.report.kpi'].create(dict( + report_id=self.report.id, + description='kpi 4', + name='k4', + multi=False, + expression='k1 + k2 + k3', + )) + # create a report instance + self.report_instance = self.env['mis.report.instance'].create(dict( + name='test instance', + report_id=self.report.id, + company_id=self.env.ref('base.main_company').id, + period_ids=[(0, 0, dict( + name='p1', + mode='relative', + type='d', + subkpi_ids=[(4, self.report.subkpi_ids[0].id, None)], + )), (0, 0, dict( + name='p2', + mode='fix', + manual_date_from='2014-01-01', + manual_date_to='2014-12-31', + )), + ], + )) + + def test_json(self): + self.report_instance.compute() + + def test_qweb(self): + test_reports.try_report(self.env.cr, self.env.uid, + 'mis_builder.report_mis_report_instance', + [self.report_instance.id], + report_type='qweb-pdf') + + def test_xlsx(self): + test_reports.try_report(self.env.cr, self.env.uid, + 'mis.report.instance.xlsx', + [self.report_instance.id], + report_type='xlsx')