From d1fed769d667a612be6b28bb21b56a9c710b6d50 Mon Sep 17 00:00:00 2001 From: Jorge Pinna Puissant Date: Tue, 7 Nov 2023 20:48:03 +0100 Subject: [PATCH] [FIX] base, test_assetsbundle, web: multiple broken XML files in assets When there are multiple broken XML files in an assets bundle. During the bundle processing, a template containing the parsing error message is returned for each XML file that is broken. Before this commit, each of the returned templates had the same name, raising another error ("Template already exists in module"). Now, all the returned templates has unique names. closes odoo/odoo#141568 Signed-off-by: Aaron Bohy (aab) --- addons/web/static/src/core/assets.js | 7 ++++++- odoo/addons/base/models/assetsbundle.py | 2 +- odoo/addons/test_assetsbundle/__manifest__.py | 4 ++++ .../static/invalid_src/xml/invalid_xml.xml | 2 +- .../static/invalid_src/xml/second_invalid_xml.xml | 7 +++++++ .../test_assetsbundle/tests/test_assetsbundle.py | 15 +++++++++++++-- 6 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 odoo/addons/test_assetsbundle/static/invalid_src/xml/second_invalid_xml.xml diff --git a/addons/web/static/src/core/assets.js b/addons/web/static/src/core/assets.js index a7f1786ff6a..6d161bb0b57 100644 --- a/addons/web/static/src/core/assets.js +++ b/addons/web/static/src/core/assets.js @@ -231,7 +231,12 @@ registry.category("xml_templates").addEventListener("UPDATE", (ev) => { if (doc.querySelector("parsererror")) { // The generated error XML is non-standard so we log the full content to // ensure that the relevant info is actually logged. - throw new Error(doc.querySelector("parsererror").textContent.trim()); + let strError = ""; + const nodes = doc.querySelectorAll("parsererror"); + for (const node of nodes) { + strError += node.textContent.trim() + "\n"; + } + throw new Error(strError); } for (const element of doc.querySelectorAll("templates > [t-name]")) { diff --git a/odoo/addons/base/models/assetsbundle.py b/odoo/addons/base/models/assetsbundle.py index 86141a82a4c..4ce7b682d71 100644 --- a/odoo/addons/base/models/assetsbundle.py +++ b/odoo/addons/base/models/assetsbundle.py @@ -902,7 +902,7 @@ class XMLAsset(WebAsset): try: root = etree.fromstring(content.encode('utf-8'), parser=parser) except etree.XMLSyntaxError as e: - return f'Invalid XML template: {self.url} \n {e.msg} ' + return f'Invalid XML template: {self.url} \n {e.msg} ' if root.tag in ('templates', 'template'): return ''.join(etree.tostring(el, encoding='unicode') for el in root) return etree.tostring(root, encoding='unicode') diff --git a/odoo/addons/test_assetsbundle/__manifest__.py b/odoo/addons/test_assetsbundle/__manifest__.py index 632291e2ef7..9e649984cd4 100644 --- a/odoo/addons/test_assetsbundle/__manifest__.py +++ b/odoo/addons/test_assetsbundle/__manifest__.py @@ -65,6 +65,10 @@ 'test_assetsbundle.broken_xml': [ 'test_assetsbundle/static/invalid_src/xml/invalid_xml.xml', ], + 'test_assetsbundle.multiple_broken_xml': [ + 'test_assetsbundle/static/invalid_src/xml/invalid_xml.xml', + 'test_assetsbundle/static/invalid_src/xml/second_invalid_xml.xml', + ], }, 'license': 'LGPL-3', } diff --git a/odoo/addons/test_assetsbundle/static/invalid_src/xml/invalid_xml.xml b/odoo/addons/test_assetsbundle/static/invalid_src/xml/invalid_xml.xml index 51408a14070..ccc458b8ec4 100644 --- a/odoo/addons/test_assetsbundle/static/invalid_src/xml/invalid_xml.xml +++ b/odoo/addons/test_assetsbundle/static/invalid_src/xml/invalid_xml.xml @@ -1,6 +1,6 @@ - + content diff --git a/odoo/addons/test_assetsbundle/static/invalid_src/xml/second_invalid_xml.xml b/odoo/addons/test_assetsbundle/static/invalid_src/xml/second_invalid_xml.xml new file mode 100644 index 00000000000..a5ba63906c4 --- /dev/null +++ b/odoo/addons/test_assetsbundle/static/invalid_src/xml/second_invalid_xml.xml @@ -0,0 +1,7 @@ + + + + + content + + diff --git a/odoo/addons/test_assetsbundle/tests/test_assetsbundle.py b/odoo/addons/test_assetsbundle/tests/test_assetsbundle.py index 754a71469bd..665224c9f6a 100644 --- a/odoo/addons/test_assetsbundle/tests/test_assetsbundle.py +++ b/odoo/addons/test_assetsbundle/tests/test_assetsbundle.py @@ -638,10 +638,21 @@ class TestXMLAssetsBundle(FileTouchable): """ self.bundle = self._get_asset('test_assetsbundle.broken_xml') - # there shouldn't be any test_assetsvundle.invalid_xml template. + # there shouldn't be any test_assetsbundle.invalid_xml template. # there should be an parsing_error template with the parsing error message. self.assertEqual(self.bundle.xml(), - 'Invalid XML template: /test_assetsbundle/static/invalid_src/xml/invalid_xml.xml \n Opening and ending tag mismatch: SomeComponent line 4 and t, line 5, column 7 ', + 'Invalid XML template: /test_assetsbundle/static/invalid_src/xml/invalid_xml.xml \n Opening and ending tag mismatch: SomeComponent line 4 and t, line 5, column 7 ', + "the parsing error should be shown") + + def test_02_multiple_broken_xml(self): + """ Checks that a bundle with multiple broken xml returns a comprehensive error message. + """ + self.bundle = self._get_asset('test_assetsbundle.multiple_broken_xml') + + # there shouldn't be any test_assetsbundle.invalid_xml template or test_assetsbundle.second_invalid_xml template. + # there should be two parsing_error templates with the parsing error message for each file. + self.assertEqual(self.bundle.xml(), + 'Invalid XML template: /test_assetsbundle/static/invalid_src/xml/invalid_xml.xml \n Opening and ending tag mismatch: SomeComponent line 4 and t, line 5, column 7 Invalid XML template: /test_assetsbundle/static/invalid_src/xml/second_invalid_xml.xml \n XML declaration allowed only at the start of the document, line 2, column 6 ', "the parsing error should be shown")