diff --git a/addons/web/static/tests/boot_tests.js b/addons/web/static/tests/boot_tests.js deleted file mode 100644 index 7103c1dd5f9..00000000000 --- a/addons/web/static/tests/boot_tests.js +++ /dev/null @@ -1,18 +0,0 @@ -(function () { -"use strict"; - -odoo.__DEBUG__.didLogInfo.then(function () { - var modulesInfo = odoo.__DEBUG__.jsModules; - - QUnit.module('Odoo JS Modules'); - - QUnit.test('all modules are properly loaded', function (assert) { - assert.expect(2); - - assert.deepEqual(modulesInfo.missing, [], - "no js module should be missing"); - assert.deepEqual(modulesInfo.failed, [], - "no js module should have failed"); - }); -}); -})(); diff --git a/addons/web/static/tests/helpers/qunit_config.js b/addons/web/static/tests/helpers/qunit_config.js index 664808c3cb1..ce235ab3ecf 100644 --- a/addons/web/static/tests/helpers/qunit_config.js +++ b/addons/web/static/tests/helpers/qunit_config.js @@ -40,17 +40,63 @@ QUnit.config.hidepassed = (window.location.href.match(/[?&]testId=/) === null); var sortButtonAppended = false; +/** + * If we want to log several errors, we have to log all of them at once, as + * browser_js is closed as soon as an error is logged. + */ +const errorMessages = []; + +/** + * Waits for the module system to end processing the JS modules, so that we can + * make the suite fail if some modules couldn't be loaded (e.g. because of a + * missing dependency). + * + * @returns {Promise} + */ +async function checkModules() { + // do not mark the suite as successful already, as we still need to ensure + // that all modules have been correctly loaded + $('#qunit-banner').removeClass('qunit-pass'); + const $modulesAlert = $('
') + .addClass('alert alert-info') + .text('Waiting for modules check...'); + $modulesAlert.appendTo('#qunit'); + + // wait for the module system to end processing the JS modules + await odoo.__DEBUG__.didLogInfo; + + const info = odoo.__DEBUG__.jsModules; + if (info.missing.length || info.failed.length) { + $('#qunit-banner').addClass('qunit-fail'); + $modulesAlert.toggleClass('alert-info alert-danger'); + const failingModules = info.missing.concat(info.failed); + const error = `Some modules couldn't be started: ${failingModules.join(', ')}.`; + $modulesAlert.text(error); + errorMessages.unshift(error); + return false; + } else { + $modulesAlert.toggleClass('alert-info alert-success'); + $modulesAlert.text('All modules have been correctly loaded.'); + $('#qunit-banner').addClass('qunit-pass'); + return true; + } +} + /** * This is the way the testing framework knows that tests passed or failed. It * only look in the phantomJS console and check if there is a ok or an error. * * Someday, we should devise a safer strategy... */ -QUnit.done(function(result) { - if (!result.failed) { +QUnit.done(async function (result) { + const allModulesLoaded = await checkModules(); + if (result.failed) { + errorMessages.push(`${result.failed} / ${result.total} tests failed.`); + } + if (!result.failed && allModulesLoaded) { console.log('test successful'); } else { - console.error(result.failed, "/", result.total, "tests failed"); + console.error(errorMessages.join('\n')); } if (!sortButtonAppended) { @@ -73,7 +119,7 @@ QUnit.log(function (result) { info += ', expected: "' + result.expected + '"'; } info += ']'; - console.error(info); + errorMessages.push(info); } }); diff --git a/addons/web/views/webclient_templates.xml b/addons/web/views/webclient_templates.xml index 275a1ccd59f..27f38be597a 100644 --- a/addons/web/views/webclient_templates.xml +++ b/addons/web/views/webclient_templates.xml @@ -657,7 +657,6 @@ -