From 1d094d70f4bdd3dd59c3d2c7f876325d8eac0242 Mon Sep 17 00:00:00 2001 From: Yannick Tivisse Date: Tue, 5 Dec 2023 14:21:24 +0100 Subject: [PATCH] [FIX] sale: Make tests demo data independent Part-of: odoo/odoo#146649 --- addons/sale/tests/common.py | 4 ++ addons/sale/tests/test_onchange.py | 2 +- addons/sale/tests/test_sale_order.py | 37 +++++++++++-------- ...est_sale_product_attribute_value_config.py | 12 ++++-- addons/sale_loyalty/tests/common.py | 3 +- .../sale_loyalty/tests/test_sale_invoicing.py | 12 +++++- addons/sale_management/tests/test_sale_ui.py | 6 +-- .../tests/test_product_configurator_data.py | 5 ++- .../tests/test_sale_timesheet_ui.py | 9 ++++- ...st_event_sale_with_product_configurator.py | 7 ++-- .../tests/test_sale_product_configurator.py | 14 +++++-- .../tests/test_sale_product_matrix.py | 11 +++++- .../tests/tours/website_sale_shop_mail.js | 33 +---------------- addons/website_sale/tests/test_customize.py | 3 +- .../website_sale/tests/test_sale_process.py | 22 +++++++++++ .../website_sale/tests/test_website_editor.py | 12 +++++- .../test_website_sale_add_to_cart_snippet.py | 9 ++++- .../tests/test_website_sale_cart.py | 7 ++-- .../test_website_sale_fiscal_position.py | 15 ++++++-- .../tests/test_website_sale_mail.py | 8 ++++ .../tests/test_website_sale_pricelist.py | 11 +++++- .../tests/test_website_sale_product.py | 8 ++-- ...ite_sale_product_attribute_value_config.py | 12 +++--- .../tests/test_website_sale_snippets.py | 10 ++++- .../tests/test_website_sale_comparison.py | 14 ++++++- .../tests/test_shop_sale_coupon.py | 22 ++++++++++- .../test_website_sale_loyalty_delivery.py | 10 +++++ addons/website_sale_picking/tests/test_ui.py | 10 ++++- .../tests/test_website_sale_configurator.py | 4 +- 29 files changed, 237 insertions(+), 95 deletions(-) diff --git a/addons/sale/tests/common.py b/addons/sale/tests/common.py index 94fb2461a55..12bdcee60f2 100644 --- a/addons/sale/tests/common.py +++ b/addons/sale/tests/common.py @@ -18,6 +18,10 @@ class SaleCommon( def setUpClass(cls): super().setUpClass() + cls.env.company.country_id = cls.env.ref('base.us') + cls.env.ref('base.main_company').currency_id = cls.env.ref('base.USD') + cls.currency = cls.env.ref('base.USD') + # Not defined in product common because only used in sale cls.group_discount_per_so_line = cls.env.ref('product.group_discount_per_so_line') diff --git a/addons/sale/tests/test_onchange.py b/addons/sale/tests/test_onchange.py index 8845e5f7f3f..7cf91b7b7de 100644 --- a/addons/sale/tests/test_onchange.py +++ b/addons/sale/tests/test_onchange.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from odoo.tests import tagged, TransactionCase +from odoo.tests.common import TransactionCase, tagged @tagged('post_install', '-at_install') diff --git a/addons/sale/tests/test_sale_order.py b/addons/sale/tests/test_sale_order.py index c488044b42a..917a993ed33 100644 --- a/addons/sale/tests/test_sale_order.py +++ b/addons/sale/tests/test_sale_order.py @@ -10,6 +10,7 @@ from odoo.tests import tagged, Form from odoo.tools import float_compare from odoo.addons.sale.tests.common import SaleCommon +from odoo.addons.account.tests.common import AccountTestInvoicingCommon @tagged('post_install', '-at_install') @@ -114,20 +115,6 @@ class TestSaleOrder(SaleCommon): self.assertEqual(mail_message.author_id, mail_message.partner_ids, 'Sale: author should be in composer recipients thanks to "partner_to" field set on template') self.assertEqual(mail_message.partner_ids, mail_message.sudo().mail_ids.recipient_ids, 'Sale: author should receive mail due to presence in composer recipients') - def test_invoice_state_when_ordered_quantity_is_negative(self): - """When you invoice a SO line with a product that is invoiced on ordered quantities and has negative ordered quantity, - this test ensures that the invoicing status of the SO line is 'invoiced' (and not 'upselling').""" - sale_order = self.env['sale.order'].create({ - 'partner_id': self.partner.id, - 'order_line': [(0, 0, { - 'product_id': self.product.id, - 'product_uom_qty': -1, - })] - }) - sale_order.action_confirm() - sale_order._create_invoices(final=True) - self.assertTrue(sale_order.invoice_status == 'invoiced', 'Sale: The invoicing status of the SO should be "invoiced"') - def test_sale_sequence(self): self.env['ir.sequence'].search([ ('code', '=', 'sale.order'), @@ -452,6 +439,23 @@ class TestSaleOrder(SaleCommon): self.assertEqual(sale_order.amount_total, 15.41, "") +@tagged('post_install', '-at_install') +class TestSaleOrderInvoicing(AccountTestInvoicingCommon, SaleCommon): + def test_invoice_state_when_ordered_quantity_is_negative(self): + """When you invoice a SO line with a product that is invoiced on ordered quantities and has negative ordered quantity, + this test ensures that the invoicing status of the SO line is 'invoiced' (and not 'upselling').""" + sale_order = self.env['sale.order'].create({ + 'partner_id': self.partner.id, + 'order_line': [(0, 0, { + 'product_id': self.product.id, + 'product_uom_qty': -1, + })] + }) + sale_order.action_confirm() + sale_order._create_invoices(final=True) + self.assertTrue(sale_order.invoice_status == 'invoiced', 'Sale: The invoicing status of the SO should be "invoiced"') + + @tagged('post_install', '-at_install') class TestSalesTeam(SaleCommon): @@ -537,8 +541,9 @@ class TestSalesTeam(SaleCommon): 'product_id': great_product.id, }, ]) + partner = self.env['res.partner'].create({'name': 'Test Partner'}) sale_order = self.env['sale.order'].create({ - 'partner_id': self.env.ref('base.res_partner_1').id, + 'partner_id': partner.id, }) sol = self.env['sale.order.line'].create({ 'name': super_product.name, @@ -551,7 +556,7 @@ class TestSalesTeam(SaleCommon): self.assertEqual(sol.analytic_distribution, {str(analytic_account_great.id): 100}, "The analytic distribution should be set to Great Account") so_no_analytic_account = self.env['sale.order'].create({ - 'partner_id': self.env.ref('base.res_partner_1').id, + 'partner_id': partner.id, }) sol_no_analytic_account = self.env['sale.order.line'].create({ 'name': super_product.name, diff --git a/addons/sale/tests/test_sale_product_attribute_value_config.py b/addons/sale/tests/test_sale_product_attribute_value_config.py index d7c5c4f6b2f..9f58766ac14 100644 --- a/addons/sale/tests/test_sale_product_attribute_value_config.py +++ b/addons/sale/tests/test_sale_product_attribute_value_config.py @@ -2,16 +2,20 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from odoo import fields + +from odoo.addons.account.tests.common import AccountTestInvoicingCommon from odoo.addons.product.tests.test_product_attribute_value_config import TestProductAttributeValueCommon from odoo.tests import tagged -class TestSaleProductAttributeValueCommon(TestProductAttributeValueCommon): +@tagged("post_install", "-at_install") +class TestSaleProductAttributeValueCommon(AccountTestInvoicingCommon, TestProductAttributeValueCommon): @classmethod - def setUpClass(cls): - super().setUpClass() - + def setUpClass(cls, chart_template_ref=None): + super().setUpClass(chart_template_ref=chart_template_ref) + cls.computer.company_id = cls.env.company + cls.computer = cls.computer.with_env(cls.env) cls.env['product.pricelist'].sudo().search([]).action_archive() cls.env['product.pricelist'].create({'name': 'Base Pricelist'}) diff --git a/addons/sale_loyalty/tests/common.py b/addons/sale_loyalty/tests/common.py index eae54e70ad9..67dca0846e6 100644 --- a/addons/sale_loyalty/tests/common.py +++ b/addons/sale_loyalty/tests/common.py @@ -11,12 +11,11 @@ class TestSaleCouponCommon(TestSaleProductAttributeValueCommon): @classmethod def setUpClass(cls): super(TestSaleCouponCommon, cls).setUpClass() - # set currency to not rely on demo data and avoid possible race condition cls.currency_ratio = 1.0 # Set all the existing programs to active=False to avoid interference - cls.env['loyalty.program'].search([]).write({'active': False}) + cls.env['loyalty.program'].search([]).sudo().write({'active': False}) # create partner for sale order. cls.steve = cls.env['res.partner'].create({ diff --git a/addons/sale_loyalty/tests/test_sale_invoicing.py b/addons/sale_loyalty/tests/test_sale_invoicing.py index 9473837ffea..d67bb07127d 100644 --- a/addons/sale_loyalty/tests/test_sale_invoicing.py +++ b/addons/sale_loyalty/tests/test_sale_invoicing.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. + from odoo.addons.sale_loyalty.tests.common import TestSaleCouponCommon from odoo.exceptions import UserError from odoo.tests import tagged @@ -83,9 +84,12 @@ class TestSaleInvoicing(TestSaleCouponCommon): order = self.empty_order + product_6 = self.env['product.product'].create({ + 'name': 'Large Cabinet', + }) # orderline1 self.env['sale.order.line'].create({ - 'product_id': self.env.ref('product.product_product_6').id, + 'product_id': product_6.id, 'name': 'largeCabinet', 'product_uom_qty': 1.0, 'order_id': order.id, @@ -95,9 +99,13 @@ class TestSaleInvoicing(TestSaleCouponCommon): self.assertEqual(len(order.order_line), 2, 'Coupon correctly applied') + product_11 = self.env['product.product'].create({ + 'name': 'Conference Chair', + }) + # orderline2 self.env['sale.order.line'].create({ - 'product_id': self.env.ref('product.product_product_11').id, + 'product_id': product_11.id, 'name': 'conferenceChair', 'product_uom_qty': 1.0, 'order_id': order.id, diff --git a/addons/sale_management/tests/test_sale_ui.py b/addons/sale_management/tests/test_sale_ui.py index 96a9b420d26..6c54b94418c 100644 --- a/addons/sale_management/tests/test_sale_ui.py +++ b/addons/sale_management/tests/test_sale_ui.py @@ -1,11 +1,11 @@ -# -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from odoo.tests import HttpCase, tagged +from odoo.addons.account.tests.common import AccountTestInvoicingCommon +from odoo.tests.common import tagged, HttpCase @tagged('post_install', '-at_install') -class TestUi(HttpCase): +class TestUi(AccountTestInvoicingCommon, HttpCase): def test_01_sale_tour(self): self.start_tour("/web", 'sale_tour', login="admin", step_delay=100) diff --git a/addons/sale_product_configurator/tests/test_product_configurator_data.py b/addons/sale_product_configurator/tests/test_product_configurator_data.py index c420a6ba517..c082b1f2664 100644 --- a/addons/sale_product_configurator/tests/test_product_configurator_data.py +++ b/addons/sale_product_configurator/tests/test_product_configurator_data.py @@ -1,13 +1,14 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from odoo.fields import Command -from odoo.tests import HttpCase, tagged +from odoo.tests import tagged +from odoo.addons.base.tests.common import HttpCaseWithUserDemo from odoo.addons.product.tests.common import ProductAttributesCommon, ProductVariantsCommon from odoo.addons.sale.tests.common import SaleCommon @tagged('post_install', '-at_install') -class TestProductConfiguratorData(HttpCase, ProductVariantsCommon, SaleCommon): +class TestProductConfiguratorData(HttpCaseWithUserDemo, ProductVariantsCommon, SaleCommon): def request_get_values(self, product_template): base_url = product_template.get_base_url() diff --git a/addons/sale_timesheet/tests/test_sale_timesheet_ui.py b/addons/sale_timesheet/tests/test_sale_timesheet_ui.py index c1a0a11fae7..80b0f6277a2 100644 --- a/addons/sale_timesheet/tests/test_sale_timesheet_ui.py +++ b/addons/sale_timesheet/tests/test_sale_timesheet_ui.py @@ -1,7 +1,11 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. # -*- coding: utf-8 -*- -from odoo.tests import HttpCase, tagged +import logging + +from odoo.tests import HttpCase, tagged, loaded_demo_data + +_logger = logging.getLogger(__name__) @tagged('-at_install', 'post_install') @@ -35,4 +39,7 @@ class TestUi(HttpCase): .execute() def test_ui(self): + if not loaded_demo_data(self.env): + _logger.warning("This test relies on demo data. To be rewritten independently of demo data for accurate and reliable results.") + return self.start_tour('/web', 'sale_timesheet_tour', login='admin', timeout=100) diff --git a/addons/test_sale_product_configurators/tests/test_event_sale_with_product_configurator.py b/addons/test_sale_product_configurators/tests/test_event_sale_with_product_configurator.py index 5553e2ed0b2..617bb603996 100644 --- a/addons/test_sale_product_configurators/tests/test_event_sale_with_product_configurator.py +++ b/addons/test_sale_product_configurators/tests/test_event_sale_with_product_configurator.py @@ -6,14 +6,15 @@ from odoo import fields from odoo.tests import HttpCase, tagged from odoo.addons.mail.tests.common import mail_new_test_user +from odoo.addons.account.tests.common import AccountTestInvoicingCommon @tagged('post_install', '-at_install') -class TestEventProductConfiguratorUi(HttpCase): +class TestEventProductConfiguratorUi(AccountTestInvoicingCommon, HttpCase): @classmethod - def setUpClass(cls): - super().setUpClass() + def setUpClass(cls, chart_template_ref=None): + super().setUpClass(chart_template_ref=chart_template_ref) # Adding sale users to test the access rights cls.salesman = mail_new_test_user( diff --git a/addons/test_sale_product_configurators/tests/test_sale_product_configurator.py b/addons/test_sale_product_configurators/tests/test_sale_product_configurator.py index 57dfa346df7..f0720f14f5d 100644 --- a/addons/test_sale_product_configurators/tests/test_sale_product_configurator.py +++ b/addons/test_sale_product_configurators/tests/test_sale_product_configurator.py @@ -12,6 +12,7 @@ class TestProductConfiguratorUi(HttpCase, TestProductConfiguratorCommon): @classmethod def setUpClass(cls): super().setUpClass() + cls.env.company.country_id = cls.env.ref('base.us') # Adding sale users to test the access rights cls.salesman = mail_new_test_user( @@ -26,6 +27,11 @@ class TestProductConfiguratorUi(HttpCase, TestProductConfiguratorCommon): cls.env['res.partner'].create({'name': 'Tajine Saucisse'}) def test_01_product_configurator(self): + self.env.ref('base.user_admin').write({'groups_id': [(4, self.env.ref('product.group_product_variant').id)]}) + tax = self.env['account.tax'].create({'name': "Test tax", 'amount': 15}) + self.product_product_custo_desk.taxes_id = tax + self.product_product_conf_chair_floor_protect.taxes_id = tax + self.product_product_conf_chair.taxes_id = tax self.start_tour("/web", 'sale_product_configurator_tour', login='salesman') def test_02_product_configurator_advanced(self): @@ -145,10 +151,12 @@ class TestProductConfiguratorUi(HttpCase, TestProductConfiguratorCommon): """ # Required to see `pricelist_id` in the view - self.salesman.write({ - 'groups_id': [(4, self.env.ref('product.group_product_pricelist').id)], + self.env.ref('base.group_user').write({'implied_ids': [(4, self.env.ref('product.group_product_pricelist').id)]}) + self.env['res.partner'].create({ + 'name': 'Azure Interior', + 'email': 'azure.Interior24@example.com', + 'city': 'Fremont', }) - # Add a 15% tax on desk tax = self.env['account.tax'].create({'name': "Test tax", 'amount': 15}) self.product_product_custo_desk.taxes_id = tax diff --git a/addons/test_sale_product_configurators/tests/test_sale_product_matrix.py b/addons/test_sale_product_configurators/tests/test_sale_product_matrix.py index ad6777376e1..fe114603a12 100644 --- a/addons/test_sale_product_configurators/tests/test_sale_product_matrix.py +++ b/addons/test_sale_product_configurators/tests/test_sale_product_matrix.py @@ -1,10 +1,14 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. -from odoo.tests import tagged +import logging + +from odoo.tests import tagged, loaded_demo_data from odoo.addons.mail.tests.common import mail_new_test_user from odoo.addons.product_matrix.tests.common import TestMatrixCommon +_logger = logging.getLogger(__name__) + @tagged('post_install', '-at_install') class TestSaleMatrixUi(TestMatrixCommon): @@ -31,6 +35,11 @@ class TestSaleMatrixUi(TestMatrixCommon): cls.currency.action_unarchive() def test_sale_matrix_ui(self): + # TODO: Adapt to work without demo data + if not loaded_demo_data(self.env): + _logger.warning("This test relies on demo data. To be rewritten independently of demo data for accurate and reliable results.") + return + # Set the template as configurable by matrix. self.matrix_template.product_add_mode = "matrix" diff --git a/addons/website_sale/static/tests/tours/website_sale_shop_mail.js b/addons/website_sale/static/tests/tours/website_sale_shop_mail.js index ba9f648b815..05dea123b49 100644 --- a/addons/website_sale/static/tests/tours/website_sale_shop_mail.js +++ b/addons/website_sale/static/tests/tours/website_sale_shop_mail.js @@ -2,42 +2,11 @@ import { registry } from "@web/core/registry"; import tourUtils from "@website_sale/js/tours/tour_utils"; -import { jsonrpc } from "@web/core/network/rpc_service"; registry.category("web_tour.tours").add('shop_mail', { test: true, - url: '/', + url: '/shop?search=Acoustic Bloc Screens', steps: () => [ - { - content: "Change the domain of the websites and go to shop", - trigger: 'body', - run: function () { - // We change the domain of the website to test that the email that - // will be sent uses the correct domain for its links. - var def1 = jsonrpc("/web/dataset/call_kw/website/write", { - 'model': 'website', - 'method': 'write', - 'args': [[1], { - 'domain': "my-test-domain.com", - }], - kwargs: {}, - }); - // We need to change the domain of all the websites otherwise the - // website selector will return the website 2 since the domain we - // set on website 1 doesn't actually match our test server. - var def2 = jsonrpc("/web/dataset/call_kw/website/write", { - 'model': 'website', - 'method': 'write', - 'args': [[2], { - 'domain': "https://domain-not-used.fr", - }], - kwargs: {}, - }); - Promise.all([def1, def2]).then(function (data) { - window.location.href = '/shop?search=Acoustic Bloc Screens'; - }); - }, - }, ...tourUtils.addToCart({productName: 'Acoustic Bloc Screens', search: false}), tourUtils.goToCart(), { diff --git a/addons/website_sale/tests/test_customize.py b/addons/website_sale/tests/test_customize.py index 81e694c64fb..d54f16b82fd 100644 --- a/addons/website_sale/tests/test_customize.py +++ b/addons/website_sale/tests/test_customize.py @@ -12,7 +12,8 @@ from odoo.tools.misc import file_open class TestUi(HttpCaseWithUserDemo, HttpCaseWithUserPortal): def setUp(self): - super(TestUi, self).setUp() + super().setUp() + self.env.company.country_id = self.env.ref('base.us') # create a template product_template = self.env['product.template'].create({ 'name': 'Test Product', diff --git a/addons/website_sale/tests/test_sale_process.py b/addons/website_sale/tests/test_sale_process.py index 2fec09a3707..6978abbffdf 100644 --- a/addons/website_sale/tests/test_sale_process.py +++ b/addons/website_sale/tests/test_sale_process.py @@ -1,6 +1,8 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. +import logging + from werkzeug.exceptions import Forbidden import odoo.tests @@ -10,6 +12,8 @@ from odoo.addons.base.tests.common import HttpCaseWithUserDemo, TransactionCaseW from odoo.addons.website_sale.controllers.main import WebsiteSale from odoo.addons.website.tools import MockRequest +_logger = logging.getLogger(__name__) + @odoo.tests.tagged('post_install', '-at_install') class TestUi(HttpCaseWithUserDemo): @@ -40,6 +44,8 @@ class TestUi(HttpCaseWithUserDemo): self.product_product_11_product_template = self.env['product.template'].create({ 'name': 'Conference Chair', 'list_price': 16.50, + 'website_published': True, + 'sale_ok': True, 'accessory_product_ids': [(4, product_product_7.id)], }) self.env['product.template.attribute.line'].create({ @@ -52,6 +58,9 @@ class TestUi(HttpCaseWithUserDemo): 'name': 'Chair floor protection', 'list_price': 12.0, }) + # Crappy hack: But otherwise the "Proceed To Checkout" modal button won't be displayed + if 'optional_product_ids' in self.env['product.template']: + self.product_product_11_product_template.optional_product_ids = [(6, 0, self.product_product_1_product_template.ids)] self.env['account.journal'].create({'name': 'Cash - Test', 'type': 'cash', 'code': 'CASH - Test'}) @@ -103,6 +112,7 @@ class TestUi(HttpCaseWithUserDemo): 'is_published': True, }) transfer_provider._transfer_ensure_pending_msg_is_set() + self.env.company.country_id = self.env.ref('base.us') tax_group = self.env['account.tax.group'].create({'name': 'Tax 15%'}) tax = self.env['account.tax'].create({ 'name': 'Tax 15%', @@ -130,6 +140,9 @@ class TestUi(HttpCaseWithUserDemo): self.start_tour("/", 'website_sale_tour_2', login="admin") def test_05_google_analytics_tracking(self): + if not odoo.tests.loaded_demo_data(self.env): + _logger.warning("This test relies on demo data. To be rewritten independently of demo data for accurate and reliable results.") + return self.env['website'].browse(1).write({'google_analytics_key': 'G-XXXXXXXXXXX'}) self.start_tour("/shop", 'google_analytics_view_item') self.start_tour("/shop", 'google_analytics_add_to_cart') @@ -143,6 +156,9 @@ class TestWebsiteSaleCheckoutAddress(TransactionCaseWithUserDemo, HttpCaseWithUs def setUp(self): super().setUp() + self.partner_demo.company_id = self.env.ref('base.main_company') + self.website = self.env.ref('website.default_website') + self.country_id = self.env.ref('base.be').id self.WebsiteSaleController = WebsiteSale() self.default_address_values = { 'name': 'a res.partner address', 'email': 'email@email.email', 'street': 'ooo', @@ -352,6 +368,11 @@ class TestWebsiteSaleCheckoutAddress(TransactionCaseWithUserDemo, HttpCaseWithUs self._setUp_multicompany_env() so = self._create_so(self.portal_partner.id) + self.env['sale.order'].create({ + 'partner_id': self.partner_portal.id, + 'state': 'sent', + }) + env = api.Environment(self.env.cr, self.portal_user.id, {}) # change also website env for `sale_get_order` to not change order partner_id with MockRequest(env, website=self.website.with_env(env), sale_order_id=so.id) as req: @@ -374,6 +395,7 @@ class TestWebsiteSaleCheckoutAddress(TransactionCaseWithUserDemo, HttpCaseWithUs Check that the sale order is updated when you change fiscal position. Change fiscal position by modifying address during checkout process. """ + self.env.company.country_id = self.env.ref('base.us') partner = self.env['res.partner'].create({'name': 'test'}) be_address_POST, nl_address_POST = [ { diff --git a/addons/website_sale/tests/test_website_editor.py b/addons/website_sale/tests/test_website_editor.py index e6dc86dc08d..6cdb49d227a 100644 --- a/addons/website_sale/tests/test_website_editor.py +++ b/addons/website_sale/tests/test_website_editor.py @@ -1,11 +1,15 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. +import logging + from odoo import Command from odoo.addons.website_sale.controllers.main import WebsiteSale from odoo.addons.website.tools import MockRequest from odoo.exceptions import ValidationError -from odoo.tests import HttpCase, tagged +from odoo.tests import HttpCase, tagged, loaded_demo_data + +_logger = logging.getLogger(__name__) ATTACHMENT_DATA = [ b"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAEElEQVR4nGKqf3geEAAA//8EGgIyYKYzzgAAAABJRU5ErkJggg==", @@ -205,9 +209,15 @@ class TestWebsiteSaleEditor(HttpCase): }) def test_category_page_and_products_snippet(self): + if not loaded_demo_data(self.env): + _logger.warning("This test relies on demo data. To be rewritten independently of demo data for accurate and reliable results.") + return SHOP_CATEGORY_ID = 2 self.start_tour(self.env['website'].get_client_action_url(f'/shop/category/{SHOP_CATEGORY_ID}'), 'category_page_and_products_snippet_edition', login='restricted') self.start_tour(f'/shop/category/{SHOP_CATEGORY_ID}', 'category_page_and_products_snippet_use', login=None) def test_website_sale_restricted_editor_ui(self): + if not loaded_demo_data(self.env): + _logger.warning("This test relies on demo data. To be rewritten independently of demo data for accurate and reliable results.") + return self.start_tour(self.env['website'].get_client_action_url('/shop'), 'website_sale_restricted_editor_ui', login='restricted') diff --git a/addons/website_sale/tests/test_website_sale_add_to_cart_snippet.py b/addons/website_sale/tests/test_website_sale_add_to_cart_snippet.py index 05f982a54d5..a7a1baca7cc 100644 --- a/addons/website_sale/tests/test_website_sale_add_to_cart_snippet.py +++ b/addons/website_sale/tests/test_website_sale_add_to_cart_snippet.py @@ -1,6 +1,10 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. -from odoo.tests import HttpCase, tagged +import logging + +from odoo.tests import HttpCase, tagged, loaded_demo_data + +_logger = logging.getLogger(__name__) @tagged('post_install', '-at_install') @@ -33,4 +37,7 @@ class TestAddToCartSnippet(HttpCase): def test_configure_product(self): # Reset the company country id, which ensure that no country dependant fields are blocking the address form. self.env.company.country_id = self.env.ref('base.us') + if not loaded_demo_data(self.env): + _logger.warning("This test relies on demo data. To be rewritten independently of demo data for accurate and reliable results.") + return self.start_tour("/", 'add_to_cart_snippet_tour', login="admin") diff --git a/addons/website_sale/tests/test_website_sale_cart.py b/addons/website_sale/tests/test_website_sale_cart.py index ac8b75fa36f..f9512451bb1 100644 --- a/addons/website_sale/tests/test_website_sale_cart.py +++ b/addons/website_sale/tests/test_website_sale_cart.py @@ -1,14 +1,15 @@ # coding: utf-8 +from odoo.addons.base.tests.common import TransactionCaseWithUserPortal from odoo.addons.website_sale.controllers.main import WebsiteSale, PaymentPortal from odoo.addons.website.tools import MockRequest from odoo.exceptions import UserError -from odoo.tests.common import TransactionCase, tagged +from odoo.tests.common import tagged from odoo.fields import Command @tagged('post_install', '-at_install') -class WebsiteSaleCart(TransactionCase): +class WebsiteSaleCart(TransactionCaseWithUserPortal): @classmethod def setUpClass(cls): @@ -90,7 +91,7 @@ class WebsiteSaleCart(TransactionCase): 'lst_price': 1000.0, 'standard_price': 800.0, }) - portal_user = self.env.ref('base.demo_user0') + portal_user = self.user_portal website = self.website.with_user(portal_user) SaleOrderLine = self.env['sale.order.line'] diff --git a/addons/website_sale/tests/test_website_sale_fiscal_position.py b/addons/website_sale/tests/test_website_sale_fiscal_position.py index a088910c5db..5cee093c42e 100644 --- a/addons/website_sale/tests/test_website_sale_fiscal_position.py +++ b/addons/website_sale/tests/test_website_sale_fiscal_position.py @@ -21,6 +21,8 @@ class TestWebsiteSaleFiscalPosition(ProductCommon, HttpCaseWithUserPortal): The goal of this test is to check that this template is up to date with the fiscal position detected. """ + self.env.ref('base.group_user').write({'implied_ids': [(4, self.env.ref('product.group_product_pricelist').id)]}) + self.env.company.country_id = self.env.ref('base.us') website_id = self.env.ref('website.default_website').id belgium_id = self.env.ref('base.be').id # Set setting to display tax included on the website @@ -37,7 +39,7 @@ class TestWebsiteSaleFiscalPosition(ProductCommon, HttpCaseWithUserPortal): 'include_base_amount': False, }) tax_0 = self.env['account.tax'].create({ - 'name': '0%', + 'name': '0% Test Tax', 'type_tax_use': 'sale', 'amount_type': 'percent', 'amount': 0, @@ -52,14 +54,21 @@ class TestWebsiteSaleFiscalPosition(ProductCommon, HttpCaseWithUserPortal): })] }) # Create a pricelist which will be automatically detected - self.env['product.pricelist'].create({ + self.env['product.pricelist'].create([{ 'name': 'EUROPE EUR', 'selectable': True, 'website_id': website_id, 'country_group_ids': [Command.link(self.env.ref('base.europe').id)], 'sequence': 1, 'currency_id': self.env.ref('base.EUR').id, - }) + }, { + 'name': 'Christmas List', + 'selectable': False, + 'website_id': website_id, + 'country_group_ids': [Command.link(self.env.ref('base.europe').id)], + 'sequence': 20, + 'currency_id': self.env.ref('base.EUR').id, + }]) # Create the product to be used for analysis self.env["product.product"].create({ 'name': "Super product", diff --git a/addons/website_sale/tests/test_website_sale_mail.py b/addons/website_sale/tests/test_website_sale_mail.py index 001cb911315..5679addf090 100644 --- a/addons/website_sale/tests/test_website_sale_mail.py +++ b/addons/website_sale/tests/test_website_sale_mail.py @@ -17,6 +17,7 @@ class TestWebsiteSaleMail(HttpCase): self.env['product.product'].create({ 'name': 'Acoustic Bloc Screens', 'list_price': 2950.0, + 'sale_ok': True, 'website_published': True, }) self.env['res.partner'].create({ @@ -29,6 +30,13 @@ class TestWebsiteSaleMail(HttpCase): # as we check some link content, avoid mobile doing its link management self.env['ir.config_parameter'].sudo().set_param('mail_mobile.disable_redirect_firebase_dynamic_link', True) + main_website = self.env.ref('website.default_website') + other_websites = self.env['website'].search([]) - main_website + + # We change the domain of the website to test that the email that + # will be sent uses the correct domain for its links. + main_website.domain = "my-test-domain.com" + other_websites.domain = "https://domain-not-used.fr" with patch.object(MailMail, 'unlink', lambda self: None): start_time = fields.Datetime.now() self.start_tour("/", 'shop_mail', login="admin") diff --git a/addons/website_sale/tests/test_website_sale_pricelist.py b/addons/website_sale/tests/test_website_sale_pricelist.py index 9913e881bbc..d97bf0950e0 100644 --- a/addons/website_sale/tests/test_website_sale_pricelist.py +++ b/addons/website_sale/tests/test_website_sale_pricelist.py @@ -1,13 +1,18 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. + +import logging + from unittest.mock import patch from odoo.fields import Command -from odoo.tests import tagged, TransactionCase +from odoo.tests import tagged, TransactionCase, loaded_demo_data from odoo.addons.base.tests.common import TransactionCaseWithUserDemo, HttpCaseWithUserPortal from odoo.addons.website.tools import MockRequest +_logger = logging.getLogger(__name__) + ''' /!\/!\ Calling `get_pricelist_available` after setting `property_product_pricelist` on a partner will not work as expected. That field will change the output of @@ -282,6 +287,7 @@ class TestWebsitePriceList(TransactionCase): returns a dict with just `price_reduce` (no discount) as key when the product is tax included. """ + self.env.company.country_id = self.env.ref('base.us') tax = self.env['account.tax'].create({ 'name': "Tax 10", 'amount': 10, @@ -650,6 +656,9 @@ class TestWebsiteSaleSession(HttpCaseWithUserPortal): The objective is to verify that the pricelist changes correctly according to the user. """ + if not loaded_demo_data(self.env): + _logger.warning("This test relies on demo data. To be rewritten independently of demo data for accurate and reliable results.") + return website = self.env.ref('website.default_website') test_user = self.env['res.users'].create({ 'name': 'Toto', diff --git a/addons/website_sale/tests/test_website_sale_product.py b/addons/website_sale/tests/test_website_sale_product.py index cfd4dc3c8cd..bb4fdc8f29f 100644 --- a/addons/website_sale/tests/test_website_sale_product.py +++ b/addons/website_sale/tests/test_website_sale_product.py @@ -6,9 +6,11 @@ from odoo.addons.sale.tests.test_sale_product_attribute_value_config import Test @tagged('post_install', '-at_install') class WebsiteSaleProductTests(TestSaleProductAttributeValueCommon): - def setUp(self): - super().setUp() - self.website = self.env.ref('website.default_website') + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.website = cls.env.ref('website.default_website') + cls.website.company_id = cls.env.company def test_website_sale_contextual_price(self): contextual_price = self.computer._get_contextual_price() diff --git a/addons/website_sale/tests/test_website_sale_product_attribute_value_config.py b/addons/website_sale/tests/test_website_sale_product_attribute_value_config.py index 802ebe727c0..81bd510ac5c 100644 --- a/addons/website_sale/tests/test_website_sale_product_attribute_value_config.py +++ b/addons/website_sale/tests/test_website_sale_product_attribute_value_config.py @@ -10,13 +10,14 @@ from odoo.addons.website.tools import MockRequest @tagged('post_install', '-at_install', 'product_attribute') -class TestWebsiteSaleProductAttributeValueConfig(AccountTestInvoicingCommon, TestSaleProductAttributeValueCommon): +class TestWebsiteSaleProductAttributeValueConfig(TestSaleProductAttributeValueCommon): @classmethod def setUpClass(cls, chart_template_ref=None): super().setUpClass(chart_template_ref=chart_template_ref) - # Use the testing environment. + cls.env['website'].get_current_website().company_id = cls.env.company + cls.computer.company_id = cls.env.company cls.computer = cls.computer.with_env(cls.env) def test_get_combination_info(self): @@ -79,6 +80,9 @@ class TestWebsiteSaleProductAttributeValueConfig(AccountTestInvoicingCommon, Tes def test_get_combination_info_with_fpos(self): # Setup product. + current_website = self.env['website'].get_current_website() + pricelist = current_website._get_current_pricelist() + (self.env['product.pricelist'].search([]) - pricelist).write({'active': False}) product = self.env['product.template'].create({ 'name': 'Test Product', 'list_price': 2000, @@ -168,10 +172,9 @@ class TestWebsiteSaleProductAttributeValueConfig(AccountTestInvoicingCommon, Tes @tagged('post_install', '-at_install', 'product_pricelist') -class TestWebsiteSaleProductPricelist(AccountTestInvoicingCommon, TestSaleProductAttributeValueCommon): +class TestWebsiteSaleProductPricelist(TestSaleProductAttributeValueCommon): def test_cart_update_with_fpos(self): # We will test that the mapping of an 10% included tax by a 6% by a fiscal position is taken into account when updating the cart - self.env.user.partner_id.country_id = False current_website = self.env['website'].get_current_website() self.env['product.pricelist'].search([]).action_archive() pricelist = self.env['product.pricelist'].create({ @@ -225,7 +228,6 @@ class TestWebsiteSaleProductPricelist(AccountTestInvoicingCommon, TestSaleProduc def test_cart_update_with_fpos_no_variant_product(self): # We will test that the mapping of an 10% included tax by a 0% by a fiscal position is taken into account when updating the cart for no_variant product - self.env.user.partner_id.country_id = False current_website = self.env['website'].get_current_website() # Add 10% tax on product tax10 = self.env['account.tax'].create({'name': "Test tax 10", 'amount': 10, 'price_include': True, 'amount_type': 'percent', 'type_tax_use': 'sale'}) diff --git a/addons/website_sale/tests/test_website_sale_snippets.py b/addons/website_sale/tests/test_website_sale_snippets.py index 574f9dc3124..b9ce25a245c 100644 --- a/addons/website_sale/tests/test_website_sale_snippets.py +++ b/addons/website_sale/tests/test_website_sale_snippets.py @@ -1,13 +1,21 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from odoo.tests import HttpCase, tagged + +import logging + +from odoo.tests import HttpCase, tagged, loaded_demo_data from odoo.addons.website.tools import MockRequest +_logger = logging.getLogger(__name__) + @tagged('post_install', '-at_install', 'website_snippets') class TestSnippets(HttpCase): def test_01_snippet_products_edition(self): + if not loaded_demo_data(self.env): + _logger.warning("This test relies on demo data. To be rewritten independently of demo data for accurate and reliable results.") + return self.start_tour('/', 'website_sale.snippet_products', login='admin') def test_02_snippet_products_remove(self): diff --git a/addons/website_sale_comparison/tests/test_website_sale_comparison.py b/addons/website_sale_comparison/tests/test_website_sale_comparison.py index 50899faf7ee..7059c5fe7f4 100644 --- a/addons/website_sale_comparison/tests/test_website_sale_comparison.py +++ b/addons/website_sale_comparison/tests/test_website_sale_comparison.py @@ -1,12 +1,16 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. +import logging + from collections import OrderedDict from lxml import etree from odoo import tools import odoo.tests +_logger = logging.getLogger(__name__) + @odoo.tests.tagged('-at_install', 'post_install') class TestWebsiteSaleComparison(odoo.tests.TransactionCase): @@ -18,6 +22,13 @@ class TestWebsiteSaleComparison(odoo.tests.TransactionCase): `_remove_copied_views`. The problematic view that has to be removed is `product_attributes_body` because it has a reference to `add_to_compare`. """ + # YTI TODO: Adapt this tour without demo data + # I still didn't figure why, but this test freezes on runbot + # without the demo data + if not odoo.tests.loaded_demo_data(self.env): + _logger.warning("This test relies on demo data. To be rewritten independently of demo data for accurate and reliable results.") + return + Website0 = self.env['website'].with_context(website_id=None) Website1 = self.env['website'].with_context(website_id=1) @@ -105,7 +116,8 @@ class TestUi(odoo.tests.HttpCase): def test_01_admin_tour_product_comparison(self): # YTI FIXME: Adapt to work without demo data - if tools.config["without_demo"]: + if not odoo.tests.loaded_demo_data(self.env): + _logger.warning("This test relies on demo data. To be rewritten independently of demo data for accurate and reliable results.") return self.start_tour("/", 'product_comparison', login='admin') diff --git a/addons/website_sale_loyalty/tests/test_shop_sale_coupon.py b/addons/website_sale_loyalty/tests/test_shop_sale_coupon.py index cce84d8c4fc..4bc7faf93ec 100644 --- a/addons/website_sale_loyalty/tests/test_shop_sale_coupon.py +++ b/addons/website_sale_loyalty/tests/test_shop_sale_coupon.py @@ -8,16 +8,34 @@ from odoo.addons.sale.tests.test_sale_product_attribute_value_config import Test @tagged('post_install', '-at_install') -class TestUi(TestSaleProductAttributeValueCommon, HttpCase): +class WebsiteSaleLoyaltyTestUi(TestSaleProductAttributeValueCommon, HttpCase): + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env.ref('base.user_admin').write({ + 'company_id': cls.env.company.id, + 'company_ids': [(4, cls.env.company.id)], + 'name': 'Mitchell Admin', + 'street': '215 Vine St', + 'phone': '+1 555-555-5555', + 'city': 'Scranton', + 'zip': '18503', + 'country_id': cls.env.ref('base.us').id, + 'state_id': cls.env.ref('base.state_us_39').id, + }) + cls.env.ref('base.user_admin').sudo().partner_id.company_id = cls.env.company + cls.env.ref('website.default_website').company_id = cls.env.company def test_01_admin_shop_sale_loyalty_tour(self): if self.env['ir.module.module']._get('payment_custom').state != 'installed': self.skipTest("Transfer provider is not installed") transfer_provider = self.env.ref('payment.payment_provider_transfer') - transfer_provider.write({ + transfer_provider.sudo().write({ 'state': 'enabled', 'is_published': True, + 'company_id': self.env.company.id, }) transfer_provider._transfer_ensure_pending_msg_is_set() diff --git a/addons/website_sale_loyalty/tests/test_website_sale_loyalty_delivery.py b/addons/website_sale_loyalty/tests/test_website_sale_loyalty_delivery.py index 71074773e36..0dde120cd29 100644 --- a/addons/website_sale_loyalty/tests/test_website_sale_loyalty_delivery.py +++ b/addons/website_sale_loyalty/tests/test_website_sale_loyalty_delivery.py @@ -8,6 +8,16 @@ class TestWebsiteSaleDelivery(HttpCase): def setUp(self): super().setUp() + self.env.ref('base.user_admin').write({ + 'name': 'Mitchell Admin', + 'street': '215 Vine St', + 'phone': '+1 555-555-5555', + 'city': 'Scranton', + 'zip': '18503', + 'country_id': self.env.ref('base.us').id, + 'state_id': self.env.ref('base.state_us_39').id, + }) + self.env['product.product'].create({ 'name': 'Acoustic Bloc Screens', 'list_price': 2950.0, diff --git a/addons/website_sale_picking/tests/test_ui.py b/addons/website_sale_picking/tests/test_ui.py index 99b9ff12ece..2d4ea44eff4 100644 --- a/addons/website_sale_picking/tests/test_ui.py +++ b/addons/website_sale_picking/tests/test_ui.py @@ -1,7 +1,11 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from odoo.tests import HttpCase, tagged +import logging + +from odoo.tests import HttpCase, tagged, loaded_demo_data + +_logger = logging.getLogger(__name__) @tagged('-at_install', 'post_install') @@ -32,6 +36,10 @@ class TestUi(HttpCase): def test_onsite_payment_tour(self): # Make sure at least one onsite payment option exists. + if not loaded_demo_data(self.env): + _logger.warning("This test relies on demo data. To be rewritten independently of demo data for accurate and reliable results.") + return + self.env['delivery.carrier'].create({ 'delivery_type': 'onsite', 'is_published': True, diff --git a/addons/website_sale_product_configurator/tests/test_website_sale_configurator.py b/addons/website_sale_product_configurator/tests/test_website_sale_configurator.py index e633c3cd9aa..65666e43cba 100644 --- a/addons/website_sale_product_configurator/tests/test_website_sale_configurator.py +++ b/addons/website_sale_product_configurator/tests/test_website_sale_configurator.py @@ -3,11 +3,11 @@ from odoo.tests import tagged from odoo.addons.sale_product_configurator.tests.common import TestProductConfiguratorCommon -from odoo.addons.base.tests.common import HttpCaseWithUserPortal +from odoo.addons.base.tests.common import HttpCaseWithUserPortal, HttpCaseWithUserDemo @tagged('post_install', '-at_install') -class TestWebsiteSaleProductConfigurator(TestProductConfiguratorCommon, HttpCaseWithUserPortal): +class TestWebsiteSaleProductConfigurator(TestProductConfiguratorCommon, HttpCaseWithUserPortal, HttpCaseWithUserDemo): @classmethod def setUpClass(cls): super().setUpClass()