Files
odoo_source/addons/web/static/tests/webclient/webclient_tests.js
T
Aaron Bohy a715e63b88 [IMP] mail,web: tests: crash if triggerEvent called on invisible el
Before this commit, the test utils that trigger an event (e.g.
click) didn't check whether the target of the event was visible.
As a consequence, when writing a test, one might trigger an event
on an invisible and undesirable target, and don't understand why
it doesn't work due to the absence of feedback. This commit
improves that situation by throwing an error in those sitations.

Obviously, some tests relying on the former behavior needed to
be slightly adapted.

closes odoo/odoo#93549

Related: odoo/enterprise#28360
Signed-off-by: Aaron Bohy (aab) <aab@odoo.com>
2022-06-14 22:07:08 +02:00

106 lines
4.4 KiB
JavaScript

/** @odoo-module **/
import { dialogService } from "@web/core/dialog/dialog_service";
import { notificationService } from "@web/core/notifications/notification_service";
import { popoverService } from "@web/core/popover/popover_service";
import { registry } from "@web/core/registry";
import { uiService } from "@web/core/ui/ui_service";
import { legacyServiceProvider } from "@web/legacy/legacy_service_provider";
import { actionService } from "@web/webclient/actions/action_service";
import { hotkeyService } from "@web/core/hotkeys/hotkey_service";
import { menuService } from "@web/webclient/menus/menu_service";
import { WebClient } from "@web/webclient/webclient";
import { clearRegistryWithCleanup, makeTestEnv } from "../helpers/mock_env";
import { fakeTitleService } from "../helpers/mock_services";
import { destroy, getFixture, mount, patchWithCleanup, triggerEvent } from "../helpers/utils";
const { Component, xml } = owl;
const mainComponentRegistry = registry.category("main_components");
const serviceRegistry = registry.category("services");
let baseConfig;
let target;
QUnit.module("WebClient", {
async beforeEach() {
serviceRegistry
.add("action", actionService)
.add("dialog", dialogService)
.add("hotkey", hotkeyService)
.add("legacy_service_provider", legacyServiceProvider)
.add("menu", menuService)
.add("notification", notificationService)
.add("popover", popoverService)
.add("title", fakeTitleService)
.add("ui", uiService);
baseConfig = { activateMockServer: true };
target = getFixture();
},
});
QUnit.test("can be rendered", async (assert) => {
assert.expect(1);
const env = await makeTestEnv(baseConfig);
await mount(WebClient, target, { env });
assert.containsOnce(target, "header > nav.o_main_navbar");
});
QUnit.test("can render a main component", async (assert) => {
assert.expect(1);
class MyComponent extends Component {}
MyComponent.template = xml`<span class="chocolate">MyComponent</span>`;
clearRegistryWithCleanup(mainComponentRegistry);
mainComponentRegistry.add("mycomponent", { Component: MyComponent });
const env = await makeTestEnv(baseConfig);
await mount(WebClient, target, { env });
assert.containsOnce(target, ".chocolate");
});
QUnit.test("control-click propagation stopped on <a href/>", async (assert) => {
assert.expect(8);
patchWithCleanup(WebClient.prototype, {
/** @param {MouseEvent} ev */
onGlobalClick(ev) {
this._super(ev);
if (ev.ctrlKey) {
assert.ok(
ev.defaultPrevented === false,
"the global click should not prevent the default behavior on ctrl-click an <a href/>"
);
// Necessary in order to prevent the test browser to open in new tab on ctrl-click
ev.preventDefault();
}
},
});
class MyComponent extends Component {
/** @param {MouseEvent} ev */
onclick(ev) {
assert.step(ev.ctrlKey ? "ctrl-click" : "click");
// Necessary in order to prevent the test browser to open in new tab on ctrl-click
ev.preventDefault();
}
}
MyComponent.template = xml`<a href="#" class="MyComponent" t-on-click="onclick">Some link</a>`;
let env = await makeTestEnv(baseConfig);
// Mount the component as standalone and control-click the <a href/>
const standaloneComponent = await mount(MyComponent, target, { env });
assert.verifySteps([]);
await triggerEvent(target.querySelector(".MyComponent"), "", "click", { ctrlKey: false });
await triggerEvent(target.querySelector(".MyComponent"), "", "click", { ctrlKey: true });
assert.verifySteps(["click", "ctrl-click"]);
destroy(standaloneComponent);
// Register the component as a main one, mount the webclient and control-click the <a href/>
clearRegistryWithCleanup(mainComponentRegistry);
mainComponentRegistry.add("mycomponent", { Component: MyComponent });
env = await makeTestEnv(baseConfig);
await mount(WebClient, target, { env });
assert.verifySteps([]);
await triggerEvent(target, ".MyComponent", "click", { ctrlKey: false });
await triggerEvent(target, ".MyComponent", "click", { ctrlKey: true });
assert.verifySteps(["click"]);
});