166 lines
5.2 KiB
JavaScript
166 lines
5.2 KiB
JavaScript
import { beforeEach, describe, expect, test } from "@odoo/hoot";
|
|
import { click, queryAllAttributes, queryAllProperties, queryAllTexts } from "@odoo/hoot-dom";
|
|
import { animationFrame } from "@odoo/hoot-mock";
|
|
import {
|
|
clearRegistry,
|
|
contains,
|
|
mockService,
|
|
mountWithCleanup,
|
|
onRpc,
|
|
patchWithCleanup,
|
|
serverState,
|
|
stepAllNetworkCalls,
|
|
} from "@web/../tests/web_test_helpers";
|
|
|
|
import { browser } from "@web/core/browser/browser";
|
|
import { registry } from "@web/core/registry";
|
|
import { user } from "@web/core/user";
|
|
import { getOrigin } from "@web/core/utils/urls";
|
|
|
|
import { UserMenu } from "@web/webclient/user_menu/user_menu";
|
|
import { odooAccountItem, preferencesItem } from "@web/webclient/user_menu/user_menu_items";
|
|
|
|
const userMenuRegistry = registry.category("user_menuitems");
|
|
|
|
describe.current.tags("desktop");
|
|
|
|
beforeEach(async () => {
|
|
serverState.partnerName = "Sauron";
|
|
clearRegistry(userMenuRegistry);
|
|
});
|
|
|
|
test("can be rendered", async () => {
|
|
patchWithCleanup(user, { writeDate: "2024-01-01 12:00:00" });
|
|
userMenuRegistry.add("bad_item", () => ({
|
|
type: "item",
|
|
id: "bad",
|
|
description: "Bad",
|
|
callback: () => {
|
|
expect.step("callback bad_item");
|
|
},
|
|
sequence: 10,
|
|
}));
|
|
userMenuRegistry.add("ring_item", () => ({
|
|
type: "item",
|
|
id: "ring",
|
|
description: "Ring",
|
|
callback: () => {
|
|
expect.step("callback ring_item");
|
|
},
|
|
sequence: 5,
|
|
}));
|
|
userMenuRegistry.add("frodo_item", () => ({
|
|
type: "switch",
|
|
id: "frodo",
|
|
description: "Frodo",
|
|
callback: () => {
|
|
expect.step("callback frodo_item");
|
|
},
|
|
sequence: 11,
|
|
}));
|
|
userMenuRegistry.add("separator", () => ({
|
|
type: "separator",
|
|
sequence: 15,
|
|
}));
|
|
userMenuRegistry.add("invisible_item", () => ({
|
|
type: "item",
|
|
id: "hidden",
|
|
description: "Hidden Power",
|
|
callback: () => {},
|
|
sequence: 5,
|
|
hide: true,
|
|
}));
|
|
userMenuRegistry.add("eye_item", () => ({
|
|
type: "item",
|
|
id: "eye",
|
|
description: "Eye",
|
|
callback: () => {
|
|
expect.step("callback eye_item");
|
|
},
|
|
}));
|
|
await mountWithCleanup(UserMenu);
|
|
expect("img.o_user_avatar").toHaveCount(1);
|
|
expect("img.o_user_avatar").toHaveAttribute(
|
|
"data-src",
|
|
`${getOrigin()}/web/image/res.partner/17/avatar_128?unique=1704106800000`
|
|
);
|
|
expect(".dropdown-menu .dropdown-item").toHaveCount(0);
|
|
await contains("button.dropdown-toggle").click();
|
|
expect(".dropdown-menu .dropdown-item").toHaveCount(4);
|
|
expect(".dropdown-menu .dropdown-item input.form-check-input").toHaveCount(1);
|
|
expect("div.dropdown-divider").toHaveCount(1);
|
|
expect(queryAllProperties(".dropdown-menu > *", "tagName")).toEqual([
|
|
"SPAN",
|
|
"SPAN",
|
|
"SPAN",
|
|
"DIV",
|
|
"SPAN",
|
|
]);
|
|
expect(queryAllAttributes(".dropdown-menu .dropdown-item", "data-menu")).toEqual([
|
|
"ring",
|
|
"bad",
|
|
"frodo",
|
|
"eye",
|
|
]);
|
|
expect(queryAllTexts(".dropdown-menu .dropdown-item")).toEqual(["Ring", "Bad", "Frodo", "Eye"]);
|
|
|
|
for (let i = 0; i < 4; i++) {
|
|
await click(`.dropdown-menu .dropdown-item:eq(${i})`);
|
|
|
|
await click("button.dropdown-toggle"); // re-open the dropdown
|
|
await animationFrame();
|
|
}
|
|
|
|
expect.verifySteps([
|
|
"callback ring_item",
|
|
"callback bad_item",
|
|
"callback frodo_item",
|
|
"callback eye_item",
|
|
]);
|
|
});
|
|
|
|
test("display the correct name in debug mode", async () => {
|
|
serverState.debug = true;
|
|
await mountWithCleanup(UserMenu);
|
|
expect("img.o_user_avatar").toHaveCount(1);
|
|
expect("small.oe_topbar_name").toHaveCount(1);
|
|
expect(".oe_topbar_name").toHaveText("Sauron" + "\n" + "test");
|
|
});
|
|
|
|
test("can execute the callback of settings", async () => {
|
|
onRpc("action_get", () => ({
|
|
name: "Change My Preferences",
|
|
res_id: 0,
|
|
}));
|
|
mockService("action", {
|
|
async doAction(actionId) {
|
|
expect.step(String(actionId.res_id));
|
|
expect.step(actionId.name);
|
|
return true;
|
|
},
|
|
});
|
|
|
|
userMenuRegistry.add("profile", preferencesItem);
|
|
await mountWithCleanup(UserMenu);
|
|
await contains("button.dropdown-toggle").click();
|
|
expect(".dropdown-menu .dropdown-item").toHaveCount(1);
|
|
expect(".dropdown-menu .dropdown-item").toHaveText("Preferences");
|
|
await contains(".dropdown-menu .dropdown-item").click();
|
|
expect.verifySteps(["7", "Change My Preferences"]);
|
|
});
|
|
|
|
test("click on odoo account item", async () => {
|
|
patchWithCleanup(browser, {
|
|
open: (url) => expect.step(`open ${url}`),
|
|
});
|
|
userMenuRegistry.add("odoo_account", odooAccountItem);
|
|
await mountWithCleanup(UserMenu);
|
|
onRpc("/web/session/account", () => "https://account-url.com");
|
|
stepAllNetworkCalls();
|
|
await contains("button.dropdown-toggle").click();
|
|
expect(".o-dropdown--menu .dropdown-item").toHaveCount(1);
|
|
expect(".o-dropdown--menu .dropdown-item").toHaveText("My Odoo.com account");
|
|
await contains(".o-dropdown--menu .dropdown-item").click();
|
|
expect.verifySteps(["/web/session/account", "open https://account-url.com"]);
|
|
});
|