From 5ae80b235c653f3e249d5c58ef1e186576abb45a Mon Sep 17 00:00:00 2001 From: Cliff Kujala Date: Wed, 3 Jun 2026 17:35:09 -0700 Subject: [PATCH 1/6] [FIX] website_product_configurator: use existing product category xmlid product.product_category_5 no longer exists in Odoo 19. Reference product.product_category_goods, which is always present (non-demo), so the test setup works with and without demo data. --- website_product_configurator/tests/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website_product_configurator/tests/common.py b/website_product_configurator/tests/common.py index b2692fae9..8ec9f88e0 100644 --- a/website_product_configurator/tests/common.py +++ b/website_product_configurator/tests/common.py @@ -11,7 +11,7 @@ def setUpClass(cls): super().setUpClass() cls.productConfigStepLine = cls.env["product.config.step.line"] cls.productAttributeLine = cls.env["product.template.attribute.line"] - cls.product_category = cls.env.ref("product.product_category_5") + cls.product_category = cls.env.ref("product.product_category_goods") cls.value_diesel = cls.env.ref( "product_configurator.product_attribute_value_diesel" ) From c6712f2c4d30ad1a9e88155e9fd16aa9031f4d98 Mon Sep 17 00:00:00 2001 From: Cliff Kujala Date: Wed, 3 Jun 2026 17:38:38 -0700 Subject: [PATCH 2/6] [FIX] website_product_configurator: repair test fixtures for Odoo 19 - base.res_partner_1 no longer exists; create a partner in setUpClass. - test_remove_inactive_config_sessions passed a product.config.line id as product_tmpl_id, which violated the FK on Odoo 19; use a real product.template instead. --- website_product_configurator/tests/test_product_config.py | 2 +- website_product_configurator/tests/test_sale_order.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/website_product_configurator/tests/test_product_config.py b/website_product_configurator/tests/test_product_config.py index 1adcf70a2..9980d00c9 100644 --- a/website_product_configurator/tests/test_product_config.py +++ b/website_product_configurator/tests/test_product_config.py @@ -64,7 +64,7 @@ def test_remove_inactive_config_sessions(self): ) session_id2 = self.productConfigSession.create( { - "product_tmpl_id": self.config_product_1.id, + "product_tmpl_id": self.product_tmpl_id.id, "value_ids": [ ( 6, diff --git a/website_product_configurator/tests/test_sale_order.py b/website_product_configurator/tests/test_sale_order.py index 90dee4aa0..5efc9292f 100644 --- a/website_product_configurator/tests/test_sale_order.py +++ b/website_product_configurator/tests/test_sale_order.py @@ -7,7 +7,7 @@ class TestSaleOrder(TestProductConfiguratorValues): @classmethod def setUpClass(cls): super().setUpClass() - cls.partner = cls.env.ref("base.res_partner_1") + cls.partner = cls.env["res.partner"].create({"name": "Test Customer"}) cls.product = cls.env["product.product"].create({"name": "test product"}) cls.product_uom_unit = cls.env.ref("uom.product_uom_unit") cls.pricelist = cls.env["product.pricelist"].create( From fcd8b853033aef6a5c4a63fd96882f09aee8d003 Mon Sep 17 00:00:00 2001 From: Cliff Kujala Date: Wed, 3 Jun 2026 17:41:39 -0700 Subject: [PATCH 3/6] [FIX] website_product_configurator: drop removed pricelist discount_policy The discount_policy field was removed from product.pricelist; passing it on create raises ValueError on Odoo 19. --- website_product_configurator/tests/test_sale_order.py | 1 - 1 file changed, 1 deletion(-) diff --git a/website_product_configurator/tests/test_sale_order.py b/website_product_configurator/tests/test_sale_order.py index 5efc9292f..67cd65c51 100644 --- a/website_product_configurator/tests/test_sale_order.py +++ b/website_product_configurator/tests/test_sale_order.py @@ -14,7 +14,6 @@ def setUpClass(cls): { "name": "New Pricelist", "currency_id": cls.env.user.company_id.currency_id.id, - "discount_policy": "without_discount", } ) cls.sale_order = cls.env["sale.order"].create( From b11d71b2bd12d7ad9c74cd06713642baf2795248 Mon Sep 17 00:00:00 2001 From: Cliff Kujala Date: Wed, 3 Jun 2026 17:44:25 -0700 Subject: [PATCH 4/6] [FIX] website_product_configurator: rename product_uom to product_uom_id sale.order.line.product_uom was renamed to product_uom_id in Odoo 19. --- website_product_configurator/tests/test_sale_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website_product_configurator/tests/test_sale_order.py b/website_product_configurator/tests/test_sale_order.py index 67cd65c51..b57fed684 100644 --- a/website_product_configurator/tests/test_sale_order.py +++ b/website_product_configurator/tests/test_sale_order.py @@ -30,7 +30,7 @@ def setUpClass(cls): { "product_id": cls.product.id, "name": "Test Line", - "product_uom": cls.product_uom_unit.id, + "product_uom_id": cls.product_uom_unit.id, "product_uom_qty": 2.0, "price_unit": 400.00, "config_session_id": cls.session_id.id, From 496ca6738b2ec8b835d371e7ffacd6f58e39c0e6 Mon Sep 17 00:00:00 2001 From: Cliff Kujala Date: Wed, 3 Jun 2026 17:49:30 -0700 Subject: [PATCH 5/6] [FIX] website_product_configurator: rewrite cart test for Odoo 19 API sale.order._cart_update was removed in favour of _cart_add and _cart_update_line_quantity. Rewrite the test to exercise the module's overrides through the new API and assert the configuration session is preserved across quantity updates and that a zero quantity removes the line. --- .../tests/test_sale_order.py | 80 +++++-------------- 1 file changed, 19 insertions(+), 61 deletions(-) diff --git a/website_product_configurator/tests/test_sale_order.py b/website_product_configurator/tests/test_sale_order.py index b57fed684..f345abe1e 100644 --- a/website_product_configurator/tests/test_sale_order.py +++ b/website_product_configurator/tests/test_sale_order.py @@ -40,68 +40,26 @@ def setUpClass(cls): } ) - def test_cart_update(self): - product_id = ( - self.sale_order.order_line.product_id.product_tmpl_id.product_variant_id.id - ) - self.sale_order._cart_update( - product_id=product_id, - line_id=self.sale_order.order_line.id, - set_qty=0, - add_qty=0, - ) - self.assertFalse( - self.product.product_tmpl_id.config_ok, "product is config_ok True" - ) - self.product.product_tmpl_id.write({"config_ok": True}) - cart_update = self.sale_order._cart_update( - product_id=product_id, - line_id=self.sale_order.order_line.id, - set_qty=2, - add_qty=2, - ) - self.assertEqual(cart_update.get("line_id"), self.sale_order.order_line.id) - self.assertEqual( - cart_update.get("quantity"), self.sale_order.order_line.product_uom_qty - ) + def test_cart_update_line_quantity(self): + """The cart overrides keep the configuration session on the line and + honour quantity updates (including removal on a zero quantity).""" + order = self.sale_order.with_context(skip_cart_verification=True) + order_line = order.order_line + product_id = order_line.product_id.id - self.sale_order.write({"order_line": False}) - self.sale_order._cart_update( - product_id=product_id, - set_qty=1, - add_qty=1, - ) - self.assertTrue(self.sale_order.order_line, "No Sale Order Line created.") + # The line created in setUpClass carries the configuration session. + self.assertEqual(order_line.config_session_id, self.session_id) - self.sale_order._cart_update( - product_id=product_id, - line_id=self.sale_order.order_line.id, - set_qty=-1, - add_qty=1, - ) - self.assertFalse( - self.sale_order.order_line, - "Order Line is exist for quantity is less than equal zero.", - ) + # Increasing the quantity preserves the configuration session. + order._cart_update_line_quantity(line_id=order_line.id, quantity=5) + self.assertEqual(order_line.product_uom_qty, 5) + self.assertEqual(order_line.config_session_id, self.session_id) - self.sale_order._cart_update( - line_id=self.sale_order.order_line.id, - product_id=product_id, - add_qty="test", - ) - self.assertEqual( - self.sale_order.order_line.product_uom_qty, - 1, - "If wrong value is added then 1 quantity is deducted from Order Line.", - ) + # Adding the same product again matches the existing line. + result = order._cart_add(product_id=product_id, quantity=2) + self.assertEqual(result.get("line_id"), order_line.id) + self.assertEqual(order_line.product_uom_qty, 7) - self.sale_order._cart_update( - line_id=self.sale_order.order_line.id, - product_id=product_id, - set_qty="test", - ) - self.assertEqual( - self.sale_order.order_line.product_uom_qty, - 1, - "If wrong value is added then Order Line quantity as it is.", - ) + # Setting the quantity to zero removes the line from the cart. + order._cart_update_line_quantity(line_id=order_line.id, quantity=0) + self.assertFalse(order.order_line, "Order line was not removed.") From 000549c3f4cc14ea011e3e3445b5f85f7832975c Mon Sep 17 00:00:00 2001 From: Cliff Kujala Date: Thu, 4 Jun 2026 10:48:53 -0700 Subject: [PATCH 6/6] [FIX] website_product_configurator: migrate config tour to Odoo 19 Port the website configurator tour to the Odoo 19 web_tour API so the HttpCase tours (test_01_admin_config_tour / test_02_demo_config_tour) run green: - Replace the removed trigger/extra_trigger style with the current single-trigger steps and modern run helpers. - Scope the dependent