details:   https://code.tryton.org/tryton/commit/adc3fc96c475
branch:    default
user:      Cédric Krier <[email protected]>
date:      Wed Mar 18 12:03:50 2026 +0100
description:
        Add tests for calculating tax rule pattern for countries
diffstat:

 modules/account_tax_rule_country/tests/test_module.py |  207 ++++++++++++++++++
 1 files changed, 207 insertions(+), 0 deletions(-)

diffs (223 lines):

diff -r e97af2f1eb23 -r adc3fc96c475 
modules/account_tax_rule_country/tests/test_module.py
--- a/modules/account_tax_rule_country/tests/test_module.py     Wed Mar 18 
12:01:17 2026 +0100
+++ b/modules/account_tax_rule_country/tests/test_module.py     Wed Mar 18 
12:03:50 2026 +0100
@@ -1,6 +1,8 @@
 # This file is part of Tryton.  The COPYRIGHT file at the top level of
 # this repository contains the full copyright notices and license terms.
 
+from unittest.mock import Mock
+
 from trytond.modules.account.tests import create_chart
 from trytond.modules.company.tests import (
     CompanyTestMixin, create_company, set_company)
@@ -166,5 +168,210 @@
 
             self.assertListEqual(tax_rule.apply(tax, pattern), [tax.id])
 
+    @with_transaction()
+    def test_check_tax_rule_pattern_no_origin(self):
+        "Check tax rule pattern without origin"
+        pool = Pool()
+        InvoiceLine = pool.get('account.invoice.line')
+        invoice_line = InvoiceLine(origin=None, invoice=None)
+
+        pattern = invoice_line._get_tax_rule_pattern()
+
+        self.assertEqual(pattern, pattern | {
+                'from_country': None,
+                'from_subdivision': None,
+                'to_country': None,
+                'to_subdivision': None,
+                })
+
+    @with_transaction()
+    def test_check_tax_rule_pattern_origin_sale_line(self):
+        "Check tax rule pattern with sale line origin"
+        pool = Pool()
+        Address = pool.get('party.address')
+        InvoiceLine = pool.get('account.invoice.line')
+        Location = pool.get('stock.location')
+        Sale = pool.get('sale.sale')
+        SaleLine = pool.get('sale.line')
+
+        country1, country2 = self._create_countries()
+        subdivision1 = country1.subdivisions[0]
+        subdivision2 = country2.subdivisions[0]
+        warehouse = Mock(spec=Location, address=Mock(
+                spec=Address, country=country1, subdivision=subdivision1))
+        invoice_line = InvoiceLine(origin=None, invoice=None)
+        invoice_line.origin = Mock(
+            spec=SaleLine, id=1, warehouse=warehouse,
+            sale=Mock(spec=Sale, shipment_address=Mock(
+                    spec=Address, country=country2, subdivision=subdivision2)))
+
+        for level in range(3):
+            with self.subTest(level=level):
+                pattern = invoice_line._get_tax_rule_pattern()
+
+                self.assertEqual(pattern, pattern | {
+                        'from_country': country1.id,
+                        'from_subdivision': subdivision1.id,
+                        'to_country': country2.id,
+                        'to_subdivision': subdivision2.id,
+                        })
+
+                invoice_line.origin = Mock(
+                    spec=InvoiceLine, id=1, origin=invoice_line.origin)
+
+    @with_transaction()
+    def test_check_tax_rule_pattern_origin_purchase_line(self):
+        "Check tax rule pattern with purchase line origin"
+        pool = Pool()
+        Address = pool.get('party.address')
+        InvoiceLine = pool.get('account.invoice.line')
+        Location = pool.get('stock.location')
+        Purchase = pool.get('purchase.purchase')
+        PurchaseLine = pool.get('purchase.line')
+
+        country1, country2 = self._create_countries()
+        subdivision1 = country1.subdivisions[0]
+        subdivision2 = country2.subdivisions[0]
+        warehouse = Mock(spec=Location, address=Mock(
+                spec=Address, country=country1, subdivision=subdivision1))
+        invoice_line = InvoiceLine(origin=None, invoice=None)
+        invoice_line.origin = Mock(
+            spec=PurchaseLine, id=1, warehouse=warehouse,
+            purchase=Mock(spec=Purchase, invoice_address=Mock(
+                    spec=Address, country=country2, subdivision=subdivision2)))
+        for level in range(3):
+            with self.subTest(level=level):
+                pattern = invoice_line._get_tax_rule_pattern()
+
+                self.assertEqual(pattern, pattern | {
+                        'from_country': country2.id,
+                        'from_subdivision': subdivision2.id,
+                        'to_country': country1.id,
+                        'to_subdivision': subdivision1.id,
+                        })
+                invoice_line.origin = Mock(
+                    spec=InvoiceLine, id=1, origin=invoice_line.origin)
+
+    @with_transaction()
+    def test_check_tax_rule_pattern_origin_stock_move_from_location(self):
+        "Check tax rule pattern with stock move from location origin"
+        pool = Pool()
+        Address = pool.get('party.address')
+        InvoiceLine = pool.get('account.invoice.line')
+        Location = pool.get('stock.location')
+        Move = pool.get('stock.move')
+
+        country, _ = self._create_countries()
+        subdivision = country.subdivisions[0]
+        warehouse = Mock(spec=Location, address=Mock(
+                spec=Address, country=country, subdivision=subdivision))
+        invoice_line = InvoiceLine(origin=None, invoice=None)
+        invoice_line.origin = Mock(
+            spec=Move, id=1,
+            from_location=Mock(spec=Location, warehouse=warehouse))
+        for level in range(3):
+            with self.subTest(level=level):
+                pattern = invoice_line._get_tax_rule_pattern()
+
+                self.assertEqual(pattern, pattern | {
+                        'from_country': country.id,
+                        'from_subdivision': subdivision.id,
+                        })
+
+                invoice_line.origin = Mock(
+                    spec=InvoiceLine, id=1, origin=invoice_line.origin)
+
+    @with_transaction()
+    def test_check_tax_rule_pattern_origin_shipment_out_return(self):
+        "Check tax rule pattern with shipment out return origin"
+        pool = Pool()
+        Address = pool.get('party.address')
+        InvoiceLine = pool.get('account.invoice.line')
+        Location = pool.get('stock.location')
+        Move = pool.get('stock.move')
+        ShipmentOutReturn = pool.get('stock.shipment.out.return')
+
+        country, _ = self._create_countries()
+        subdivision = country.subdivisions[0]
+        invoice_line = InvoiceLine(origin=None, invoice=None)
+        invoice_line.origin = Mock(
+            spec=Move, id=1,
+            from_location=Mock(spec=Location, warehouse=None),
+            origin=Mock(spec=ShipmentOutReturn, delivery_address=Mock(
+                    spec=Address, country=country, subdivision=subdivision)))
+
+        for level in range(3):
+            with self.subTest(level=level):
+                pattern = invoice_line._get_tax_rule_pattern()
+
+                self.assertEqual(pattern, pattern | {
+                        'from_country': country.id,
+                        'from_subdivision': subdivision.id,
+                        })
+
+                invoice_line.origin = Mock(
+                    spec=InvoiceLine, id=1, origin=invoice_line.origin)
+
+    @with_transaction()
+    def test_check_tax_rule_pattern_origin_stock_move_to_location(self):
+        "Check tax rule pattern with stock move to location origin"
+        pool = Pool()
+        Address = pool.get('party.address')
+        InvoiceLine = pool.get('account.invoice.line')
+        Location = pool.get('stock.location')
+        Move = pool.get('stock.move')
+
+        country, _ = self._create_countries()
+        subdivision = country.subdivisions[0]
+        warehouse = Mock(spec=Location, address=Mock(
+                spec=Address, country=country, subdivision=subdivision))
+        invoice_line = InvoiceLine(origin=None, invoice=None)
+        invoice_line.origin = Mock(
+            spec=Move, id=1,
+            to_location=Mock(spec=Location, warehouse=warehouse))
+
+        for level in range(3):
+            with self.subTest(level=level):
+                pattern = invoice_line._get_tax_rule_pattern()
+
+                self.assertEqual(pattern, pattern | {
+                        'to_country': country.id,
+                        'to_subdivision': subdivision.id,
+                        })
+
+                invoice_line.origin = Mock(
+                    spec=InvoiceLine, id=1, origin=invoice_line.origin)
+
+    @with_transaction()
+    def test_check_tax_rule_pattern_origin_shipment_out(self):
+        "Check tax rule pattern with shipment out origin"
+        pool = Pool()
+        Address = pool.get('party.address')
+        InvoiceLine = pool.get('account.invoice.line')
+        Location = pool.get('stock.location')
+        Move = pool.get('stock.move')
+        ShipmentOut = pool.get('stock.shipment.out')
+
+        country, _ = self._create_countries()
+        subdivision = country.subdivisions[0]
+        invoice_line = InvoiceLine(origin=None, invoice=None)
+        invoice_line.origin = Mock(
+            spec=Move, id=1,
+            to_location=Mock(spec=Location, warehouse=None),
+            origin=Mock(spec=ShipmentOut, delivery_address=Mock(
+                    spec=Address, country=country, subdivision=subdivision)))
+
+        for level in range(3):
+            with self.subTest(level=level):
+                pattern = invoice_line._get_tax_rule_pattern()
+
+                self.assertEqual(pattern, pattern | {
+                        'to_country': country.id,
+                        'to_subdivision': subdivision.id,
+                        })
+
+                invoice_line.origin = Mock(
+                    spec=InvoiceLine, id=1, origin=invoice_line.origin)
+
 
 del ModuleTestCase

Reply via email to