From 1a667293d5ae126159b4b8ad74991466b21c2b57 Mon Sep 17 00:00:00 2001 From: Aaron Bohy Date: Tue, 23 Apr 2024 09:17:14 +0200 Subject: [PATCH] [FIX] web: tests: fix randomly failing load state tests Before this commit, several qunit load state tests sometimes failed. They all follow the same pattern: - trigger an "hashchange" event to simulate an update of the url - wait twice for nextTick - check the DOM reflects the url change However, waiting for 2 ticks isn't enough. Indeed, when the url hash is set, our mock location object dispatches a "real" hashchange event on window, but it does it after a setTimeout [1]. Then, the webclient is notified (via the router service) of the url change, and reacts by loading the appropriate action. This then requires 2 ticks, because we first clear the DOM with the BlankComponent, and then we mount the requested action/view. This commit makes those tests more robust by waiting for a setTimeout before the 2 nextTicks. [1] https://github.com/odoo/odoo/blob/1882d8f89f760bd1ff8a2bf0ae798939402647a3/addons/web/static/tests/setup.js#L52 Runbot issue~37030 closes odoo/odoo#162939 Signed-off-by: Lucas Perais (lpe) --- .../static/tests/webclient/actions/load_state_tests.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/addons/web/static/tests/webclient/actions/load_state_tests.js b/addons/web/static/tests/webclient/actions/load_state_tests.js index cf1d86f2c5f..f728eef8688 100644 --- a/addons/web/static/tests/webclient/actions/load_state_tests.js +++ b/addons/web/static/tests/webclient/actions/load_state_tests.js @@ -198,6 +198,8 @@ QUnit.module("ActionManager", (hooks) => { webClient.env.bus.trigger("test:hashchange", { action: "HelloWorldTest", }); + await new Promise((r) => setTimeout(r)); // real "hashchange" event is triggered after a setTimeout [1] + // [1] https://github.com/odoo/odoo/blob/1882d8f89f760bd1ff8a2bf0ae798939402647a3/addons/web/static/tests/setup.js#L52 await nextTick(); await nextTick(); assert.strictEqual( @@ -217,6 +219,7 @@ QUnit.module("ActionManager", (hooks) => { webClient.env.bus.trigger("test:hashchange", { action: 1, }); + await new Promise((r) => setTimeout(r)); // real "hashchange" event is triggered after a setTimeout [1] await nextTick(); await nextTick(); assert.containsOnce(target, ".o_control_panel"); @@ -239,6 +242,7 @@ QUnit.module("ActionManager", (hooks) => { id: 2, model: "partner", }); + await new Promise((r) => setTimeout(r)); // real "hashchange" event is triggered after a setTimeout [1] await nextTick(); await nextTick(); assert.containsOnce(target, ".o_form_view"); @@ -281,6 +285,7 @@ QUnit.module("ActionManager", (hooks) => { model: "partner", view_type: "form", }); + await new Promise((r) => setTimeout(r)); // real "hashchange" event is triggered after a setTimeout [1] await nextTick(); await nextTick(); assert.containsOnce(target, ".o_form_view"); @@ -302,6 +307,7 @@ QUnit.module("ActionManager", (hooks) => { action: 3, view_type: "kanban", }); + await new Promise((r) => setTimeout(r)); // real "hashchange" event is triggered after a setTimeout [1] await nextTick(); await nextTick(); assert.containsNone(target, ".o_list_view"); @@ -403,6 +409,7 @@ QUnit.module("ActionManager", (hooks) => { action: 3, view_type: "kanban", }); + await new Promise((r) => setTimeout(r)); // real "hashchange" event is triggered after a setTimeout [1] await nextTick(); await nextTick(); assert.containsNone(target, ".o_list_view"); @@ -413,6 +420,7 @@ QUnit.module("ActionManager", (hooks) => { id: 4, view_type: "form", }); + await new Promise((r) => setTimeout(r)); // real "hashchange" event is triggered after a setTimeout [1] await nextTick(); await nextTick(); assert.containsNone(target, ".o_kanban_view"); @@ -448,6 +456,7 @@ QUnit.module("ActionManager", (hooks) => { id: 4, view_type: "form", }); + await new Promise((r) => setTimeout(r)); // real "hashchange" event is triggered after a setTimeout [1] await nextTick(); await nextTick(); assert.containsOnce(target, ".o_form_view");