Files
enterprise-addons/sale_external_tax/tests/test_portal.py
T

87 lines
3.9 KiB
Python

# Part of Odoo. See LICENSE file for full copyright and licensing details.
from unittest.mock import patch
from odoo.fields import Command
from odoo.tests import tagged
from odoo.addons.base.tests.common import HttpCaseWithUserPortal
@tagged('post_install', '-at_install')
class TestSaleExternalTaxesSalePortal(HttpCaseWithUserPortal):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.fp_external = cls.env['account.fiscal.position'].create({
'name': 'External',
})
cls.product_test = cls.env['product.product'].create({
'name': 'Test product',
'list_price': 10.00,
'standard_price': 10.00,
'supplier_taxes_id': None,
})
def _create_sale_order(self, partner):
return self.env['sale.order'].create({
'name': 'test',
'partner_id': partner.id,
'fiscal_position_id': self.fp_external.id,
'date_order': '2023-01-01',
'order_line': [
Command.create({
'product_id': self.product_test.id,
'tax_ids': None,
'price_unit': self.product_test.list_price,
}),
Command.create({
'name': 'Optional Products',
'display_type': 'line_section',
'is_optional': True,
}),
Command.create({
'name': 'optional product',
'price_unit': 1,
'product_uom_qty': 0,
'product_id': self.env['product.product'].create({'name': 'optional product'}).id,
}),
],
})
# TODO: sale_management is not a dependency of sale_external_tax...
def test_01_portal_test_optional_products(self):
""" Make sure that adding, deleting and changing the qty on optional products calculates taxes externally. """
sale_management = self.env['ir.module.module']._get('sale_management')
if sale_management.state != 'installed':
self.skipTest("sale_management module is not installed")
self.env['product.pricelist'].search([]).unlink()
portal_partner = self.env['res.users'].sudo().search([('login', '=', 'portal')]).partner_id
portal_partner.write({
'state_id': self.env.ref('base.state_us_25').id,
'zip': '07002',
'country_id': self.env.ref('base.us').id,
})
order = self._create_sale_order(portal_partner)
# Moving the portal user to order.company_id still results in
# request.env.company.id == 1 in the /my/quotes controller
# when called through start_tour. To work around this disable
# multi-company record rules just for this test.
self.env.ref('sale.sale_order_comp_rule').active = False
self.env.ref('sale.sale_order_line_comp_rule').active = False
# must be sent to the user, so he can see it
order.action_quotation_sent()
mixin_path = 'odoo.addons.account_external_tax.models.account_external_tax_mixin.AccountExternalTaxMixin'
with patch(f'{mixin_path}._get_and_set_external_taxes_on_eligible_records') as mocked_get_and_set, \
patch(f'{mixin_path}._compute_is_tax_computed_externally', lambda self: self.write({'is_tax_computed_externally': True})):
self.start_tour('/', 'sale_external_optional_products', login='portal')
mocked_get_and_set.assert_called()
# There should be 3 calls:
# 1/ when the quote is displayed via portal_order_page()
# 2/ when the tour increments the quantity on the optional product
# 3/ when the tour decrements the quantity on the optional product
self.assertEqual(mocked_get_and_set.call_count, 3, 'External taxes were not calculated enough times during this tour.')