|
| 1 | +# Copyright 2025 Geraldo Lopez |
| 2 | +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). |
| 3 | + |
| 4 | +from unittest.mock import MagicMock, Mock |
| 5 | + |
| 6 | +from odoo.tests import common |
| 7 | + |
| 8 | +from ..models.kpimatrix import COMPANY_NAMES_DISPLAY_LIMIT, KpiMatrix |
| 9 | + |
| 10 | + |
| 11 | +class TestKPIMatrixAccountNames(common.TransactionCase): |
| 12 | + """Unit tests for KpiMatrix._get_account_name() method enhancements""" |
| 13 | + |
| 14 | + def _create_mock_env_kpimatrix(self, companies): |
| 15 | + """Helper to create KpiMatrix instances""" |
| 16 | + # Create a proper mock environment for KpiMatrix |
| 17 | + mock_env = MagicMock() |
| 18 | + # Mock the required models and services |
| 19 | + mock_lang_model = Mock() |
| 20 | + mock_lang_model._lang_get.return_value = Mock() |
| 21 | + mock_env.__getitem__.side_effect = lambda key: { |
| 22 | + "res.lang": mock_lang_model, |
| 23 | + "mis.report.style": Mock(), |
| 24 | + "account.account": Mock(), |
| 25 | + }.get(key, Mock()) |
| 26 | + # Mock user with language |
| 27 | + mock_env.user.lang = "en_US" |
| 28 | + mock_env._ = self.env._ |
| 29 | + # Create KpiMatrix instance with chosen companies |
| 30 | + return KpiMatrix( |
| 31 | + mock_env, multi_company=len(companies) > 1, query_companies=companies |
| 32 | + ) |
| 33 | + |
| 34 | + def _create_mock_account(self, code, name, company_ids): |
| 35 | + """Helper to create mock account objects""" |
| 36 | + account = Mock() |
| 37 | + account.code = code |
| 38 | + account.name = name |
| 39 | + account.company_ids = company_ids or [] |
| 40 | + return account |
| 41 | + |
| 42 | + def _create_nbr_companies(self, number_of_companies): |
| 43 | + """Helper to create company objects""" |
| 44 | + companies = self.env["res.company"] |
| 45 | + for name in [f"Company {i + 1}" for i in range(number_of_companies)]: |
| 46 | + companies |= self.env["res.company"].create({"name": name}) |
| 47 | + return companies |
| 48 | + |
| 49 | + def test_get_account_name_single_company(self): |
| 50 | + """Test account name without company info in single company mode""" |
| 51 | + company = self._create_nbr_companies(1) |
| 52 | + single_company_matrix = self._create_mock_env_kpimatrix(company) |
| 53 | + account = self._create_mock_account("100", "Cash", company) |
| 54 | + result = single_company_matrix._get_account_name(account) |
| 55 | + self.assertEqual( |
| 56 | + result, |
| 57 | + "100 Cash", |
| 58 | + "Account name are not displayed correctly on single company", |
| 59 | + ) |
| 60 | + |
| 61 | + def test_get_account_name_with_company_ids_multiple(self): |
| 62 | + """Test account name with company_ids field containing multiple |
| 63 | + companies (≤ 3)""" |
| 64 | + companies = self._create_nbr_companies(COMPANY_NAMES_DISPLAY_LIMIT) |
| 65 | + account = self._create_mock_account("300", "Receivables", companies) |
| 66 | + kpi_matrix = self._create_mock_env_kpimatrix(companies) |
| 67 | + result = kpi_matrix._get_account_name(account) |
| 68 | + self.assertEqual( |
| 69 | + result, |
| 70 | + "300 Receivables [Company 1, Company 2, Company 3]", |
| 71 | + "Company names on account name are not displayed correctly", |
| 72 | + ) |
| 73 | + |
| 74 | + def test_get_account_name_with_company_ids_many(self): |
| 75 | + """Test account name with company_ids field containing > N companies""" |
| 76 | + companies = self._create_nbr_companies(COMPANY_NAMES_DISPLAY_LIMIT + 1) |
| 77 | + account = self._create_mock_account("400", "Payables", companies) |
| 78 | + kpi_matrix = self._create_mock_env_kpimatrix(companies) |
| 79 | + result = kpi_matrix._get_account_name(account) |
| 80 | + self.assertEqual( |
| 81 | + result, |
| 82 | + "400 Payables [Company 1, Company 2, Company 3, and 1 more]", |
| 83 | + "Company names on account name should be truncated", |
| 84 | + ) |
0 commit comments