Odoo18-Base/addons/web/static/tests/webclient/user_menu.test.js
2025-01-06 10:57:38 +07:00

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"]);
});