diff --git a/shopinvader/models/product_product.py b/shopinvader/models/product_product.py index 6bc6a3401c..c94816b44f 100644 --- a/shopinvader/models/product_product.py +++ b/shopinvader/models/product_product.py @@ -84,3 +84,9 @@ def _get_invader_variant(self, backend, lang): return self.shopinvader_bind_ids.filtered( lambda x: x.backend_id == backend and x.lang_id.code == lang ) + + def unlink(self): + # Call unlink manually to be sure to trigger + # shopinvader variant unlink constraint + self.mapped("shopinvader_bind_ids").unlink() + return super(ProductProduct, self).unlink() diff --git a/shopinvader/models/shopinvader_product.py b/shopinvader/models/shopinvader_product.py index 89e1954981..ef32627365 100644 --- a/shopinvader/models/shopinvader_product.py +++ b/shopinvader/models/shopinvader_product.py @@ -199,3 +199,9 @@ def _redirect_existing_url(self): } ) return True + + def unlink(self): + # Call unlink manually to be sure to trigger + # shopinvader variant unlink constraint + self.mapped("shopinvader_variant_ids").unlink() + return super(ShopinvaderProduct, self).unlink() diff --git a/shopinvader_search_engine/tests/__init__.py b/shopinvader_search_engine/tests/__init__.py new file mode 100644 index 0000000000..018e2cc529 --- /dev/null +++ b/shopinvader_search_engine/tests/__init__.py @@ -0,0 +1 @@ +from . import test_delete_product diff --git a/shopinvader_search_engine/tests/test_delete_product.py b/shopinvader_search_engine/tests/test_delete_product.py new file mode 100644 index 0000000000..2f76f4814f --- /dev/null +++ b/shopinvader_search_engine/tests/test_delete_product.py @@ -0,0 +1,64 @@ +# Copyright 2019 Akretion (http://www.akretion.com). +# @author Sébastien BEAU +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.exceptions import UserError +from odoo.tests import SavepointCase + + +class BindingCase(SavepointCase): + @classmethod + def setUpClass(cls): + super(BindingCase, cls).setUpClass() + cls.template = cls.env["product.template"].create({"name": "Test"}) + cls.product = cls.template.product_variant_ids + cls.shopinvader_product = ( + cls.env["shopinvader.product"] + .with_context(map_children=True) + .create( + { + "record_id": cls.template.id, + "backend_id": cls.env.ref("shopinvader.backend_1").id, + "lang_id": cls.env.ref("base.lang_en").id, + } + ) + ) + cls.shopinvader_variant = ( + cls.shopinvader_product.shopinvader_variant_ids + ) + + +class BindingDoneCase(BindingCase): + @classmethod + def setUpClass(cls): + super(BindingDoneCase, cls).setUpClass() + cls.shopinvader_variant.write({"sync_state": "done"}) + + def test_unlink_shopinvader_product(self): + with self.assertRaises(UserError): + self.shopinvader_product.unlink() + + def test_unlink_product_product(self): + with self.assertRaises(UserError): + self.product.unlink() + + def test_unlink_product_template(self): + with self.assertRaises(UserError): + self.template.unlink() + + +class BindingInactiveDoneCase(BindingCase): + @classmethod + def setUpClass(cls): + super(BindingInactiveDoneCase, cls).setUpClass() + cls.shopinvader_variant.active = False + cls.shopinvader_variant.sync_state = "done" + + def test_unlink_shopinvader_product(self): + self.shopinvader_product.unlink() + + def test_unlink_product_product(self): + self.product.unlink() + + def test_unlink_product_template(self): + self.template.unlink()