# Author: Julien Coux # Copyright 2016 Camptocamp SA # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from odoo.tests.common import TransactionCase import logging _logger = logging.getLogger(__name__) try: from xlrd import open_workbook except ImportError: _logger.debug('Can not import xlsxwriter`.') class AbstractTest(TransactionCase): """Common technical tests for all reports.""" def setUp(cls): super(AbstractTest, cls).setUp() cls.model = cls._getReportModel() cls.qweb_report_name = cls._getQwebReportName() cls.xlsx_report_name = cls._getXlsxReportName() cls.xlsx_action_name = cls._getXlsxReportActionName() cls.report_title = cls._getReportTitle() cls.base_filters = cls._getBaseFilters() cls.additional_filters = cls._getAdditionalFiltersToBeTested() cls.report = cls.model.create(cls.base_filters) def test_01_generation_report_qweb(self): """Check if report PDF/HTML is correctly generated""" # Check if returned report action is correct report_type = 'qweb-pdf' report_action = self.report.print_report(report_type) self.assertDictContainsSubset( { 'type': 'ir.actions.report', 'report_name': self.qweb_report_name, 'report_type': 'qweb-pdf', }, report_action ) # Check if report template is correct report = self.env['ir.actions.report'].search( [('report_name', '=', self.qweb_report_name), ('report_type', '=', report_type)], limit=1) self.assertEqual(report.report_type, 'qweb-pdf') rep = report.render(self.report.ids, {}) self.assertTrue(self.report_title.encode('utf8') in rep[0]) self.assertTrue( self.report.account_ids[0].name.encode('utf8') in rep[0] ) def test_02_generation_report_html(self): """Check if report HTML is correctly generated""" # Check if returned report action is correct report_type = 'qweb-html' report_action = self.report.print_report(report_type) self.assertDictContainsSubset( { 'type': 'ir.actions.report', 'report_name': self.qweb_report_name, 'report_type': 'qweb-html', }, report_action ) # Check if report template is correct report = self.env['ir.actions.report'].search( [('report_name', '=', self.qweb_report_name), ('report_type', '=', report_type)], limit=1) self.assertEqual(report.report_type, 'qweb-html') rep = report.render(self.report.ids, {}) self.assertTrue(self.report_title.encode('utf8') in rep[0]) self.assertTrue( self.report.account_ids[0].name.encode('utf8') in rep[0] ) def test_03_generation_report_xlsx(self): """Check if report XLSX is correctly generated""" report_object = self.env['ir.actions.report'] # Check if returned report action is correct report_type = 'xlsx' report_action = self.report.print_report(report_type) self.assertDictContainsSubset( { 'type': 'ir.actions.report', 'report_name': self.xlsx_report_name, 'report_type': 'xlsx', }, report_action ) report = report_object._get_report_from_name(self.xlsx_report_name) self.assertEqual(report.report_type, 'xlsx') report_xlsx = report.render(self.report.ids, {}) wb = open_workbook(file_contents=report_xlsx[0]) sheet = wb.sheet_by_index(0) class_name = 'report.%s' % report.report_name self.assertEqual(sheet.cell(0, 0).value, self.env[class_name]._get_report_name()) def test_04_compute_data(self): """Check that the SQL queries work with all filters options""" for filters in [{}] + self.additional_filters: current_filter = self.base_filters.copy() current_filter.update(filters) report = self.model.create(current_filter) report.compute_data_for_report() self.assertGreaterEqual(len(report.account_ids), 1) # Same filters with only one account current_filter = self.base_filters.copy() current_filter.update(filters) current_filter.update({ 'filter_account_ids': [(6, 0, report.account_ids[0].account_id.ids)], }) report2 = self.model.create(current_filter) report2.compute_data_for_report() self.assertEqual(len(report2.account_ids), 1) self.assertEqual(report2.account_ids.name, report.account_ids[0].name) if self._partner_test_is_possible(filters): # Same filters with only one partner report_partner_ids = report.account_ids.mapped('partner_ids') partner_ids = report_partner_ids.mapped('partner_id') current_filter = self.base_filters.copy() current_filter.update(filters) current_filter.update({ 'filter_partner_ids': [(6, 0, partner_ids[0].ids)], }) report3 = self.model.create(current_filter) report3.compute_data_for_report() self.assertGreaterEqual(len(report3.account_ids), 1) report_partner_ids3 = report3.account_ids.mapped('partner_ids') partner_ids3 = report_partner_ids3.mapped('partner_id') self.assertEqual(len(partner_ids3), 1) self.assertEqual( partner_ids3.name, partner_ids[0].name ) # Same filters with only one partner and one account report_partner_ids = report3.account_ids.mapped('partner_ids') report_account_id = report_partner_ids.filtered( lambda p: p.partner_id )[0].report_account_id current_filter = self.base_filters.copy() current_filter.update(filters) current_filter.update({ 'filter_account_ids': [(6, 0, report_account_id.account_id.ids)], 'filter_partner_ids': [(6, 0, partner_ids[0].ids)], }) report4 = self.model.create(current_filter) report4.compute_data_for_report() self.assertEqual(len(report4.account_ids), 1) self.assertEqual(report4.account_ids.name, report_account_id.account_id.name) report_partner_ids4 = report4.account_ids.mapped('partner_ids') partner_ids4 = report_partner_ids4.mapped('partner_id') self.assertEqual(len(partner_ids4), 1) self.assertEqual( partner_ids4.name, partner_ids[0].name ) def _partner_test_is_possible(self, filters): """ :return: a boolean to indicate if partner test is possible with current filters """ return True def _getReportModel(self): """ :return: the report model name """ raise NotImplementedError() def _getQwebReportName(self): """ :return: the qweb report name """ raise NotImplementedError() def _getXlsxReportName(self): """ :return: the xlsx report name """ raise NotImplementedError() def _getXlsxReportActionName(self): """ :return: the xlsx report action name """ raise NotImplementedError() def _getReportTitle(self): """ :return: the report title displayed into the report """ raise NotImplementedError() def _getBaseFilters(self): """ :return: the minimum required filters to generate report """ raise NotImplementedError() def _getAdditionalFiltersToBeTested(self): """ :return: the additional filters to generate report variants """ raise NotImplementedError()