diff --git a/addons/mail/static/tests/helpers/webclient_setup.js b/addons/mail/static/tests/helpers/webclient_setup.js
index 3c39d81f7c3..bc66018298b 100644
--- a/addons/mail/static/tests/helpers/webclient_setup.js
+++ b/addons/mail/static/tests/helpers/webclient_setup.js
@@ -12,7 +12,7 @@ import { messagingService } from '@mail/services/messaging_service';
import { makeMessagingToLegacyEnv } from '@mail/utils/make_messaging_to_legacy_env';
import { registry } from '@web/core/registry';
-import { patchWithCleanup } from "@web/../tests/helpers/utils";
+import { getFixture, patchWithCleanup } from "@web/../tests/helpers/utils";
import { createWebClient } from "@web/../tests/webclient/helpers";
import AbstractStorageService from 'web.AbstractStorageService';
@@ -166,7 +166,18 @@ function setupMessagingServiceRegistries({
serviceRegistry: legacyServiceRegistry,
...webClientParameters.legacyParams,
};
- return createWebClient(webClientParameters);
+ const target = getFixture();
+ // FIXME: the o_web_client className is automatically added by createWebClient,
+ // to ensure that the stylesheet is correctly applied. However, it causes issues
+ // with some mail test, so we remove it, except if it has been already added by
+ // the test itself. Ideally, the tests requiring this hack should be fixed and
+ // this logic should be removed.
+ const shouldRemoveClass = !target.classList.contains("o_web_client");
+ const webClient = await createWebClient(webClientParameters);
+ if (shouldRemoveClass) {
+ target.classList.remove("o_web_client");
+ }
+ return webClient;
}
export {
diff --git a/addons/web/static/tests/helpers/utils.js b/addons/web/static/tests/helpers/utils.js
index e0bd951fb83..8354eaafe65 100644
--- a/addons/web/static/tests/helpers/utils.js
+++ b/addons/web/static/tests/helpers/utils.js
@@ -265,14 +265,26 @@ export async function triggerEvent(el, selector, eventType, eventAttrs = {}) {
event = new Event(eventType, Object.assign({}, eventAttrs, { bubbles: true }));
}
const target = findElement(el, selector);
+ if (!target) {
+ throw new Error(`Can't find a target to trigger ${eventType} event`);
+ }
+ const isVisible =
+ target === document ||
+ target === window ||
+ target.offsetWidth > 0 ||
+ target.offsetHeight > 0;
+ if (!isVisible) {
+ throw new Error(`Called triggerEvent ${eventType} on invisible target`);
+ }
target.dispatchEvent(event);
await nextTick();
}
export async function triggerEvents(el, querySelector, events) {
for (let e = 0; e < events.length; e++) {
- await triggerEvent(el, querySelector, events[e]);
+ triggerEvent(el, querySelector, events[e]);
}
+ await nextTick();
}
/**
diff --git a/addons/web/static/tests/search/search_panel_tests.js b/addons/web/static/tests/search/search_panel_tests.js
index b354e7f3c81..66a537068ad 100644
--- a/addons/web/static/tests/search/search_panel_tests.js
+++ b/addons/web/static/tests/search/search_panel_tests.js
@@ -20,6 +20,7 @@ import { registry } from "@web/core/registry";
import { FilterMenu } from "@web/search/filter_menu/filter_menu";
import { GroupByMenu } from "@web/search/group_by_menu/group_by_menu";
import { SearchPanel } from "@web/search/search_panel/search_panel";
+import testUtils from "web.test_utils";
const { Component, xml } = owl;
@@ -2328,9 +2329,8 @@ QUnit.module("Search", (hooks) => {
await doAction(webclient, 1, { viewType: "form" });
- await click(target, "[name=company_id] .o_input");
- await click(target, "[name=company_id] .o_input");
- await click(document, ".o_m2o_dropdown_option");
+ await testUtils.fields.many2one.clickOpenDropdown("company_id");
+ await testUtils.fields.many2one.clickItem("company_id", "Search");
await legacyExtraNextTick();
assert.containsOnce(document.body, ".modal .o_list_view");
diff --git a/addons/web/static/tests/views/view_tests.js b/addons/web/static/tests/views/view_tests.js
index 5a694a025c1..f57160aede2 100644
--- a/addons/web/static/tests/views/view_tests.js
+++ b/addons/web/static/tests/views/view_tests.js
@@ -745,7 +745,7 @@ QUnit.module("Views", (hooks) => {
serverData.views["animal,1,toy"] = `