diff --git a/addons/website_sale/models/sale_order.py b/addons/website_sale/models/sale_order.py index 06a31c5c9b2..eacbabec3a9 100644 --- a/addons/website_sale/models/sale_order.py +++ b/addons/website_sale/models/sale_order.py @@ -132,7 +132,7 @@ class SaleOrder(models.Model): update_values = self._prepare_order_line_update_values(order_line, quantity, **kwargs) if update_values: self._update_cart_line_values(order_line, update_values) - elif quantity >= 0: + elif quantity > 0: # Create new line order_line_values = self._prepare_order_line_values(product_id, quantity, **kwargs) order_line = self.env['sale.order.line'].sudo().create(order_line_values) diff --git a/addons/website_sale/tests/test_website_sale_cart.py b/addons/website_sale/tests/test_website_sale_cart.py index d225d6a587b..ff4b5670018 100644 --- a/addons/website_sale/tests/test_website_sale_cart.py +++ b/addons/website_sale/tests/test_website_sale_cart.py @@ -78,3 +78,35 @@ class WebsiteSaleCart(TransactionCase): # Try processing payment with the old amount with self.assertRaises(UserError): PaymentPortal().shop_payment_transaction(sale_order.id, sale_order.access_token, amount=old_amount) + + def test_update_cart_zero_qty(self): + # Try to remove a product that has already been removed + product = self.env['product.product'].create({ + 'name': 'Test Product', + 'sale_ok': True, + 'website_published': True, + 'lst_price': 1000.0, + 'standard_price': 800.0, + }) + portal_user = self.env.ref('base.demo_user0') + website = self.website.with_user(portal_user) + + SaleOrderLine = self.env['sale.order.line'] + + with MockRequest(product.with_user(portal_user).env, website=website): + # add the product to the cart + self.WebsiteSaleController.cart_update_json(product_id=product.id, add_qty=1) + sale_order = website.sale_get_order() + self.assertEqual(sale_order.amount_total, 1150.0) + + # remove the product from the cart + self.WebsiteSaleController.cart_update_json(product_id=product.id, line_id=sale_order.order_line.id, set_qty=0) + self.assertEqual(sale_order.amount_total, 0.0) + self.assertEqual(sale_order.order_line, SaleOrderLine) + + # removing the product again doesn't add a line with zero quantity + self.WebsiteSaleController.cart_update_json(product_id=product.id, set_qty=0) + self.assertEqual(sale_order.order_line, SaleOrderLine) + + self.WebsiteSaleController.cart_update_json(product_id=product.id, add_qty=0) + self.assertEqual(sale_order.order_line, SaleOrderLine)