mail/static/tests/discuss_app/sidebar_tests.js
Данил Воробьев 6e6f15d803 initial commit
2024-05-03 09:40:35 +00:00

1208 lines
45 KiB
JavaScript

/* @odoo-module */
import { startServer } from "@bus/../tests/helpers/mock_python_environment";
import { Command } from "@mail/../tests/helpers/command";
import { start } from "@mail/../tests/helpers/test_utils";
import { getOrigin } from "@web/core/utils/urls";
import { click, contains, insertText } from "@web/../tests/utils";
import { triggerHotkey } from "@web/../tests/helpers/utils";
QUnit.module("discuss sidebar");
QUnit.test("toggling category button hide category items", async () => {
const pyEnv = await startServer();
pyEnv["discuss.channel"].create({
name: "general",
channel_type: "channel",
});
const { openDiscuss } = await start();
openDiscuss();
await contains("button.o-active", { text: "Inbox" });
await contains(".o-mail-DiscussSidebarChannel");
await click(
":nth-child(1 of .o-mail-DiscussSidebarCategory) .o-mail-DiscussSidebarCategory-icon"
);
await contains(".o-mail-DiscussSidebarChannel", { count: 0 });
});
QUnit.test("toggling category button does not hide active category items", async () => {
const pyEnv = await startServer();
const [channelId] = pyEnv["discuss.channel"].create([
{ name: "abc", channel_type: "channel" },
{ name: "def", channel_type: "channel" },
]);
const { openDiscuss } = await start();
openDiscuss(channelId);
await contains(".o-mail-DiscussSidebarChannel", { count: 2 });
await contains(".o-mail-DiscussSidebarChannel.o-active");
await click(
":nth-child(1 of .o-mail-DiscussSidebarCategory) .o-mail-DiscussSidebarCategory-icon"
);
await contains(".o-mail-DiscussSidebarChannel");
await contains(".o-mail-DiscussSidebarChannel.o-active");
});
QUnit.test("Closing a category sends the updated user setting to the server.", async (assert) => {
const { openDiscuss } = await start({
mockRPC(route, args) {
if (route === "/web/dataset/call_kw/res.users.settings/set_res_users_settings") {
assert.step(route);
assert.strictEqual(
args.kwargs.new_settings.is_discuss_sidebar_category_channel_open,
false
);
}
},
});
openDiscuss();
await click(
":nth-child(1 of .o-mail-DiscussSidebarCategory) .o-mail-DiscussSidebarCategory-icon"
);
assert.verifySteps(["/web/dataset/call_kw/res.users.settings/set_res_users_settings"]);
});
QUnit.test("Opening a category sends the updated user setting to the server.", async (assert) => {
const pyEnv = await startServer();
pyEnv["res.users.settings"].create({
user_id: pyEnv.currentUserId,
is_discuss_sidebar_category_channel_open: false,
});
const { openDiscuss } = await start({
mockRPC(route, args) {
if (route === "/web/dataset/call_kw/res.users.settings/set_res_users_settings") {
assert.step(route);
assert.strictEqual(
args.kwargs.new_settings.is_discuss_sidebar_category_channel_open,
true
);
}
},
});
openDiscuss();
await click(
":nth-child(1 of .o-mail-DiscussSidebarCategory) .o-mail-DiscussSidebarCategory-icon"
);
assert.verifySteps(["/web/dataset/call_kw/res.users.settings/set_res_users_settings"]);
});
QUnit.test("channel - command: should have view command when category is unfolded", async () => {
const { openDiscuss } = await start();
openDiscuss();
await contains("i[title='View or join channels']");
});
QUnit.test("channel - command: should have view command when category is folded", async () => {
const pyEnv = await startServer();
pyEnv["res.users.settings"].create({
user_id: pyEnv.currentUserId,
is_discuss_sidebar_category_channel_open: false,
});
const { openDiscuss } = await start();
openDiscuss();
await click(".o-mail-DiscussSidebarCategory-channel .btn", { text: "Channels" });
await contains("i[title='View or join channels']");
});
QUnit.test("channel - command: should have add command when category is unfolded", async () => {
const { openDiscuss } = await start();
openDiscuss();
await contains("i[title='Add or join a channel']");
});
QUnit.test("channel - command: should not have add command when category is folded", async () => {
const pyEnv = await startServer();
pyEnv["res.users.settings"].create({
user_id: pyEnv.currentUserId,
is_discuss_sidebar_category_channel_open: false,
});
const { openDiscuss } = await start();
openDiscuss();
await contains(".o-mail-DiscussSidebarCategory", { text: "Channels" });
await contains("i[title='Add or join a channel']", { count: 0 });
});
QUnit.test("channel - states: close manually by clicking the title", async () => {
const pyEnv = await startServer();
pyEnv["discuss.channel"].create({ name: "general" });
pyEnv["res.users.settings"].create({
user_id: pyEnv.currentUserId,
is_discuss_sidebar_category_channel_open: true,
});
const { openDiscuss } = await start();
openDiscuss();
await contains(".o-mail-DiscussSidebarChannel", { text: "general" });
await click(".o-mail-DiscussSidebarCategory-channel .btn", { text: "Channels" });
await contains(".o-mail-DiscussSidebarChannel", { count: 0, text: "general" });
});
QUnit.test("channel - states: open manually by clicking the title", async () => {
const pyEnv = await startServer();
pyEnv["discuss.channel"].create({ name: "general" });
pyEnv["res.users.settings"].create({
user_id: pyEnv.currentUserId,
is_discuss_sidebar_category_channel_open: false,
});
const { openDiscuss } = await start();
openDiscuss();
await contains(".o-mail-DiscussSidebarCategory-channel", { text: "Channels" });
await contains(".o-mail-DiscussSidebarChannel", { count: 0, text: "general" });
await click(".o-mail-DiscussSidebarCategory-channel .btn", { text: "Channels" });
await contains(".o-mail-DiscussSidebarChannel", { text: "general" });
});
QUnit.test("sidebar: inbox with counter", async () => {
const pyEnv = await startServer();
pyEnv["mail.notification"].create({
notification_type: "inbox",
res_partner_id: pyEnv.currentPartnerId,
});
const { openDiscuss } = await start();
openDiscuss();
await contains("button", { text: "Inbox", contains: [".badge", { text: "1" }] });
});
QUnit.test("default thread rendering", async () => {
const pyEnv = await startServer();
pyEnv["discuss.channel"].create({ name: "General" });
const { openDiscuss } = await start();
openDiscuss();
await contains("button", { text: "Inbox" });
await contains("button", { text: "Starred" });
await contains("button", { text: "History" });
await contains(".o-mail-DiscussSidebarChannel", { text: "General" });
await contains("button.o-active", { text: "Inbox" });
await contains(".o-mail-Thread", {
text: "Congratulations, your inbox is empty New messages appear here.",
});
await click("button", { text: "Starred" });
await contains("button.o-active", { text: "Starred" });
await contains(".o-mail-Thread", {
text: "No starred messages You can mark any message as 'starred', and it shows up in this mailbox.",
});
await click("button", { text: "History" });
await contains("button.o-active", { text: "History" });
await contains(".o-mail-Thread", {
text: "No history messages Messages marked as read will appear in the history.",
});
await click(".o-mail-DiscussSidebarChannel", { text: "General" });
await contains(".o-mail-DiscussSidebarChannel.o-active", { text: "General" });
await contains(".o-mail-Thread", { text: "There are no messages in this conversation." });
});
QUnit.test("sidebar quick search at 20 or more pinned channels", async () => {
const pyEnv = await startServer();
for (let id = 1; id <= 20; id++) {
pyEnv["discuss.channel"].create({ name: `channel${id}` });
}
const { openDiscuss } = await start();
openDiscuss();
await contains(".o-mail-DiscussSidebarChannel", { count: 20 });
await contains(".o-mail-DiscussSidebar input[placeholder='Quick search...']");
await insertText(".o-mail-DiscussSidebar input[placeholder='Quick search...']", "1");
await contains(".o-mail-DiscussSidebarChannel", { count: 11 });
await insertText(".o-mail-DiscussSidebar input[placeholder='Quick search...']", "12", {
replace: true,
});
await contains(".o-mail-DiscussSidebarChannel");
await contains(".o-mail-DiscussSidebarChannel", { text: "channel12" });
await insertText(".o-mail-DiscussSidebar input[placeholder='Quick search...']", "123", {
replace: true,
});
await contains(".o-mail-DiscussSidebarChannel", { count: 0 });
// search should work in case-insensitive
await insertText(".o-mail-DiscussSidebar input[placeholder='Quick search...']", "C", {
replace: true,
});
await contains(".o-mail-DiscussSidebarChannel", { count: 20 });
});
QUnit.test("sidebar quick search takes DM custom name into account", async () => {
const pyEnv = await startServer();
const partnerId = pyEnv["res.partner"].create({ name: "Demo" });
for (let id = 1; id <= 20; id++) {
pyEnv["discuss.channel"].create({ name: `channel${id}` });
}
const chatId = pyEnv["discuss.channel"].create({
channel_type: "chat",
channel_member_ids: [
Command.create({ partner_id: pyEnv.currentPartnerId }),
Command.create({ partner_id: partnerId }),
],
});
const { openDiscuss } = await start();
await openDiscuss(chatId);
await contains(".o-mail-DiscussSidebarChannel", { count: 21 });
await contains(".o-mail-DiscussSidebarChannel", { text: "Demo" });
// set custom name
await insertText("input.o-mail-Discuss-threadName:enabled", "Marc", {
replace: true,
});
triggerHotkey("Enter");
await contains(".o-mail-DiscussSidebarChannel", { text: "Marc" });
// search
await insertText(".o-mail-DiscussSidebar input[placeholder='Quick search...']", "Marc");
await contains(".o-mail-DiscussSidebarChannel");
await contains(".o-mail-DiscussSidebarChannel", { text: "Marc" });
});
QUnit.test("sidebar: basic chat rendering", async () => {
const pyEnv = await startServer();
const partnerId = pyEnv["res.partner"].create({ name: "Demo" });
pyEnv["discuss.channel"].create({
channel_member_ids: [
Command.create({ partner_id: pyEnv.currentPartnerId }),
Command.create({ partner_id: partnerId }),
],
channel_type: "chat",
});
const { openDiscuss } = await start();
openDiscuss();
await contains(".o-mail-DiscussSidebarChannel");
await contains(".o-mail-DiscussSidebarChannel", { text: "Demo" });
await contains(".o-mail-DiscussSidebarChannel img[data-alt='Thread Image']");
await contains(
".o-mail-DiscussSidebarChannel .o-mail-DiscussSidebarChannel-commands div[title='Unpin Conversation']"
);
await contains(".o-mail-DiscussSidebarChannel .badge", { count: 0 });
});
QUnit.test("sidebar: show pinned channel", async () => {
const pyEnv = await startServer();
pyEnv["discuss.channel"].create({ name: "General" });
const { openDiscuss } = await start();
openDiscuss();
await contains(".o-mail-DiscussSidebarChannel", { text: "General" });
});
QUnit.test("sidebar: open pinned channel", async () => {
const pyEnv = await startServer();
pyEnv["discuss.channel"].create({ name: "General" });
const { openDiscuss } = await start();
openDiscuss();
await click(".o-mail-DiscussSidebarChannel", { text: "General" });
await contains(".o-mail-Composer-input[placeholder='Message #General…']");
await contains(".o-mail-Discuss-threadName", { value: "General" });
});
QUnit.test("sidebar: open channel and leave it", async (assert) => {
const pyEnv = await startServer();
const channelId = pyEnv["discuss.channel"].create({
name: "General",
channel_member_ids: [
Command.create({
fold_state: "open",
is_minimized: true,
partner_id: pyEnv.currentPartnerId,
}),
],
});
const { openDiscuss } = await start({
async mockRPC(route, args) {
if (args.method === "action_unfollow") {
assert.step("action_unfollow");
assert.deepEqual(args.args[0], channelId);
}
},
});
openDiscuss();
await click(".o-mail-DiscussSidebarChannel", { text: "General" });
await contains(".o-mail-Discuss-threadName", { value: "General" });
assert.verifySteps([]);
await click(".btn[title='Leave this channel']", {
parent: [".o-mail-DiscussSidebarChannel.o-active", { text: "General" }],
});
await contains(".o-mail-DiscussSidebarChannel", { count: 0, text: "General" });
await contains(".o-mail-Discuss-threadName", { value: "Inbox" });
assert.verifySteps(["action_unfollow"]);
});
QUnit.test("sidebar: unpin chat from bus", async () => {
const pyEnv = await startServer();
const partnerId = pyEnv["res.partner"].create({ name: "Demo" });
const channelId = pyEnv["discuss.channel"].create({
channel_member_ids: [
Command.create({ partner_id: pyEnv.currentPartnerId }),
Command.create({ partner_id: partnerId }),
],
channel_type: "chat",
});
const { openDiscuss } = await start();
openDiscuss();
await contains(".o-mail-DiscussSidebarChannel", { text: "Demo" });
await click(".o-mail-DiscussSidebarChannel", { text: "Demo" });
await contains(".o-mail-Composer-input[placeholder='Message Demo…']");
await contains(".o-mail-Discuss-threadName", { value: "Demo" });
// Simulate receiving a unpin chat notification
// (e.g. from user interaction from another device or browser tab)
pyEnv["bus.bus"]._sendone(pyEnv.currentPartner, "discuss.channel/unpin", { id: channelId });
await contains(".o-mail-DiscussSidebarChannel", { count: 0, text: "Demo" });
await contains(".o-mail-Discuss-threadName", { count: 0, value: "Demo" });
});
QUnit.test("chat - channel should count unread message [REQUIRE FOCUS]", async () => {
const pyEnv = await startServer();
const partnerId = pyEnv["res.partner"].create({
name: "Demo",
im_status: "offline",
});
const channelId = pyEnv["discuss.channel"].create({
channel_member_ids: [
Command.create({ message_unread_counter: 1, partner_id: pyEnv.currentPartnerId }),
Command.create({ partner_id: partnerId }),
],
channel_type: "chat",
});
pyEnv["mail.message"].create({
author_id: partnerId,
body: "<p>Test</p>",
model: "discuss.channel",
res_id: channelId,
});
const { openDiscuss } = await start();
openDiscuss();
await contains(".o-discuss-badge", { text: "1" });
await click(".o-mail-DiscussSidebarChannel", { text: "Demo" });
await contains(".o-discuss-badge", { count: 0 });
});
QUnit.test("mark channel as seen on last message visible [REQUIRE FOCUS]", async () => {
const pyEnv = await startServer();
const channelId = pyEnv["discuss.channel"].create({
name: "test",
channel_member_ids: [
Command.create({ message_unread_counter: 1, partner_id: pyEnv.currentPartnerId }),
],
});
pyEnv["mail.message"].create({
body: "not empty",
model: "discuss.channel",
res_id: channelId,
});
const { openDiscuss } = await start();
openDiscuss();
await click(".o-mail-DiscussSidebarChannel.o-unread", { text: "test" });
await contains(".o-mail-DiscussSidebarChannel:not(.o-unread)", { text: "test" });
});
QUnit.test(
"channel - counter: should not have a counter if the category is unfolded and without needaction messages",
async () => {
const pyEnv = await startServer();
pyEnv["res.users.settings"].create({
user_id: pyEnv.currentUserId,
is_discuss_sidebar_category_channel_open: true,
});
pyEnv["discuss.channel"].create({ name: "general" });
const { openDiscuss } = await start();
openDiscuss();
await contains(".o-mail-DiscussSidebarCategory", {
contains: [
["i.oi.oi-chevron-down"],
["span", { text: "Channels" }],
[".badge", { count: 0 }],
],
});
}
);
QUnit.test(
"channel - counter: should not have a counter if the category is unfolded and with needaction messages",
async () => {
const pyEnv = await startServer();
pyEnv["res.users.settings"].create({
user_id: pyEnv.currentUserId,
is_discuss_sidebar_category_channel_open: true,
});
const [channelId_1, channelId_2] = pyEnv["discuss.channel"].create([
{ name: "channel1" },
{ name: "channel2" },
]);
const [messageId_1, messageId_2] = pyEnv["mail.message"].create([
{
body: "message 1",
model: "discuss.channel",
res_id: channelId_1,
},
{
body: "message_2",
model: "discuss.channel",
res_id: channelId_2,
},
]);
pyEnv["mail.notification"].create([
{
mail_message_id: messageId_1,
notification_type: "inbox",
res_partner_id: pyEnv.currentPartnerId,
},
{
mail_message_id: messageId_2,
notification_type: "inbox",
res_partner_id: pyEnv.currentPartnerId,
},
]);
const { openDiscuss } = await start();
openDiscuss();
await contains(".o-mail-DiscussSidebarCategory", {
contains: [
["i.oi.oi-chevron-down"],
["span", { text: "Channels" }],
[".badge", { count: 0 }],
],
});
}
);
QUnit.test(
"channel - counter: should not have a counter if category is folded and without needaction messages",
async () => {
const pyEnv = await startServer();
pyEnv["discuss.channel"].create({});
pyEnv["res.users.settings"].create({
user_id: pyEnv.currentUserId,
is_discuss_sidebar_category_channel_open: false,
});
const { openDiscuss } = await start();
openDiscuss();
await contains(".o-mail-DiscussSidebarCategory", {
contains: [
["i.oi.oi-chevron-right"],
["span", { text: "Channels" }],
[".badge", { count: 0 }],
],
});
}
);
QUnit.test(
"channel - counter: should have correct value of needaction threads if category is folded and with needaction messages",
async () => {
const pyEnv = await startServer();
const [channelId_1, channelId_2] = pyEnv["discuss.channel"].create([
{ name: "Channel_1" },
{ name: "Channel_2" },
]);
const [messageId_1, messageId_2] = pyEnv["mail.message"].create([
{
body: "message 1",
model: "discuss.channel",
res_id: channelId_1,
},
{
body: "message_2",
model: "discuss.channel",
res_id: channelId_2,
},
]);
pyEnv["mail.notification"].create([
{
mail_message_id: messageId_1,
notification_type: "inbox",
res_partner_id: pyEnv.currentPartnerId,
},
{
mail_message_id: messageId_2,
notification_type: "inbox",
res_partner_id: pyEnv.currentPartnerId,
},
]);
pyEnv["res.users.settings"].create({
user_id: pyEnv.currentUserId,
is_discuss_sidebar_category_channel_open: false,
});
const { openDiscuss } = await start();
openDiscuss();
await contains(".o-mail-DiscussSidebarCategory", {
contains: [
["i.oi.oi-chevron-right"],
["span", { text: "Channels" }],
[".badge", { text: "2" }],
],
});
}
);
QUnit.test(
"chat - counter: should not have a counter if the category is unfolded and without unread messages",
async () => {
const pyEnv = await startServer();
pyEnv["res.users.settings"].create({
user_id: pyEnv.currentUserId,
is_discuss_sidebar_category_chat_open: true,
});
pyEnv["discuss.channel"].create({
channel_member_ids: [
Command.create({ message_unread_counter: 0, partner_id: pyEnv.currentPartnerId }),
],
channel_type: "chat",
});
const { openDiscuss } = await start();
openDiscuss();
await contains(".o-mail-DiscussSidebarCategory", {
contains: [
["i.oi.oi-chevron-down"],
["span", { text: "Direct messages" }],
[".badge", { count: 0 }],
],
});
}
);
QUnit.test(
"chat - counter: should not have a counter if the category is unfolded and with unread messagens",
async () => {
const pyEnv = await startServer();
pyEnv["res.users.settings"].create({
user_id: pyEnv.currentUserId,
is_discuss_sidebar_category_chat_open: true,
});
pyEnv["discuss.channel"].create({
channel_member_ids: [
Command.create({
message_unread_counter: 10,
partner_id: pyEnv.currentPartnerId,
}),
],
channel_type: "chat",
});
const { openDiscuss } = await start();
openDiscuss();
await contains(".o-mail-DiscussSidebarCategory", {
contains: [
["i.oi.oi-chevron-down"],
["span", { text: "Direct messages" }],
[".badge", { count: 0 }],
],
});
}
);
QUnit.test(
"chat - counter: should not have a counter if category is folded and without unread messages",
async () => {
const pyEnv = await startServer();
pyEnv["res.users.settings"].create({
user_id: pyEnv.currentUserId,
is_discuss_sidebar_category_chat_open: false,
});
pyEnv["discuss.channel"].create({
channel_member_ids: [
Command.create({ message_unread_counter: 0, partner_id: pyEnv.currentPartnerId }),
],
channel_type: "chat",
});
const { openDiscuss } = await start();
openDiscuss();
await contains(".o-mail-DiscussSidebarCategory", {
contains: [
["i.oi.oi-chevron-right"],
["span", { text: "Direct messages" }],
[".badge", { count: 0 }],
],
});
}
);
QUnit.test(
"chat - counter: should have correct value of unread threads if category is folded and with unread messages",
async () => {
const pyEnv = await startServer();
pyEnv["res.users.settings"].create({
user_id: pyEnv.currentUserId,
is_discuss_sidebar_category_chat_open: false,
});
pyEnv["discuss.channel"].create([
{
channel_member_ids: [
Command.create({
message_unread_counter: 10,
partner_id: pyEnv.currentPartnerId,
}),
],
channel_type: "chat",
},
{
channel_member_ids: [
Command.create({
message_unread_counter: 20,
partner_id: pyEnv.currentPartnerId,
}),
],
channel_type: "chat",
},
]);
const { openDiscuss } = await start();
openDiscuss();
await contains(".o-mail-DiscussSidebarCategory", {
contains: [
["i.oi.oi-chevron-right"],
["span", { text: "Direct messages" }],
[".badge", { text: "2" }],
],
});
}
);
QUnit.test("chat - command: should have add command when category is unfolded", async () => {
const { openDiscuss } = await start();
openDiscuss();
await contains(".o-mail-DiscussSidebarCategory", {
contains: [
["i.oi.oi-chevron-down"],
["span", { text: "Direct messages" }],
["i[title='Start a conversation']"],
],
});
});
QUnit.test("chat - command: should not have add command when category is folded", async () => {
const pyEnv = await startServer();
pyEnv["res.users.settings"].create({
user_id: pyEnv.currentUserId,
is_discuss_sidebar_category_chat_open: false,
});
const { openDiscuss } = await start();
openDiscuss();
await contains(".o-mail-DiscussSidebarCategory", { text: "Direct messages" });
await contains(".o-mail-DiscussSidebarCategory", {
contains: [
["i.oi.oi-chevron-right"],
["span", { text: "Direct messages" }],
["i[title='Start a conversation']", { count: 0 }],
],
});
});
QUnit.test("chat - states: close manually by clicking the title", async () => {
const pyEnv = await startServer();
pyEnv["discuss.channel"].create({ channel_type: "chat" });
pyEnv["res.users.settings"].create({
user_id: pyEnv.currentUserId,
is_discuss_sidebar_category_chat_open: true,
});
const { openDiscuss } = await start();
openDiscuss();
await contains(".o-mail-DiscussSidebarChannel");
await click(".o-mail-DiscussSidebarCategory .btn", { text: "Direct messages" });
await contains(".o-mail-DiscussSidebarChannel", { count: 0 });
});
QUnit.test("sidebar channels should be ordered case insensitive alphabetically", async () => {
const pyEnv = await startServer();
pyEnv["discuss.channel"].create([
{ name: "Xyz" },
{ name: "abc" },
{ name: "Abc" },
{ name: "Est" },
{ name: "Xyz" },
{ name: "Équipe" },
{ name: "époque" },
]);
const { openDiscuss } = await start();
openDiscuss();
await contains(".o-mail-DiscussSidebarChannel", {
text: "abc",
before: [".o-mail-DiscussSidebarChannel", { text: "Abc" }],
});
await contains(".o-mail-DiscussSidebarChannel", {
text: "Abc",
before: [".o-mail-DiscussSidebarChannel", { text: "époque" }],
});
await contains(".o-mail-DiscussSidebarChannel", {
text: "époque",
before: [".o-mail-DiscussSidebarChannel", { text: "Équipe" }],
});
await contains(".o-mail-DiscussSidebarChannel", {
text: "Équipe",
before: [".o-mail-DiscussSidebarChannel", { text: "Est" }],
});
await contains(".o-mail-DiscussSidebarChannel", {
text: "Est",
before: [".o-mail-DiscussSidebarChannel", { text: "Xyz", count: 2 }],
});
});
QUnit.test("sidebar: public channel rendering", async () => {
const pyEnv = await startServer();
pyEnv["discuss.channel"].create({
name: "channel1",
channel_type: "channel",
group_public_id: false,
});
const { openDiscuss } = await start();
openDiscuss();
await contains("button", { text: "channel1", contains: [".fa-globe"] });
});
QUnit.test("channel - avatar: should have correct avatar", async () => {
const pyEnv = await startServer();
const channelId = pyEnv["discuss.channel"].create({
name: "test",
avatarCacheKey: "100111",
});
const { openDiscuss } = await start();
openDiscuss();
await contains(".o-mail-DiscussSidebarChannel img");
await contains(
`img[data-src='${getOrigin()}/discuss/channel/${channelId}/avatar_128?unique=100111']`
);
});
QUnit.test("channel - avatar: should update avatar url from bus", async (assert) => {
const pyEnv = await startServer();
const channelId = pyEnv["discuss.channel"].create({ avatarCacheKey: "101010", name: "test" });
const { env, openDiscuss } = await start();
openDiscuss(channelId);
await contains(
`img[data-src='${getOrigin()}/discuss/channel/${channelId}/avatar_128?unique=101010']`,
{ count: 2 }
);
await env.services.orm.call("discuss.channel", "write", [
[channelId],
{ image_128: "This field does not matter" },
]);
const result = pyEnv["discuss.channel"].searchRead([["id", "=", channelId]]);
const newCacheKey = result[0]["avatarCacheKey"];
await contains(
`img[data-src='${getOrigin()}/discuss/channel/${channelId}/avatar_128?unique=${newCacheKey}']`,
{ count: 2 }
);
});
QUnit.test("channel - states: close should update the value on the server", async (assert) => {
const pyEnv = await startServer();
pyEnv["discuss.channel"].create({ name: "test" });
pyEnv["res.users.settings"].create({
user_id: pyEnv.currentUserId,
is_discuss_sidebar_category_channel_open: true,
});
const currentUserId = pyEnv.currentUserId;
const { openDiscuss, env } = await start();
openDiscuss();
const initalSettings = await env.services.orm.call(
"res.users.settings",
"_find_or_create_for_user",
[[currentUserId]]
);
assert.ok(initalSettings.is_discuss_sidebar_category_channel_open);
await click(".o-mail-DiscussSidebarCategory .btn", { text: "Channels" });
const newSettings = await env.services.orm.call(
"res.users.settings",
"_find_or_create_for_user",
[[currentUserId]]
);
assert.notOk(newSettings.is_discuss_sidebar_category_channel_open);
});
QUnit.test("channel - states: open should update the value on the server", async (assert) => {
const pyEnv = await startServer();
pyEnv["discuss.channel"].create({ name: "test" });
pyEnv["res.users.settings"].create({
user_id: pyEnv.currentUserId,
is_discuss_sidebar_category_channel_open: false,
});
const currentUserId = pyEnv.currentUserId;
const { openDiscuss, env } = await start();
openDiscuss();
const initalSettings = await env.services.orm.call(
"res.users.settings",
"_find_or_create_for_user",
[[currentUserId]]
);
assert.notOk(initalSettings.is_discuss_sidebar_category_channel_open);
await click(".o-mail-DiscussSidebarCategory .btn", { text: "Channels" });
const newSettings = await env.services.orm.call(
"res.users.settings",
"_find_or_create_for_user",
[[currentUserId]]
);
assert.ok(newSettings.is_discuss_sidebar_category_channel_open);
});
QUnit.test("channel - states: close from the bus", async () => {
const pyEnv = await startServer();
pyEnv["discuss.channel"].create({ name: "channel1" });
const userSettingsId = pyEnv["res.users.settings"].create({
user_id: pyEnv.currentUserId,
is_discuss_sidebar_category_channel_open: true,
});
const { openDiscuss } = await start();
openDiscuss();
pyEnv["bus.bus"]._sendone(pyEnv.currentPartner, "res.users.settings", {
id: userSettingsId,
is_discuss_sidebar_category_channel_open: false,
});
await contains(".o-mail-DiscussSidebarCategory-channel .oi-chevron-right");
await contains("button", { count: 0, text: "channel1" });
});
QUnit.test("channel - states: open from the bus", async () => {
const pyEnv = await startServer();
pyEnv["discuss.channel"].create({ name: "channel1" });
const userSettingsId = pyEnv["res.users.settings"].create({
user_id: pyEnv.currentUserId,
is_discuss_sidebar_category_channel_open: false,
});
const { openDiscuss } = await start();
openDiscuss();
pyEnv["bus.bus"]._sendone(pyEnv.currentPartner, "res.users.settings", {
id: userSettingsId,
is_discuss_sidebar_category_channel_open: true,
});
await contains(".o-mail-DiscussSidebarCategory-channel .oi-chevron-down");
await contains("button", { text: "channel1" });
});
QUnit.test(
"channel - states: the active category item should be visible even if the category is closed",
async () => {
const pyEnv = await startServer();
pyEnv["discuss.channel"].create({ name: "channel1" });
const { openDiscuss } = await start();
openDiscuss();
await click(".o-mail-DiscussSidebarChannel", { text: "channel1" });
await contains("button.o-active", { text: "channel1" });
await click(".o-mail-DiscussSidebarCategory .btn", { text: "Channels" });
await contains(".o-mail-DiscussSidebarCategory-channel .oi-chevron-right");
await contains("button", { text: "channel1" });
await click("button", { text: "Inbox" });
await contains("button", { count: 0, text: "channel1" });
}
);
QUnit.test("chat - states: open manually by clicking the title", async () => {
const pyEnv = await startServer();
pyEnv["discuss.channel"].create({
channel_type: "chat",
});
pyEnv["res.users.settings"].create({
user_id: pyEnv.currentUserId,
is_discuss_sidebar_category_chat_open: false,
});
const { openDiscuss } = await start();
openDiscuss();
await click(".o-mail-DiscussSidebarCategory-chat .btn", { text: "Direct messages" });
await contains(".o-mail-DiscussSidebar button", { text: "Mitchell Admin" });
});
QUnit.test("chat - states: close should call update server data", async (assert) => {
const pyEnv = await startServer();
pyEnv["discuss.channel"].create({ name: "test" });
pyEnv["res.users.settings"].create({
user_id: pyEnv.currentUserId,
is_discuss_sidebar_category_chat_open: true,
});
const currentUserId = pyEnv.currentUserId;
const { openDiscuss, env } = await start();
openDiscuss();
const initalSettings = await env.services.orm.call(
"res.users.settings",
"_find_or_create_for_user",
[[currentUserId]]
);
assert.ok(initalSettings.is_discuss_sidebar_category_chat_open);
await click(".o-mail-DiscussSidebarCategory-chat .btn", { text: "Direct messages" });
const newSettings = await env.services.orm.call(
"res.users.settings",
"_find_or_create_for_user",
[[currentUserId]]
);
assert.notOk(newSettings.is_discuss_sidebar_category_chat_open);
});
QUnit.test("chat - states: open should call update server data", async (assert) => {
const pyEnv = await startServer();
pyEnv["discuss.channel"].create({ name: "test" });
pyEnv["res.users.settings"].create({
user_id: pyEnv.currentUserId,
is_discuss_sidebar_category_chat_open: false,
});
const { openDiscuss, env } = await start();
openDiscuss();
const currentUserId = pyEnv.currentUserId;
const initalSettings = await env.services.orm.call(
"res.users.settings",
"_find_or_create_for_user",
[[currentUserId]]
);
assert.notOk(initalSettings.is_discuss_sidebar_category_chat_open);
await click(".o-mail-DiscussSidebarCategory-chat .btn", { text: "Direct messages" });
const newSettings = await env.services.orm.call(
"res.users.settings",
"_find_or_create_for_user",
[[currentUserId]]
);
assert.ok(newSettings.is_discuss_sidebar_category_chat_open);
});
QUnit.test("chat - states: close from the bus", async () => {
const pyEnv = await startServer();
pyEnv["discuss.channel"].create({ channel_type: "chat" });
const userSettingsId = pyEnv["res.users.settings"].create({
user_id: pyEnv.currentUserId,
is_discuss_sidebar_category_chat_open: true,
});
const { openDiscuss } = await start();
openDiscuss();
pyEnv["bus.bus"]._sendone(pyEnv.currentPartner, "res.users.settings", {
id: userSettingsId,
is_discuss_sidebar_category_chat_open: false,
});
await contains(".o-mail-DiscussSidebarCategory-chat .oi-chevron-right");
await contains(".o-mail-DiscussSidebar button", { count: 0, text: "Mitchell Admin" });
});
QUnit.test("chat - states: open from the bus", async () => {
const pyEnv = await startServer();
pyEnv["discuss.channel"].create({ channel_type: "chat" });
const userSettingsId = pyEnv["res.users.settings"].create({
user_id: pyEnv.currentUserId,
is_discuss_sidebar_category_chat_open: false,
});
const { openDiscuss } = await start();
openDiscuss();
pyEnv["bus.bus"]._sendone(pyEnv.currentPartner, "res.users.settings", {
id: userSettingsId,
is_discuss_sidebar_category_chat_open: true,
});
await contains(".o-mail-DiscussSidebarCategory-chat .oi-chevron-down");
await contains(".o-mail-DiscussSidebar button", { text: "Mitchell Admin" });
});
QUnit.test(
"chat - states: the active category item should be visible even if the category is closed",
async () => {
const pyEnv = await startServer();
pyEnv["discuss.channel"].create({ channel_type: "chat" });
const { openDiscuss } = await start();
openDiscuss();
await contains(".o-mail-DiscussSidebarCategory-chat .oi-chevron-down");
await contains(".o-mail-DiscussSidebar button", { text: "Mitchell Admin" });
await click(".o-mail-DiscussSidebar button", { text: "Mitchell Admin" });
await contains("button.o-active", { text: "Mitchell Admin" });
await click(".o-mail-DiscussSidebarCategory-chat .btn", { text: "Direct messages" });
await contains(".o-mail-DiscussSidebarCategory-chat .oi-chevron-right");
await contains(".o-mail-DiscussSidebar button", { text: "Mitchell Admin" });
await click("button", { text: "Inbox" });
await contains(".o-mail-DiscussSidebarCategory-chat .oi-chevron-right");
await contains(".o-mail-DiscussSidebar button", { count: 0, text: "Mitchell Admin" });
}
);
QUnit.test("chat - avatar: should have correct avatar", async () => {
const pyEnv = await startServer();
const partnerId = pyEnv["res.partner"].create({
name: "Demo",
im_status: "offline",
});
pyEnv["discuss.channel"].create({
channel_member_ids: [
Command.create({ partner_id: pyEnv.currentPartnerId }),
Command.create({ partner_id: partnerId }),
],
channel_type: "chat",
});
const { openDiscuss } = await start();
openDiscuss();
await contains(".o-mail-DiscussSidebarChannel img");
await contains(`img[data-src$='/web/image/res.partner/${partnerId}/avatar_128']`);
});
QUnit.test("chat should be sorted by last activity time [REQUIRE FOCUS]", async () => {
const pyEnv = await startServer();
const [demo_id, yoshi_id] = pyEnv["res.partner"].create([{ name: "Demo" }, { name: "Yoshi" }]);
pyEnv["res.users"].create([{ partner_id: demo_id }, { partner_id: yoshi_id }]);
pyEnv["discuss.channel"].create([
{
channel_member_ids: [
[
0,
0,
{
last_interest_dt: "2021-01-01 10:00:00",
partner_id: pyEnv.currentPartnerId,
},
],
Command.create({ partner_id: demo_id }),
],
channel_type: "chat",
},
{
channel_member_ids: [
[
0,
0,
{
last_interest_dt: "2021-02-01 10:00:00",
partner_id: pyEnv.currentPartnerId,
},
],
Command.create({ partner_id: yoshi_id }),
],
channel_type: "chat",
},
]);
const { openDiscuss } = await start();
openDiscuss();
await contains(
".o-mail-DiscussSidebarChannel",
{ text: "Yoshi" },
{ before: [".o-mail-DiscussSidebarChannel", { text: "Demo" }] }
);
await click(".o-mail-DiscussSidebarChannel", { text: "Demo" });
// post a new message on the last channel
await insertText(".o-mail-Composer-input[placeholder='Message Demo…']", "Blabla");
await click(".o-mail-Composer-send:enabled");
await contains(
".o-mail-DiscussSidebarChannel",
{ text: "Demo" },
{ before: [".o-mail-DiscussSidebarChannel", { text: "Yoshi" }] }
);
});
QUnit.test("Can unpin chat channel", async () => {
const pyEnv = await startServer();
pyEnv["discuss.channel"].create({ channel_type: "chat" });
const { openDiscuss } = await start();
openDiscuss();
await contains(".o-mail-DiscussSidebarChannel", { text: "Mitchell Admin" });
await click(".o-mail-DiscussSidebarChannel [title='Unpin Conversation']");
await contains(".o-mail-DiscussSidebarChannel", { count: 0, text: "Mitchell Admin" });
});
QUnit.test("Unpinning chat should display notification", async () => {
const pyEnv = await startServer();
pyEnv["discuss.channel"].create({ channel_type: "chat" });
const { openDiscuss } = await start();
openDiscuss();
await click(".o-mail-DiscussSidebarChannel [title='Unpin Conversation']");
await contains(".o-mail-DiscussSidebarChannel", { count: 0 });
await contains(".o_notification.border-info", {
text: "You unpinned your conversation with Mitchell Admin",
});
});
QUnit.test("Can leave channel", async () => {
const pyEnv = await startServer();
const channelId = pyEnv["discuss.channel"].create({ name: "General" });
const { openDiscuss } = await start();
openDiscuss(channelId);
await contains(".o-mail-DiscussSidebarChannel", { text: "General" });
await click("[title='Leave this channel']");
await contains(".o-mail-DiscussSidebarChannel", { count: 0, text: "General" });
});
QUnit.test("Do no channel_info after unpin", async (assert) => {
const pyEnv = await startServer();
const channelId = pyEnv["discuss.channel"].create({ name: "General", channel_type: "chat" });
const { env, openDiscuss } = await start({
mockRPC(route, args, originalRPC) {
if (route === "/discuss/channel/info") {
assert.step("channel_info");
}
return originalRPC(route, args);
},
});
openDiscuss(channelId);
await click(".o-mail-DiscussSidebarChannel-commands [title='Unpin Conversation']");
env.services.rpc("/mail/message/post", {
thread_id: channelId,
thread_model: "discuss.channel",
post_data: {
body: "Hello world",
message_type: "comment",
},
});
// weak test, no guarantee that we waited long enough for the potential rpc to be done
assert.verifySteps([]);
});
QUnit.test("Group unread counter up to date after mention is marked as seen", async () => {
const pyEnv = await startServer();
const partnerId = pyEnv["res.partner"].create({ name: "Chuck" });
const channelId = pyEnv["discuss.channel"].create({
channel_member_ids: [
Command.create({ partner_id: pyEnv.currentPartnerId }),
Command.create({ partner_id: partnerId }),
],
channel_type: "group",
});
const messageId = pyEnv["mail.message"].create({
author_id: partnerId,
model: "discuss.channel",
res_id: channelId,
body: "@Mitchell Admin",
needaction: true,
});
pyEnv["mail.notification"].create([
{
mail_message_id: messageId,
notification_type: "inbox",
res_partner_id: pyEnv.currentPartnerId,
},
]);
const { openDiscuss } = await start();
openDiscuss();
await contains(".o-mail-DiscussSidebarChannel .o-discuss-badge");
click(".o-mail-DiscussSidebarChannel");
await contains(".o-discuss-badge", { count: 0 });
});
QUnit.test("Unpinning channel closes its chat window", async () => {
const pyEnv = await startServer();
pyEnv["discuss.channel"].create({ name: "Sales" });
const { openFormView, openDiscuss } = await start();
await openFormView("discuss.channel");
await click(".o_menu_systray i[aria-label='Messages']");
await click(".o-mail-NotificationItem");
await contains(".o-mail-ChatWindow", { text: "Sales" });
openDiscuss();
await click("[title='Leave this channel']", {
parent: [".o-mail-DiscussSidebarChannel", { text: "Sales" }],
});
await openFormView("discuss.channel");
await contains(".o-mail-ChatWindow", { count: 0, text: "Sales" });
});
QUnit.test("Update channel data via bus notification", async () => {
const pyEnv = await startServer();
const channelId = pyEnv["discuss.channel"].create({
name: "Sales",
channel_member_ids: [Command.create({ partner_id: pyEnv.currentPartnerId })],
channel_type: "channel",
create_uid: pyEnv.currentUserId,
});
const tab1 = await start({ asTab: true });
const tab2 = await start({ asTab: true });
tab1.openDiscuss(channelId);
tab2.openDiscuss(channelId);
await contains(".o-mail-DiscussSidebarChannel", { text: "Sales", target: tab1.target });
await insertText(".o-mail-Discuss-threadName", "test", { target: tab1.target });
await triggerHotkey("Enter");
await contains(".o-mail-DiscussSidebarChannel", { text: "Salestest", target: tab2.target });
});