Odoo18-Base/addons/im_livechat/static/tests/embed/livechat_service.test.js
2025-01-06 10:57:38 +07:00

139 lines
5.2 KiB
JavaScript

import { expirableStorage } from "@im_livechat/embed/common/expirable_storage";
import { LivechatButton } from "@im_livechat/embed/common/livechat_button";
import {
defineLivechatModels,
loadDefaultEmbedConfig,
} from "@im_livechat/../tests/livechat_test_helpers";
import { describe, test } from "@odoo/hoot";
import {
assertSteps,
click,
contains,
insertText,
onRpcBefore,
start,
startServer,
step,
triggerHotkey,
} from "@mail/../tests/mail_test_helpers";
import { Command, mountWithCleanup, serverState } from "@web/../tests/web_test_helpers";
describe.current.tags("desktop");
defineLivechatModels();
test("persisted session history", async () => {
const pyEnv = await startServer();
const livechatChannelId = await loadDefaultEmbedConfig();
const guestId = pyEnv["mail.guest"].create({ name: "Visitor 11" });
const channelId = pyEnv["discuss.channel"].create({
channel_member_ids: [
Command.create({ partner_id: serverState.partnerId }),
Command.create({ guest_id: guestId, fold_state: "open" }),
],
livechat_active: true,
channel_type: "livechat",
livechat_channel_id: livechatChannelId,
livechat_operator_id: serverState.partnerId,
});
expirableStorage.setItem(
"im_livechat.saved_state",
JSON.stringify({
store: { "discuss.channel": [{ id: channelId }] },
persisted: true,
livechatUserId: serverState.publicUserId,
})
);
pyEnv["mail.message"].create({
author_id: serverState.partnerId,
body: "Old message in history",
res_id: channelId,
model: "discuss.channel",
message_type: "comment",
});
await start({
authenticateAs: { ...pyEnv["mail.guest"].read(guestId)[0], _name: "mail.guest" },
});
await mountWithCleanup(LivechatButton);
await contains(".o-mail-Message-content", { text: "Old message in history" });
});
test("previous operator prioritized", async () => {
const pyEnv = await startServer();
const livechatChannelId = await loadDefaultEmbedConfig();
const userId = pyEnv["res.users"].create({ name: "John Doe", im_status: "online" });
const previousOperatorId = pyEnv["res.partner"].create({
name: "John Doe",
user_ids: [userId],
});
pyEnv["im_livechat.channel"].write([livechatChannelId], { user_ids: [Command.link(userId)] });
expirableStorage.setItem("im_livechat_previous_operator", JSON.stringify(previousOperatorId));
await start({ authenticateAs: false });
await mountWithCleanup(LivechatButton);
await click(".o-livechat-LivechatButton");
await contains(".o-mail-Message-author", { text: "John Doe" });
});
test("Only necessary requests are made when creating a new chat", async () => {
const pyEnv = await startServer();
const livechatChannelId = await loadDefaultEmbedConfig();
const operatorPartnerId = serverState.partnerId;
onRpcBefore((route, args) => {
if (!route.includes("assets")) {
step(`${route} - ${JSON.stringify(args)}`);
}
});
await start({ authenticateAs: false });
await mountWithCleanup(LivechatButton);
await contains(".o-livechat-LivechatButton");
await assertSteps([`/im_livechat/init - {"channel_id":${livechatChannelId}}`]);
await click(".o-livechat-LivechatButton");
await contains(".o-mail-Message", { text: "Hello, how may I help you?" });
await assertSteps([
`/im_livechat/get_session - ${JSON.stringify({
channel_id: livechatChannelId,
anonymous_name: "Visitor",
previous_operator_id: null,
persisted: false,
})}`,
]);
await insertText(".o-mail-Composer-input", "Hello!");
await assertSteps([]);
await triggerHotkey("Enter");
await contains(".o-mail-Message", { text: "Hello!" });
const [threadId] = pyEnv["discuss.channel"].search([], { order: "id DESC" });
await assertSteps([
`/im_livechat/get_session - ${JSON.stringify({
channel_id: livechatChannelId,
anonymous_name: "Visitor",
previous_operator_id: operatorPartnerId,
temporary_id: -1,
persisted: true,
})}`,
`/mail/data - ${JSON.stringify({
init_messaging: {
channel_types: ["livechat"],
},
failures: true, // called because mail/core/web is loaded in test bundle
systray_get_activities: true, // called because mail/core/web is loaded in test bundle
context: { lang: "en", tz: "taht", uid: serverState.userId, allowed_company_ids: [1] },
})}`,
`/mail/message/post - ${JSON.stringify({
context: {
lang: "en",
tz: "taht",
uid: serverState.userId,
allowed_company_ids: [1],
temporary_id: 0.81,
},
post_data: {
body: "Hello!",
email_add_signature: true,
message_type: "comment",
subtype_xmlid: "mail.mt_comment",
},
thread_id: threadId,
thread_model: "discuss.channel",
})}`,
]);
});