You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
246 lines
8.4 KiB
246 lines
8.4 KiB
|
|
# 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)
|
|
cls.report.compute_data_for_report()
|
|
|
|
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()
|