diff --git a/addons/mail/static/tests/chat_window/chat_window_tests.js b/addons/mail/static/tests/chat_window/chat_window_tests.js
index b67a6251cc0..e0e20cd133d 100644
--- a/addons/mail/static/tests/chat_window/chat_window_tests.js
+++ b/addons/mail/static/tests/chat_window/chat_window_tests.js
@@ -75,7 +75,7 @@ QUnit.test(
}
);
-QUnit.test("Message post in chat window of chatter should log a note", async (assert) => {
+QUnit.test("Message post in chat window of chatter should log a note", async () => {
const pyEnv = await startServer();
const partnerId = pyEnv["res.partner"].create({ name: "TestPartner" });
const messageId = pyEnv["mail.message"].create({
@@ -135,7 +135,7 @@ QUnit.test("chat window: basic rendering", async (assert) => {
await click(".o-mail-NotificationItem");
await contains(".o-mail-ChatWindow");
await contains(".o-mail-ChatWindow-header");
- assert.containsOnce($(".o-mail-ChatWindow-header"), ".o-mail-ChatWindow-threadAvatar");
+ await contains(".o-mail-ChatWindow-header .o-mail-ChatWindow-threadAvatar");
await contains(".o-mail-ChatWindow-name:contains(General)");
await contains(".o-mail-ChatWindow-command", 4);
await contains("[title='Start a Call']");
@@ -841,7 +841,7 @@ QUnit.test(
}
);
-QUnit.test("chat window: composer state conservation on toggle discuss", async (assert) => {
+QUnit.test("chat window: composer state conservation on toggle discuss", async () => {
const pyEnv = await startServer();
const channelId = pyEnv["discuss.channel"].create({});
const { openDiscuss, openView } = await start();
diff --git a/addons/mail/static/tests/discuss/core/web/chat_window_new_message_tests.js b/addons/mail/static/tests/discuss/core/web/chat_window_new_message_tests.js
index eb5183c14d9..c98caf7da70 100644
--- a/addons/mail/static/tests/discuss/core/web/chat_window_new_message_tests.js
+++ b/addons/mail/static/tests/discuss/core/web/chat_window_new_message_tests.js
@@ -20,21 +20,16 @@ import { makeDeferred } from "@web/../tests/helpers/utils";
QUnit.module("chat window: new message");
-QUnit.test("basic rendering", async (assert) => {
+QUnit.test("basic rendering", async () => {
await start();
await click(".o_menu_systray i[aria-label='Messages']");
await click("button:contains(New Message)");
await contains(".o-mail-ChatWindow");
await contains(".o-mail-ChatWindow-header");
- await contains(".o-mail-ChatWindow-header .o-mail-ChatWindow-name");
- assert.strictEqual(
- $(".o-mail-ChatWindow-header .o-mail-ChatWindow-name").text(),
- "New message"
- );
+ await contains(".o-mail-ChatWindow-header .o-mail-ChatWindow-name:contains(New message)");
await contains(".o-mail-ChatWindow-header .o-mail-ChatWindow-command", 2);
await contains(".o-mail-ChatWindow-header .o-mail-ChatWindow-command[title='Fold']");
- assert.containsOnce(
- $,
+ await contains(
".o-mail-ChatWindow-header .o-mail-ChatWindow-command[title='Close Chat Window']"
);
await contains("span:contains('To :')");
diff --git a/addons/mail/static/tests/discuss/typing/typing_tests.js b/addons/mail/static/tests/discuss/typing/typing_tests.js
index 9492e4d5ec7..a635f8823cb 100644
--- a/addons/mail/static/tests/discuss/typing/typing_tests.js
+++ b/addons/mail/static/tests/discuss/typing/typing_tests.js
@@ -3,20 +3,13 @@
import { LONG_TYPING, SHORT_TYPING } from "@mail/discuss/typing/common/composer_patch";
import { OTHER_LONG_TYPING } from "@mail/discuss/typing/common/typing_service";
import { Command } from "@mail/../tests/helpers/command";
-import {
- afterNextRender,
- click,
- insertText,
- nextAnimationFrame,
- start,
- startServer,
-} from "@mail/../tests/helpers/test_utils";
+import { click, contains, insertText, start, startServer } from "@mail/../tests/helpers/test_utils";
import { nextTick } from "@web/../tests/helpers/utils";
QUnit.module("typing");
-QUnit.test('receive other member typing status "is typing"', async (assert) => {
+QUnit.test('receive other member typing status "is typing"', async () => {
const pyEnv = await startServer();
const userId = pyEnv["res.users"].create({ name: "Demo" });
const partnerId = pyEnv["res.partner"].create({ name: "Demo", user_ids: [userId] });
@@ -29,23 +22,20 @@ QUnit.test('receive other member typing status "is typing"', async (assert) => {
});
const { env, openDiscuss } = await start();
await openDiscuss(channelId);
- assert.strictEqual($(".o-discuss-Typing").text(), "");
-
+ await contains(".o-discuss-Typing:not(:contains(Demo is typing...))");
// simulate receive typing notification from demo
- await afterNextRender(() =>
- pyEnv.withUser(userId, () =>
- env.services.rpc("/discuss/channel/notify_typing", {
- channel_id: channelId,
- is_typing: true,
- })
- )
+ pyEnv.withUser(userId, () =>
+ env.services.rpc("/discuss/channel/notify_typing", {
+ channel_id: channelId,
+ is_typing: true,
+ })
);
- assert.strictEqual($(".o-discuss-Typing").text(), "Demo is typing...");
+ await contains(".o-discuss-Typing:contains(Demo is typing...)");
});
QUnit.test(
'receive other member typing status "is typing" then "no longer is typing"',
- async (assert) => {
+ async () => {
const pyEnv = await startServer();
const userId = pyEnv["res.users"].create({ name: "Demo" });
const partnerId = pyEnv["res.partner"].create({ name: "Demo", user_ids: [userId] });
@@ -58,35 +48,30 @@ QUnit.test(
});
const { env, openDiscuss } = await start();
await openDiscuss(channelId);
- assert.strictEqual($(".o-discuss-Typing").text(), "");
+ await contains(".o-discuss-Typing:not(:contains(Demo is typing...))");
// simulate receive typing notification from demo "is typing"
- await afterNextRender(() =>
- pyEnv.withUser(userId, () =>
- env.services.rpc("/discuss/channel/notify_typing", {
- channel_id: channelId,
- is_typing: true,
- })
- )
+ pyEnv.withUser(userId, () =>
+ env.services.rpc("/discuss/channel/notify_typing", {
+ channel_id: channelId,
+ is_typing: true,
+ })
);
- assert.strictEqual($(".o-discuss-Typing").text(), "Demo is typing...");
-
+ await contains(".o-discuss-Typing:contains(Demo is typing...)");
// simulate receive typing notification from demo "is no longer typing"
- await afterNextRender(() =>
- pyEnv.withUser(userId, () =>
- env.services.rpc("/discuss/channel/notify_typing", {
- channel_id: channelId,
- is_typing: false,
- })
- )
+ pyEnv.withUser(userId, () =>
+ env.services.rpc("/discuss/channel/notify_typing", {
+ channel_id: channelId,
+ is_typing: false,
+ })
);
- assert.strictEqual($(".o-discuss-Typing").text(), "");
+ await contains(".o-discuss-Typing:not(:contains(Demo is typing...))");
}
);
QUnit.test(
'assume other member typing status becomes "no longer is typing" after long without any updated typing status',
- async (assert) => {
+ async () => {
const pyEnv = await startServer();
const userId = pyEnv["res.users"].create({ name: "Demo" });
const partnerId = pyEnv["res.partner"].create({ name: "Demo", user_ids: [userId] });
@@ -100,27 +85,24 @@ QUnit.test(
const { advanceTime, env, openDiscuss } = await start({ hasTimeControl: true });
await openDiscuss(channelId);
- assert.strictEqual($(".o-discuss-Typing").text(), "");
+ await contains(".o-discuss-Typing:not(:contains(Demo is typing...))");
// simulate receive typing notification from demo "is typing"
- await afterNextRender(() =>
- pyEnv.withUser(userId, () =>
- env.services.rpc("/discuss/channel/notify_typing", {
- channel_id: channelId,
- is_typing: true,
- })
- )
+ pyEnv.withUser(userId, () =>
+ env.services.rpc("/discuss/channel/notify_typing", {
+ channel_id: channelId,
+ is_typing: true,
+ })
);
- assert.strictEqual($(".o-discuss-Typing").text(), "Demo is typing...");
-
- await afterNextRender(() => advanceTime(OTHER_LONG_TYPING));
- assert.strictEqual($(".o-discuss-Typing").text(), "");
+ await contains(".o-discuss-Typing:contains(Demo is typing...)");
+ advanceTime(OTHER_LONG_TYPING);
+ await contains(".o-discuss-Typing:not(:contains(Demo is typing...))");
}
);
QUnit.test(
'other member typing status "is typing" refreshes of assuming no longer typing',
- async (assert) => {
+ async () => {
const pyEnv = await startServer();
const userId = pyEnv["res.users"].create({ name: "Demo" });
const partnerId = pyEnv["res.partner"].create({ name: "Demo", user_ids: [userId] });
@@ -133,18 +115,16 @@ QUnit.test(
});
const { advanceTime, env, openDiscuss } = await start({ hasTimeControl: true });
await openDiscuss(channelId);
- assert.strictEqual($(".o-discuss-Typing").text(), "");
+ await contains(".o-discuss-Typing:not(:contains(Demo is typing...))");
// simulate receive typing notification from demo "is typing"
- await afterNextRender(() =>
- pyEnv.withUser(userId, () =>
- env.services.rpc("/discuss/channel/notify_typing", {
- channel_id: channelId,
- is_typing: true,
- })
- )
+ pyEnv.withUser(userId, () =>
+ env.services.rpc("/discuss/channel/notify_typing", {
+ channel_id: channelId,
+ is_typing: true,
+ })
);
- assert.strictEqual($(".o-discuss-Typing").text(), "Demo is typing...");
+ await contains(".o-discuss-Typing:contains(Demo is typing...)");
// simulate receive typing notification from demo "is typing" again after long time.
await advanceTime(LONG_TYPING);
@@ -156,14 +136,13 @@ QUnit.test(
);
await nextTick();
await advanceTime(LONG_TYPING);
- await nextAnimationFrame();
- assert.strictEqual($(".o-discuss-Typing").text(), "Demo is typing...");
- await afterNextRender(() => advanceTime(OTHER_LONG_TYPING - LONG_TYPING));
- assert.strictEqual($(".o-discuss-Typing").text(), "");
+ await contains(".o-discuss-Typing:contains(Demo is typing...)");
+ advanceTime(OTHER_LONG_TYPING - LONG_TYPING);
+ await contains(".o-discuss-Typing:not(:contains(Demo is typing...))");
}
);
-QUnit.test('receive several other members typing status "is typing"', async (assert) => {
+QUnit.test('receive several other members typing status "is typing"', async () => {
const pyEnv = await startServer();
const [userId_1, userId_2, userId_3] = pyEnv["res.users"].create([
{ name: "Other 10" },
@@ -186,70 +165,48 @@ QUnit.test('receive several other members typing status "is typing"', async (ass
});
const { env, openDiscuss } = await start();
await openDiscuss(channelId);
- assert.strictEqual($(".o-discuss-Typing").text(), "");
+ await contains(".o-discuss-Typing:not(:contains(Demo is typing...))");
// simulate receive typing notification from other 10 (is typing)
- await afterNextRender(() =>
- pyEnv.withUser(userId_1, () =>
- env.services.rpc("/discuss/channel/notify_typing", {
- channel_id: channelId,
- is_typing: true,
- })
- )
+ pyEnv.withUser(userId_1, () =>
+ env.services.rpc("/discuss/channel/notify_typing", {
+ channel_id: channelId,
+ is_typing: true,
+ })
);
- assert.strictEqual($(".o-discuss-Typing").text(), "Other 10 is typing...");
-
+ await contains(".o-discuss-Typing:contains(Other 10 is typing...)");
// simulate receive typing notification from other 11 (is typing)
- await afterNextRender(() =>
- pyEnv.withUser(userId_2, () =>
- env.services.rpc("/discuss/channel/notify_typing", {
- channel_id: channelId,
- is_typing: true,
- })
- )
+ pyEnv.withUser(userId_2, () =>
+ env.services.rpc("/discuss/channel/notify_typing", {
+ channel_id: channelId,
+ is_typing: true,
+ })
);
- assert.strictEqual(
- $(".o-discuss-Typing").text(),
- "Other 10 and Other 11 are typing...",
- "Should display longer typer named first"
- );
-
+ await contains(".o-discuss-Typing:contains(Other 10 and Other 11 are typing...)");
// simulate receive typing notification from other 12 (is typing)
- await afterNextRender(() =>
- pyEnv.withUser(userId_3, () =>
- env.services.rpc("/discuss/channel/notify_typing", {
- channel_id: channelId,
- is_typing: true,
- })
- )
+ pyEnv.withUser(userId_3, () =>
+ env.services.rpc("/discuss/channel/notify_typing", {
+ channel_id: channelId,
+ is_typing: true,
+ })
);
- assert.strictEqual($(".o-discuss-Typing").text(), "Other 10, Other 11 and more are typing...");
-
+ await contains(".o-discuss-Typing:contains(Other 10, Other 11 and more are typing...)");
// simulate receive typing notification from other 10 (no longer is typing)
- await afterNextRender(() =>
- pyEnv.withUser(userId_1, () =>
- env.services.rpc("/discuss/channel/notify_typing", {
- channel_id: channelId,
- is_typing: false,
- })
- )
+ pyEnv.withUser(userId_1, () =>
+ env.services.rpc("/discuss/channel/notify_typing", {
+ channel_id: channelId,
+ is_typing: false,
+ })
);
- assert.strictEqual($(".o-discuss-Typing").text(), "Other 11 and Other 12 are typing...");
-
+ await contains(".o-discuss-Typing:contains(Other 11 and Other 12 are typing...)");
// simulate receive typing notification from other 10 (is typing again)
- await afterNextRender(() =>
- pyEnv.withUser(userId_1, () =>
- env.services.rpc("/discuss/channel/notify_typing", {
- channel_id: channelId,
- is_typing: true,
- })
- )
- );
- assert.strictEqual(
- $(".o-discuss-Typing").text(),
- "Other 11, Other 12 and more are typing...",
- "Should order by longer typer ('Other 10' just recently restarted typing)"
+ pyEnv.withUser(userId_1, () =>
+ env.services.rpc("/discuss/channel/notify_typing", {
+ channel_id: channelId,
+ is_typing: true,
+ })
);
+ await contains(".o-discuss-Typing:contains(Other 11, Other 12 and more are typing...)");
});
QUnit.test("current partner notify is typing to other thread members", async (assert) => {
@@ -334,13 +291,11 @@ QUnit.test(
await openDiscuss(channelId);
await insertText(".o-mail-Composer-input", "a");
assert.verifySteps(["notify_typing:true"]);
-
- await nextAnimationFrame();
- assert.strictEqual($(".o-discuss-Typing").text(), "");
+ await contains(".o-discuss-Typing:not(:contains(Demo is typing...))");
}
);
-QUnit.test("chat: correspondent is typing", async (assert) => {
+QUnit.test("chat: correspondent is typing", async () => {
const pyEnv = await startServer();
const userId = pyEnv["res.users"].create({ name: "Demo" });
const partnerId = pyEnv["res.partner"].create({
@@ -357,37 +312,27 @@ QUnit.test("chat: correspondent is typing", async (assert) => {
});
const { env, openDiscuss } = await start();
await openDiscuss();
- assert.containsOnce(
- $(".o-mail-DiscussSidebarChannel"),
- ".o-mail-DiscussSidebarChannel-threadIcon"
- );
- assert.containsOnce($, ".fa-circle.text-success");
-
+ await contains(".o-mail-DiscussSidebarChannel .o-mail-DiscussSidebarChannel-threadIcon");
+ await contains(".fa-circle.text-success");
// simulate receive typing notification from demo "is typing"
- await afterNextRender(() =>
- pyEnv.withUser(userId, () =>
- env.services.rpc("/discuss/channel/notify_typing", {
- channel_id: channelId,
- is_typing: true,
- })
- )
+ pyEnv.withUser(userId, () =>
+ env.services.rpc("/discuss/channel/notify_typing", {
+ channel_id: channelId,
+ is_typing: true,
+ })
);
- assert.containsOnce($, ".o-discuss-Typing-icon");
- assert.strictEqual($(".o-discuss-Typing-icon")[0].title, "Demo is typing...");
-
+ await contains(".o-discuss-Typing-icon[title='Demo is typing...']");
// simulate receive typing notification from demo "no longer is typing"
- await afterNextRender(() =>
- pyEnv.withUser(userId, () =>
- env.services.rpc("/discuss/channel/notify_typing", {
- channel_id: channelId,
- is_typing: false,
- })
- )
+ pyEnv.withUser(userId, () =>
+ env.services.rpc("/discuss/channel/notify_typing", {
+ channel_id: channelId,
+ is_typing: false,
+ })
);
- assert.containsOnce($, ".fa-circle.text-success");
+ await contains(".fa-circle.text-success");
});
-QUnit.test("chat: correspondent is typing in chat window", async (assert) => {
+QUnit.test("chat: correspondent is typing in chat window", async () => {
const pyEnv = await startServer();
const userId = pyEnv["res.users"].create({ name: "Demo" });
const partnerId = pyEnv["res.partner"].create({
@@ -405,25 +350,21 @@ QUnit.test("chat: correspondent is typing in chat window", async (assert) => {
const { env } = await start();
await click(".o_menu_systray i[aria-label='Messages']");
await click(".o-mail-NotificationItem");
- assert.containsNone($, "[title='Demo is typing...']");
+ await contains("[title='Demo is typing...']", 0);
// simulate receive typing notification from demo "is typing"
- await afterNextRender(() =>
- pyEnv.withUser(userId, () =>
- env.services.rpc("/discuss/channel/notify_typing", {
- channel_id: channelId,
- is_typing: true,
- })
- )
+ pyEnv.withUser(userId, () =>
+ env.services.rpc("/discuss/channel/notify_typing", {
+ channel_id: channelId,
+ is_typing: true,
+ })
);
- assert.containsOnce($, "[title='Demo is typing...']");
+ await contains("[title='Demo is typing...']");
// simulate receive typing notification from demo "no longer is typing"
- await afterNextRender(() =>
- pyEnv.withUser(userId, () =>
- env.services.rpc("/discuss/channel/notify_typing", {
- channel_id: channelId,
- is_typing: false,
- })
- )
+ pyEnv.withUser(userId, () =>
+ env.services.rpc("/discuss/channel/notify_typing", {
+ channel_id: channelId,
+ is_typing: false,
+ })
);
- assert.containsNone($, "[title='Demo is typing...']");
+ await contains("[title='Demo is typing...']", 0);
});
diff --git a/addons/mail/static/tests/discuss_app/discuss_tests.js b/addons/mail/static/tests/discuss_app/discuss_tests.js
index d01f6c39b3e..99e2e96d5ee 100644
--- a/addons/mail/static/tests/discuss_app/discuss_tests.js
+++ b/addons/mail/static/tests/discuss_app/discuss_tests.js
@@ -451,7 +451,6 @@ QUnit.test("sidebar: Inbox should have icon", async () => {
QUnit.test("sidebar: default active inbox", async () => {
const { openDiscuss } = await start();
openDiscuss();
- await contains("button:contains(Inbox)");
await contains("button:contains(Inbox).o-active");
});
diff --git a/addons/mail/static/tests/discuss_app/sidebar_tests.js b/addons/mail/static/tests/discuss_app/sidebar_tests.js
index 28703bea5fe..8cd69871921 100644
--- a/addons/mail/static/tests/discuss_app/sidebar_tests.js
+++ b/addons/mail/static/tests/discuss_app/sidebar_tests.js
@@ -217,7 +217,7 @@ QUnit.test("sidebar quick search at 20 or more pinned channels", async () => {
await contains(".o-mail-DiscussSidebarChannel", 0);
});
-QUnit.test("sidebar: basic chat rendering", async (assert) => {
+QUnit.test("sidebar: basic chat rendering", async () => {
const pyEnv = await startServer();
const partnerId = pyEnv["res.partner"].create({ name: "Demo" });
pyEnv["discuss.channel"].create({
@@ -229,16 +229,13 @@ QUnit.test("sidebar: basic chat rendering", async (assert) => {
});
const { openDiscuss } = await start();
openDiscuss();
- await contains(".o-mail-DiscussSidebarChannel:contains(Demo)");
- const $chat = $(".o-mail-DiscussSidebarChannel:contains(Demo)");
- assert.containsOnce($chat, "img[data-alt='Thread Image']");
- assert.containsOnce($chat, "span:contains(Demo)");
- assert.containsOnce($chat, ".o-mail-DiscussSidebarChannel-commands");
- assert.containsOnce(
- $chat,
- ".o-mail-DiscussSidebarChannel-commands div[title='Unpin Conversation']"
+ await contains(".o-mail-DiscussSidebarChannel");
+ await contains(".o-mail-DiscussSidebarChannel span:contains(Demo)");
+ await contains(".o-mail-DiscussSidebarChannel img[data-alt='Thread Image']");
+ await contains(
+ ".o-mail-DiscussSidebarChannel .o-mail-DiscussSidebarChannel-commands div[title='Unpin Conversation']"
);
- assert.containsNone($chat, ".badge");
+ await contains(".o-mail-DiscussSidebarChannel .badge", 0);
});
QUnit.test("sidebar: show pinned channel", async () => {
@@ -249,7 +246,7 @@ QUnit.test("sidebar: show pinned channel", async () => {
await contains(".o-mail-DiscussSidebarChannel:contains(General)");
});
-QUnit.test("sidebar: open pinned channel", async (assert) => {
+QUnit.test("sidebar: open pinned channel", async () => {
const pyEnv = await startServer();
pyEnv["discuss.channel"].create({ name: "General" });
const { openDiscuss } = await start();
@@ -937,7 +934,7 @@ QUnit.test("chat - avatar: should have correct avatar", async () => {
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 (assert) => {
+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 }]);
diff --git a/addons/mail/static/tests/mail_utils_tests.js b/addons/mail/static/tests/mail_utils_tests.js
index c833c522d73..82572274b67 100644
--- a/addons/mail/static/tests/mail_utils_tests.js
+++ b/addons/mail/static/tests/mail_utils_tests.js
@@ -62,7 +62,7 @@ QUnit.test("addLink: utility function and special entities", function (assert) {
}
});
-QUnit.test("addLink: linkify inside text node (1 occurrence)", function (assert) {
+QUnit.test("addLink: linkify inside text node (1 occurrence)", async (assert) => {
const content = "
some text https://somelink.com
";
const linkified = parseAndTransform(content, addLink);
assert.ok(linkified.startsWith("some text
});
const { openDiscuss } = await start();
await openDiscuss(channelId);
- assert.containsOnce($, ".o-mail-MessageSeenIndicator");
+ await contains(".o-mail-MessageSeenIndicator");
assert.doesNotHaveClass($(".o-mail-MessageSeenIndicator"), "o-all-seen");
- assert.containsOnce($, ".o-mail-MessageSeenIndicator i");
+ await contains(".o-mail-MessageSeenIndicator i");
});
QUnit.test("rendering when everyone have received the message", async (assert) => {
@@ -65,9 +65,9 @@ QUnit.test("rendering when everyone have received the message", async (assert) =
});
const { openDiscuss } = await start();
await openDiscuss(channelId);
- assert.containsOnce($, ".o-mail-MessageSeenIndicator");
+ await contains(".o-mail-MessageSeenIndicator");
assert.doesNotHaveClass($(".o-mail-MessageSeenIndicator"), "o-all-seen");
- assert.containsOnce($, ".o-mail-MessageSeenIndicator i");
+ await contains(".o-mail-MessageSeenIndicator i");
});
QUnit.test("rendering when just one has seen the message", async (assert) => {
@@ -103,9 +103,9 @@ QUnit.test("rendering when just one has seen the message", async (assert) => {
});
const { openDiscuss } = await start();
await openDiscuss(channelId);
- assert.containsOnce($, ".o-mail-MessageSeenIndicator");
+ await contains(".o-mail-MessageSeenIndicator");
assert.doesNotHaveClass($(".o-mail-MessageSeenIndicator"), "o-all-seen");
- assert.containsN($, ".o-mail-MessageSeenIndicator i", 2);
+ await contains(".o-mail-MessageSeenIndicator i", 2);
});
QUnit.test("rendering when just one has seen & received the message", async (assert) => {
@@ -137,9 +137,9 @@ QUnit.test("rendering when just one has seen & received the message", async (ass
});
const { openDiscuss } = await start();
await openDiscuss(channelId);
- assert.containsOnce($, ".o-mail-MessageSeenIndicator");
+ await contains(".o-mail-MessageSeenIndicator");
assert.doesNotHaveClass($(".o-mail-MessageSeenIndicator"), "o-all-seen");
- assert.containsN($, ".o-mail-MessageSeenIndicator i", 2);
+ await contains(".o-mail-MessageSeenIndicator i", 2);
});
QUnit.test("rendering when just everyone has seen the message", async (assert) => {
@@ -168,12 +168,12 @@ QUnit.test("rendering when just everyone has seen the message", async (assert) =
});
const { openDiscuss } = await start();
await openDiscuss(channelId);
- assert.containsOnce($, ".o-mail-MessageSeenIndicator");
+ await contains(".o-mail-MessageSeenIndicator");
assert.hasClass($(".o-mail-MessageSeenIndicator"), "o-all-seen");
- assert.containsN($, ".o-mail-MessageSeenIndicator i", 2);
+ await contains(".o-mail-MessageSeenIndicator i", 2);
});
-QUnit.test("'channel_fetch' notification received is correctly handled", async (assert) => {
+QUnit.test("'channel_fetch' notification received is correctly handled", async () => {
const pyEnv = await startServer();
const partnerId = pyEnv["res.partner"].create({ name: "test" });
const channelId = pyEnv["discuss.channel"].create({
@@ -192,8 +192,8 @@ QUnit.test("'channel_fetch' notification received is correctly handled", async (
});
const { openDiscuss } = await start();
await openDiscuss(channelId);
- assert.containsOnce($, ".o-mail-Message");
- assert.containsNone($, ".o-mail-MessageSeenIndicator i");
+ await contains(".o-mail-Message");
+ await contains(".o-mail-MessageSeenIndicator i", 0);
const channel = pyEnv["discuss.channel"].searchRead([["id", "=", channelId]])[0];
// Simulate received channel fetched notification
@@ -204,10 +204,10 @@ QUnit.test("'channel_fetch' notification received is correctly handled", async (
partner_id: partnerId,
});
});
- assert.containsOnce($, ".o-mail-MessageSeenIndicator i");
+ await contains(".o-mail-MessageSeenIndicator i");
});
-QUnit.test("'channel_seen' notification received is correctly handled", async (assert) => {
+QUnit.test("'channel_seen' notification received is correctly handled", async () => {
const pyEnv = await startServer();
const partnerId = pyEnv["res.partner"].create({ name: "test" });
const channelId = pyEnv["discuss.channel"].create({
@@ -226,8 +226,8 @@ QUnit.test("'channel_seen' notification received is correctly handled", async (a
});
const { openDiscuss } = await start();
await openDiscuss(channelId);
- assert.containsOnce($, ".o-mail-Message");
- assert.containsNone($, ".o-mail-MessageSeenIndicator i");
+ await contains(".o-mail-Message");
+ await contains(".o-mail-MessageSeenIndicator i", 0);
const channel = pyEnv["discuss.channel"].searchRead([["id", "=", channelId]])[0];
// Simulate received channel seen notification
@@ -238,12 +238,12 @@ QUnit.test("'channel_seen' notification received is correctly handled", async (a
partner_id: partnerId,
});
});
- assert.containsN($, ".o-mail-MessageSeenIndicator i", 2);
+ await contains(".o-mail-MessageSeenIndicator i", 2);
});
QUnit.test(
"'channel_fetch' notification then 'channel_seen' received are correctly handled",
- async (assert) => {
+ async () => {
const pyEnv = await startServer();
const partnerId = pyEnv["res.partner"].create({ name: "Recipient" });
const channelId = pyEnv["discuss.channel"].create({
@@ -262,8 +262,8 @@ QUnit.test(
});
const { openDiscuss } = await start();
await openDiscuss(channelId);
- assert.containsOnce($, ".o-mail-Message");
- assert.containsNone($, ".o-mail-MessageSeenIndicator i");
+ await contains(".o-mail-Message");
+ await contains(".o-mail-MessageSeenIndicator i", 0);
const channel = pyEnv["discuss.channel"].searchRead([["id", "=", channelId]])[0];
// Simulate received channel fetched notification
@@ -274,7 +274,7 @@ QUnit.test(
partner_id: partnerId,
});
});
- assert.containsOnce($, ".o-mail-MessageSeenIndicator i");
+ await contains(".o-mail-MessageSeenIndicator i");
// Simulate received channel seen notification
await afterNextRender(() => {
@@ -284,13 +284,13 @@ QUnit.test(
partner_id: partnerId,
});
});
- assert.containsN($, ".o-mail-MessageSeenIndicator i", 2);
+ await contains(".o-mail-MessageSeenIndicator i", 2);
}
);
QUnit.test(
"do not show message seen indicator on the last message seen by everyone when the current user is not author of the message",
- async (assert) => {
+ async () => {
const pyEnv = await startServer();
const partnerId = pyEnv["res.partner"].create({ name: "Demo User" });
const channelId = pyEnv["discuss.channel"].create({
@@ -311,14 +311,14 @@ QUnit.test(
pyEnv["discuss.channel.member"].write(memberIds, { seen_message_id: messageId });
const { openDiscuss } = await start();
await openDiscuss(channelId);
- assert.containsOnce($, ".o-mail-Message");
- assert.containsNone($, ".o-mail-MessageSeenIndicator");
+ await contains(".o-mail-Message");
+ await contains(".o-mail-MessageSeenIndicator", 0);
}
);
QUnit.test(
"do not show message seen indicator on all the messages of the current user that are older than the last message seen by everyone",
- async (assert) => {
+ async () => {
const pyEnv = await startServer();
const partnerId = pyEnv["res.partner"].create({ name: "Demo User" });
const channelId = pyEnv["discuss.channel"].create({
@@ -347,21 +347,20 @@ QUnit.test(
pyEnv["discuss.channel.member"].write(memberIds, { seen_message_id: messageId_2 });
const { openDiscuss } = await start();
await openDiscuss(channelId);
- assert.containsOnce($, ".o-mail-Message:contains(Message before last seen)");
- assert.containsOnce(
- $,
+ await contains(".o-mail-Message:contains(Message before last seen)");
+ await contains(
".o-mail-Message:contains(Message before last seen) .o-mail-MessageSeenIndicator"
);
- assert.containsNone(
- $,
- ".o-mail-Message:contains(Message before last seen) .o-mail-MessageSeenIndicator i"
+ await contains(
+ ".o-mail-Message:contains(Message before last seen) .o-mail-MessageSeenIndicator i",
+ 0
);
}
);
QUnit.test(
"only show messaging seen indicator if authored by me, after last seen by all message",
- async (assert) => {
+ async () => {
const pyEnv = await startServer();
const partnerId = pyEnv["res.partner"].create({ name: "Demo User" });
const channelId = pyEnv["discuss.channel"].create({
@@ -385,8 +384,8 @@ QUnit.test(
});
const { openDiscuss } = await start();
await openDiscuss(channelId);
- assert.containsOnce($, ".o-mail-Message");
- assert.containsOnce($, ".o-mail-MessageSeenIndicator");
- assert.containsN($, ".o-mail-MessageSeenIndicator i", 1);
+ await contains(".o-mail-Message");
+ await contains(".o-mail-MessageSeenIndicator");
+ await contains(".o-mail-MessageSeenIndicator i");
}
);
diff --git a/addons/mail/static/tests/message/message_tests.js b/addons/mail/static/tests/message/message_tests.js
index 2ccf404ba1e..b4540e148e8 100644
--- a/addons/mail/static/tests/message/message_tests.js
+++ b/addons/mail/static/tests/message/message_tests.js
@@ -11,7 +11,7 @@ import {
} from "@mail/../tests/helpers/test_utils";
import { deserializeDateTime } from "@web/core/l10n/dates";
-import { url } from "@web/core/utils/urls";
+import { getOrigin } from "@web/core/utils/urls";
import {
editInput,
makeDeferred,
@@ -591,7 +591,7 @@ QUnit.test("Add the same reaction twice from the emoji picker", async () => {
await contains(".o-mail-MessageReaction:contains('😅')");
});
-QUnit.test("basic rendering of message", async (assert) => {
+QUnit.test("basic rendering of message", async () => {
const pyEnv = await startServer();
const channelId = pyEnv["discuss.channel"].create({ name: "general" });
const partnerId = pyEnv["res.partner"].create({ name: "Demo" });
@@ -604,27 +604,17 @@ QUnit.test("basic rendering of message", async (assert) => {
});
const { openDiscuss } = await start();
openDiscuss(channelId);
- await contains(".o-mail-Message:contains(body)");
- const $message = $(".o-mail-Message:contains(body)");
- assert.containsOnce($message, ".o-mail-Message-sidebar");
- assert.containsOnce($message, ".o-mail-Message-sidebar .o-mail-Message-avatarContainer img");
- assert.hasAttrValue(
- $message.find(".o-mail-Message-sidebar .o-mail-Message-avatarContainer img"),
- "data-src",
- url(`/discuss/channel/${channelId}/partner/${partnerId}/avatar_128`)
+ await contains(".o-mail-Message");
+ await contains(".o-mail-Message .o-mail-Message-content:contains(body)");
+ await contains(
+ `.o-mail-Message .o-mail-Message-sidebar .o-mail-Message-avatarContainer img[data-src='${getOrigin()}/discuss/channel/${channelId}/partner/${partnerId}/avatar_128']`
);
- assert.containsOnce($message, ".o-mail-Message-header");
- assert.containsOnce($message, ".o-mail-Message-header .o-mail-Message-author:contains(Demo)");
- assert.containsOnce($message, ".o-mail-Message-header .o-mail-Message-date");
- assert.hasAttrValue(
- $message.find(".o-mail-Message-header .o-mail-Message-date"),
- "title",
- deserializeDateTime("2019-04-20 10:00:00").toLocaleString(
- DateTime.DATETIME_SHORT_WITH_SECONDS
- )
+ await contains(".o-mail-Message .o-mail-Message-header .o-mail-Message-author:contains(Demo)");
+ await contains(
+ `.o-mail-Message .o-mail-Message-header .o-mail-Message-date[title='${deserializeDateTime(
+ "2019-04-20 10:00:00"
+ ).toLocaleString(DateTime.DATETIME_SHORT_WITH_SECONDS)}']`
);
- assert.containsOnce($message, ".o-mail-Message-content");
- assert.strictEqual($message.find(".o-mail-Message-content").text(), "body");
});
QUnit.test("should not be able to reply to temporary/transient messages", async () => {
@@ -638,7 +628,7 @@ QUnit.test("should not be able to reply to temporary/transient messages", async
await contains(".o-mail-Message [title='Reply']", 0);
});
-QUnit.test("message comment of same author within 1min. should be squashed", async (assert) => {
+QUnit.test("message comment of same author within 1min. should be squashed", async () => {
// messages are squashed when "close", e.g. less than 1 minute has elapsed
// from messages of same author and same thread. Note that this should
// be working in non-mailboxes
@@ -800,7 +790,7 @@ QUnit.test(
QUnit.test(
"Name of message author is not displayed in chat window for channel of type chat",
- async (assert) => {
+ async () => {
const pyEnv = await startServer();
const channelId = pyEnv["discuss.channel"].create({ channel_type: "chat" });
const partnerId = pyEnv["res.partner"].create({ name: "A" });
@@ -1503,7 +1493,7 @@ QUnit.test("Mark as unread", async () => {
await contains(".o-mail-DiscussSidebarChannel .badge:contains(1)");
});
-QUnit.test("Avatar of unknown author", async (assert) => {
+QUnit.test("Avatar of unknown author", async () => {
const pyEnv = await startServer();
pyEnv["mail.message"].create({
body: "Want to know features and benefits of using the new software.
",
diff --git a/addons/mail/static/tests/messaging/messaging_tests.js b/addons/mail/static/tests/messaging/messaging_tests.js
index ec4d974fb8e..534672e07fd 100644
--- a/addons/mail/static/tests/messaging/messaging_tests.js
+++ b/addons/mail/static/tests/messaging/messaging_tests.js
@@ -1,47 +1,36 @@
/* @odoo-module */
import { Command } from "@mail/../tests/helpers/command";
-import {
- afterNextRender,
- click,
- insertText,
- start,
- startServer,
-} from "@mail/../tests/helpers/test_utils";
+import { click, contains, insertText, start, startServer } from "@mail/../tests/helpers/test_utils";
QUnit.module("messaging");
-QUnit.test(
- "Receiving a new message out of discuss app should open a chat window",
- async (assert) => {
- const pyEnv = await startServer();
- const partnerId = pyEnv["res.partner"].create({ name: "Dumbledore" });
- const userId = pyEnv["res.users"].create({ partner_id: partnerId });
- const channelId = pyEnv["discuss.channel"].create({
- channel_member_ids: [
- Command.create({ partner_id: pyEnv.currentPartnerId }),
- Command.create({ partner_id: partnerId }),
- ],
- channel_type: "chat",
- });
- const { env } = await start();
- // simulate receving new message
- await afterNextRender(() =>
- pyEnv.withUser(userId, () =>
- env.services.rpc("/mail/message/post", {
- post_data: { body: "new message", message_type: "comment" },
- thread_id: channelId,
- thread_model: "discuss.channel",
- })
- )
- );
- assert.containsOnce($, ".o-mail-ChatWindow-header:contains(Dumbledore)");
- }
-);
+QUnit.test("Receiving a new message out of discuss app should open a chat window", async () => {
+ const pyEnv = await startServer();
+ const partnerId = pyEnv["res.partner"].create({ name: "Dumbledore" });
+ const userId = pyEnv["res.users"].create({ partner_id: partnerId });
+ const channelId = pyEnv["discuss.channel"].create({
+ channel_member_ids: [
+ Command.create({ partner_id: pyEnv.currentPartnerId }),
+ Command.create({ partner_id: partnerId }),
+ ],
+ channel_type: "chat",
+ });
+ const { env } = await start();
+ // simulate receving new message
+ pyEnv.withUser(userId, () =>
+ env.services.rpc("/mail/message/post", {
+ post_data: { body: "new message", message_type: "comment" },
+ thread_id: channelId,
+ thread_model: "discuss.channel",
+ })
+ );
+ await contains(".o-mail-ChatWindow-header:contains(Dumbledore)");
+});
QUnit.test(
"Receiving a new message in discuss app should open a chat window after leaving discuss app",
- async (assert) => {
+ async () => {
const pyEnv = await startServer();
const partnerId = pyEnv["res.partner"].create({ name: "Dumbledore" });
const userId = pyEnv["res.users"].create({ partner_id: partnerId });
@@ -64,13 +53,13 @@ QUnit.test(
);
// leaving discuss.
await openFormView("res.partner", partnerId);
- assert.containsOnce($, ".o-mail-ChatWindow-header:contains(Dumbledore)");
+ await contains(".o-mail-ChatWindow-header:contains(Dumbledore)");
}
);
QUnit.test(
"Posting a message in discuss app should not open a chat window after leaving discuss app",
- async (assert) => {
+ async () => {
const pyEnv = await startServer();
const partnerId = pyEnv["res.partner"].create({ name: "Dumbledore" });
const channelId = pyEnv["discuss.channel"].create({
@@ -86,6 +75,7 @@ QUnit.test(
await click(".o-mail-Composer-send:not(:disabled)");
// leaving discuss.
await openFormView("res.partner", partnerId);
- assert.containsNone($, ".o-mail-ChatWindow-header:contains(Dumbledore)");
+ // weak test, no guarantee that we waited long enough for the potential chat window to open
+ await contains(".o-mail-ChatWindow-header:contains(Dumbledore)", 0);
}
);
diff --git a/addons/mail/static/tests/messaging_menu/messaging_menu_tests.js b/addons/mail/static/tests/messaging_menu/messaging_menu_tests.js
index 6fe4b29158c..7bb92359665 100644
--- a/addons/mail/static/tests/messaging_menu/messaging_menu_tests.js
+++ b/addons/mail/static/tests/messaging_menu/messaging_menu_tests.js
@@ -352,7 +352,7 @@ QUnit.test("mark unread channel as read", async (assert) => {
await contains(".o-mail-ChatWindow", 0);
});
-QUnit.test("mark failure as read", async (assert) => {
+QUnit.test("mark failure as read", async () => {
const pyEnv = await startServer();
const messageId = pyEnv["mail.message"].create({
message_type: "email",
@@ -378,10 +378,7 @@ QUnit.test("mark failure as read", async (assert) => {
await click(".o-mail-NotificationItem [title='Mark As Read']");
await contains(".o-mail-NotificationItem:contains(Channel)", 0);
- assert.containsNone(
- $,
- ".o-mail-NotificationItem:contains(An error occurred when sending an email)"
- );
+ await contains(".o-mail-NotificationItem:contains(An error occurred when sending an email)", 0);
});
QUnit.test("different discuss.channel are not grouped", async () => {
@@ -633,7 +630,7 @@ QUnit.test("filtered previews", async () => {
await contains('.o-mail-NotificationItem:contains("channel1")');
});
-QUnit.test("no code injection in message body preview", async (assert) => {
+QUnit.test("no code injection in message body preview", async () => {
const pyEnv = await startServer();
const channelId = pyEnv["discuss.channel"].create({});
pyEnv["mail.message"].create({
@@ -643,15 +640,13 @@ QUnit.test("no code injection in message body preview", async (assert) => {
});
await start();
await click(".o_menu_systray .dropdown-toggle:has(i[aria-label='Messages'])");
- await contains(".o-mail-NotificationItem");
- assert.strictEqual(
- $(".o-mail-NotificationItem-text").text().replace(/\s/g, ""),
- "You:&shoulnotberaisedthrownewError('CodeInjectionError');"
+ await contains(
+ ".o-mail-NotificationItem-text:contains(You: &shoulnotberaisedthrow new Error('CodeInjectionError');)"
);
- assert.containsNone($(".o-mail-NotificationItem-text"), "script");
+ await contains(".o-mail-NotificationItem-text script", 0);
});
-QUnit.test("no code injection in message body preview from sanitized message", async (assert) => {
+QUnit.test("no code injection in message body preview from sanitized message", async () => {
const pyEnv = await startServer();
const channelId = pyEnv["discuss.channel"].create({});
pyEnv["mail.message"].create({
@@ -661,13 +656,10 @@ QUnit.test("no code injection in message body preview from sanitized message", a
});
await start();
await click(".o_menu_systray .dropdown-toggle:has(i[aria-label='Messages'])");
- await contains(".o-mail-NotificationItem");
- await contains(".o-mail-NotificationItem-text");
- assert.strictEqual(
- $(".o-mail-NotificationItem-text").text().replace(/\s/g, ""),
- "You:&shoulnotberaised"
+ await contains(
+ ".o-mail-NotificationItem-text:contains(You: &shoulnotberaised)"
);
- assert.containsNone($(".o-mail-NotificationItem-text"), "script");
+ await contains(".o-mail-NotificationItem-text script", 0);
});
QUnit.test("
tags in message body preview are transformed in spaces", async (assert) => {
diff --git a/addons/mail/static/tests/thread/attachment_list_tests.js b/addons/mail/static/tests/thread/attachment_list_tests.js
index 674ab8952ea..d5e7ad8dc9d 100644
--- a/addons/mail/static/tests/thread/attachment_list_tests.js
+++ b/addons/mail/static/tests/thread/attachment_list_tests.js
@@ -31,7 +31,7 @@ QUnit.test("simplest layout", async (assert) => {
await contains(".o-mail-AttachmentCard-image");
assert.hasClass($(".o-mail-AttachmentCard-image"), "o_image"); // required for mimetype.scss style
assert.hasAttrValue($(".o-mail-AttachmentCard-image"), "data-mimetype", "text/plain"); // required for mimetype.scss style
- assert.containsN($, ".o-mail-AttachmentCard-aside button", 2);
+ await contains(".o-mail-AttachmentCard-aside button", 2);
await contains(".o-mail-AttachmentCard-unlink");
await contains(".o-mail-AttachmentCard-aside button[title='Download']");
});
diff --git a/addons/mail/static/tests/web/activity/activity_widget_tests.js b/addons/mail/static/tests/web/activity/activity_widget_tests.js
index 5ea801ad753..65d86884d7d 100644
--- a/addons/mail/static/tests/web/activity/activity_widget_tests.js
+++ b/addons/mail/static/tests/web/activity/activity_widget_tests.js
@@ -40,7 +40,7 @@ QUnit.test("list activity widget with no activity", async (assert) => {
res_model: "res.users",
views: [[false, "list"]],
});
- assert.containsOnce($, ".o-mail-ActivityButton i.text-muted");
+ await contains(".o-mail-ActivityButton i.text-muted");
await contains(".o-mail-ListActivity-summary:eq(0):contains()");
assert.verifySteps(["/web/dataset/call_kw/res.users/unity_web_search_read"]);
});
@@ -92,12 +92,12 @@ QUnit.test("list activity widget with activities", async (assert) => {
res_model: "res.users",
views: [[false, "list"]],
});
- assert.containsOnce($(".o_data_row:eq(0)"), ".o-mail-ActivityButton i.text-warning.fa-phone");
+ await contains(".o_data_row:eq(0) .o-mail-ActivityButton i.text-warning.fa-phone");
assert.strictEqual(
$(".o_data_row:eq(0) .o-mail-ListActivity-summary")[0].innerText,
"Call with Al"
);
- assert.containsOnce($(".o_data_row:eq(1)"), ".o-mail-ActivityButton i.text-success.fa-clock-o");
+ await contains(".o_data_row:eq(1) .o-mail-ActivityButton i.text-success.fa-clock-o");
assert.strictEqual($(".o_data_row:eq(1) .o-mail-ListActivity-summary")[0].innerText, "Type 2");
assert.verifySteps(["/web/dataset/call_kw/res.users/unity_web_search_read"]);
});
@@ -140,7 +140,7 @@ QUnit.test("list activity widget with exception", async (assert) => {
res_model: "res.users",
views: [[false, "list"]],
});
- assert.containsOnce($, ".o-mail-ActivityButton i.text-warning.fa-warning");
+ await contains(".o-mail-ActivityButton i.text-warning.fa-warning");
await contains(".o-mail-ListActivity-summary:eq(0):contains(Warning)");
assert.verifySteps(["/web/dataset/call_kw/res.users/unity_web_search_read"]);
});
@@ -229,7 +229,7 @@ QUnit.test("list activity widget: open dropdown", async (assert) => {
assert.verifySteps(["unity_web_search_read", "activity_format", "action_feedback", "web_read"]);
});
-QUnit.test("list activity exception widget with activity", async (assert) => {
+QUnit.test("list activity exception widget with activity", async () => {
const pyEnv = await startServer();
const [activityTypeId_1, activityTypeId_2] = pyEnv["mail.activity.type"].create([{}, {}]);
const [activityId_1, activityId_2] = pyEnv["mail.activity"].create([
@@ -275,13 +275,7 @@ QUnit.test("list activity exception widget with activity", async (assert) => {
res_model: "res.users",
views: [[false, "list"]],
});
- assert.containsN($, ".o_data_row", 2);
- assert.containsNone(
- $(".o_data_row .o_activity_exception_cell")[0],
- ".o-mail-ActivityException"
- );
- assert.containsOnce(
- $(".o_data_row .o_activity_exception_cell")[1],
- ".o-mail-ActivityException"
- );
+ await contains(".o_data_row", 2);
+ await contains(".o_data_row .o_activity_exception_cell:eq(0) .o-mail-ActivityException", 0);
+ await contains(".o_data_row .o_activity_exception_cell:eq(1) .o-mail-ActivityException");
});
diff --git a/addons/mail/static/tests/web/chatter_tests.js b/addons/mail/static/tests/web/chatter_tests.js
index 3f38f87c605..cabfa4a6967 100644
--- a/addons/mail/static/tests/web/chatter_tests.js
+++ b/addons/mail/static/tests/web/chatter_tests.js
@@ -221,7 +221,7 @@ QUnit.test("chatter: drop attachments", async (assert) => {
await contains(".o-mail-AttachmentCard", 0);
await afterNextRender(() => dropFiles($(".o-mail-Dropzone")[0], files));
- assert.containsN($, ".o-mail-AttachmentCard", 2);
+ await contains(".o-mail-AttachmentCard", 2);
await afterNextRender(() => dragenterFiles($(".o-mail-Chatter")[0]));
files = [
@@ -232,7 +232,7 @@ QUnit.test("chatter: drop attachments", async (assert) => {
}),
];
await afterNextRender(() => dropFiles($(".o-mail-Dropzone")[0], files));
- assert.containsN($, ".o-mail-AttachmentCard", 3);
+ await contains(".o-mail-AttachmentCard", 3);
});
QUnit.test("should display subject when subject isn't infered from the record", async () => {
@@ -307,7 +307,7 @@ QUnit.test("base rendering when chatter has no attachment", async (assert) => {
await contains(".o-mail-Chatter-topbar");
await contains(".o-mail-AttachmentBox", 0);
await contains(".o-mail-Thread");
- assert.containsN($, ".o-mail-Message", 30);
+ await contains(".o-mail-Message", 30);
});
QUnit.test("base rendering when chatter has no record", async (assert) => {
@@ -620,7 +620,7 @@ QUnit.test(
}
);
-QUnit.test("basic chatter rendering without followers", async (assert) => {
+QUnit.test("basic chatter rendering without followers", async () => {
const pyEnv = await startServer();
const partnerId = pyEnv["res.partner"].create({ display_name: "second partner" });
const views = {
@@ -632,6 +632,7 @@ QUnit.test("basic chatter rendering without followers", async (assert) => {
+
`,
};
@@ -645,15 +646,11 @@ QUnit.test("basic chatter rendering without followers", async (assert) => {
await contains(".o-mail-Chatter-topbar");
await contains("button[aria-label='Attach files']");
await contains("button:contains(Activities)");
- assert.containsNone(
- $,
- ".o-mail-Followers",
- "there should be no followers menu because the 'message_follower_ids' field is not present in 'oe_chatter'"
- );
await contains(".o-mail-Chatter .o-mail-Thread");
+ await contains(".o-mail-Followers", 0);
});
-QUnit.test("basic chatter rendering without messages", async (assert) => {
+QUnit.test("basic chatter rendering without messages", async () => {
const pyEnv = await startServer();
const partnerId = pyEnv["res.partner"].create({ display_name: "second partner" });
const views = {
@@ -665,6 +662,7 @@ QUnit.test("basic chatter rendering without messages", async (assert) => {
+
`,
};
@@ -679,14 +677,10 @@ QUnit.test("basic chatter rendering without messages", async (assert) => {
await contains("button[aria-label='Attach files']");
await contains("button:contains(Activities)");
await contains(".o-mail-Followers");
- assert.containsNone(
- $,
- ".o-mail-Chatter .o-mail-Thread",
- "there should be no thread because the 'message_ids' field is not present in 'oe_chatter'"
- );
+ await contains(".o-mail-Chatter .o-mail-Thread", 0);
});
-QUnit.test("chatter updating", async (assert) => {
+QUnit.test("chatter updating", async () => {
const pyEnv = await startServer();
const [partnerId_1, partnerId_2] = pyEnv["res.partner"].create([
{ display_name: "first partner" },
@@ -795,5 +789,5 @@ QUnit.test("upload attachment on draft record", async () => {
QUnit.test("Follower count of draft record is set to 0", async (assert) => {
const { openView } = await start();
await openView({ res_model: "res.partner", views: [[false, "form"]] });
- assert.containsOnce($, ".o-mail-Followers:contains(0)");
+ await contains(".o-mail-Followers:contains(0)");
});
diff --git a/addons/mail/static/tests/web/fields/avatar_tests.js b/addons/mail/static/tests/web/fields/avatar_tests.js
index 6828bfce810..3d87fe2042e 100644
--- a/addons/mail/static/tests/web/fields/avatar_tests.js
+++ b/addons/mail/static/tests/web/fields/avatar_tests.js
@@ -7,7 +7,7 @@ import { getFixture, mount } from "@web/../tests/helpers/utils";
QUnit.module("avatar field");
-QUnit.test("basic rendering", async (assert) => {
+QUnit.test("basic rendering", async () => {
const { env } = await start();
await mount(Avatar, getFixture(), {
env,
@@ -19,11 +19,10 @@ QUnit.test("basic rendering", async (assert) => {
});
await contains(".o-mail-Avatar");
await contains(".o-mail-Avatar img");
- assert.strictEqual($(".o-mail-Avatar img")[0].dataset.src, "/web/image/res.users/2/avatar_128");
+ await contains(".o-mail-Avatar img[data-src='/web/image/res.users/2/avatar_128']");
await contains(".o-mail-Avatar span");
- assert.strictEqual($(".o-mail-Avatar span")[0].innerText, "User display name");
- assert.containsNone($, ".o-mail-ChatWindow");
-
+ await contains(".o-mail-Avatar span:contains(User display name)");
+ await contains(".o-mail-ChatWindow", 0);
await click(".o-mail-Avatar img");
await contains(".o-mail-ChatWindow");
});
diff --git a/addons/mail/static/tests/web/fields/emojis_fields_tests.js b/addons/mail/static/tests/web/fields/emojis_fields_tests.js
index d43458af363..e59044a2e0a 100644
--- a/addons/mail/static/tests/web/fields/emojis_fields_tests.js
+++ b/addons/mail/static/tests/web/fields/emojis_fields_tests.js
@@ -2,7 +2,7 @@
import { addFakeModel } from "@bus/../tests/helpers/model_definitions_helpers";
-import { start, startServer } from "@mail/../tests/helpers/test_utils";
+import { contains, start, startServer } from "@mail/../tests/helpers/test_utils";
import { click } from "@web/../tests/helpers/utils";
@@ -12,11 +12,11 @@ import { click } from "@web/../tests/helpers/utils";
* @param {object} assert the assert object passed by QUnit
* @param {string} emojiComponentSelector unique selector to get the component template root (e.g. "o_field_text_emojis")
*/
-export async function testEmojiButtonVisible(assert, selector) {
- assert.containsOnce($, ".o_form_editable");
- assert.containsOnce($, selector);
- assert.containsOnce($, `${selector} button`);
- assert.containsOnce($, `${selector} button .fa-smile-o`);
+export async function testEmojiButtonVisible(selector) {
+ await contains(".o_form_editable");
+ await contains(selector);
+ await contains(`${selector} button`);
+ await contains(`${selector} button .fa-smile-o`);
}
/**
@@ -29,7 +29,7 @@ export async function testEmojiButtonVisible(assert, selector) {
export async function testEmojiButton(assert, input, button) {
// emoji picker opens
await click(button);
- assert.containsOnce($, ".o-EmojiPicker");
+ await contains(".o-EmojiPicker");
// clicking an emoji adds it to the input field
const emoji_1 = $(".o-EmojiPicker-content .o-Emoji")[0];
const emojiChar_1 = emoji_1.textContent;
@@ -79,9 +79,9 @@ async function openTestView(model) {
QUnit.module("Field char emojis");
-QUnit.test("emojis button is shown", async (assert) => {
+QUnit.test("emojis button is shown", async () => {
await openTestView("fields.char.emojis.user");
- await testEmojiButtonVisible(assert, ".o_field_char_emojis");
+ await testEmojiButtonVisible(".o_field_char_emojis");
});
QUnit.test("emojis button works", async (assert) => {
@@ -93,9 +93,9 @@ QUnit.test("emojis button works", async (assert) => {
QUnit.module("Field text emojis");
-QUnit.test("emojis button is shown", async (assert) => {
+QUnit.test("emojis button is shown", async () => {
await openTestView("fields.text.emojis.user");
- await testEmojiButtonVisible(assert, ".o_field_text_emojis");
+ await testEmojiButtonVisible(".o_field_text_emojis");
});
QUnit.test("emojis button works", async (assert) => {
diff --git a/addons/mail/static/tests/web/fields/m2x_avatar_user_tests.js b/addons/mail/static/tests/web/fields/m2x_avatar_user_tests.js
index 8e939a1a7c4..12185004d46 100644
--- a/addons/mail/static/tests/web/fields/m2x_avatar_user_tests.js
+++ b/addons/mail/static/tests/web/fields/m2x_avatar_user_tests.js
@@ -82,7 +82,7 @@ QUnit.test("many2many_avatar_user in kanban view", async (assert) => {
res_model: "m2x.avatar.user",
views: [[false, "kanban"]],
});
- assert.containsOnce($, ".o_kanban_record .o_field_many2many_avatar_user .o_m2m_avatar_empty");
+ await contains(".o_kanban_record .o_field_many2many_avatar_user .o_m2m_avatar_empty");
assert.strictEqual(
$(
".o_kanban_record .o_field_many2many_avatar_user .o_m2m_avatar_empty"
@@ -393,7 +393,7 @@ QUnit.test("avatar card preview", async (assert) => {
// Open card
await triggerEvent(document, ".o_m2o_avatar > img", "mouseover");
assert.verifySteps(["setTimeout of 350ms", "setTimeout of 250ms", "user read"]);
- assert.containsOnce(document.body, ".o_avatar_card");
+ await contains(".o_avatar_card");
assert.deepEqual(getNodesTextContent(document.querySelectorAll(".o_card_user_infos > *")), [
"Mario",
" Mario@odoo.test",
@@ -402,7 +402,7 @@ QUnit.test("avatar card preview", async (assert) => {
// Close card
await triggerEvent(document, ".o_control_panel", "mouseover");
assert.verifySteps(["setTimeout of 400ms"]);
- assert.containsNone(document.body, ".o_avatar_card");
+ await contains(".o_avatar_card", 0);
});
QUnit.test(
@@ -447,7 +447,7 @@ QUnit.test("many2one_avatar_user widget in list view", async (assert) => {
views: [[false, "list"]],
});
await click(document.body, ".o_data_cell .o_m2o_avatar > img");
- assert.containsOnce($, ".o-mail-ChatWindow");
+ await contains(".o-mail-ChatWindow");
assert.strictEqual($(".o-mail-ChatWindow-name").text(), "Partner 1");
});
@@ -469,6 +469,6 @@ QUnit.test("many2many_avatar_user widget in form view", async (assert) => {
views: [[false, "form"]],
});
await click(document.body, ".o_field_many2many_avatar_user .o_avatar img");
- assert.containsOnce($, ".o-mail-ChatWindow");
+ await contains(".o-mail-ChatWindow");
assert.strictEqual($(".o-mail-ChatWindow-name").text(), "Partner 1");
});
diff --git a/addons/mail/static/tests/web/fields/many2many_tags_email_tests.js b/addons/mail/static/tests/web/fields/many2many_tags_email_tests.js
index f91c5befeff..c074602fa18 100644
--- a/addons/mail/static/tests/web/fields/many2many_tags_email_tests.js
+++ b/addons/mail/static/tests/web/fields/many2many_tags_email_tests.js
@@ -48,20 +48,13 @@ QUnit.test("fieldmany2many tags email (edition)", async (assert) => {
);
assert.verifySteps([]);
- assert.containsOnce(
- $,
- '.o_field_many2many_tags_email[name="partner_ids"] .badge.o_tag_color_0'
- );
+ await contains('.o_field_many2many_tags_email[name="partner_ids"] .badge.o_tag_color_0');
// add an other existing tag
await selectDropdownItem(document.body, "partner_ids", "silver");
- assert.containsOnce(
- $,
- ".modal-content .o_form_view",
- "there should be one modal opened to edit the empty email"
- );
+ await contains(".modal-content .o_form_view");
await contains(".modal-content .o_form_view .o_input#name_0", 1, { value: "silver" });
- assert.containsOnce($, ".modal-content .o_form_view .o_input#email_0");
+ await contains(".modal-content .o_form_view .o_input#email_0");
// set the email and save the modal (will rerender the form view)
await insertText(".modal-content .o_form_view .o_input#email_0", "coucou@petite.perruche");
@@ -79,7 +72,7 @@ QUnit.test("fieldmany2many tags email (edition)", async (assert) => {
assert.verifySteps([`[${partnerId_2}]`, `[${partnerId_2}]`, `[${partnerId_1},${partnerId_2}]`]);
});
-QUnit.test("many2many_tags_email widget can load more than 40 records", async (assert) => {
+QUnit.test("many2many_tags_email widget can load more than 40 records", async () => {
const pyEnv = await startServer();
const partnerIds = [];
for (let i = 100; i < 200; i++) {
@@ -97,10 +90,10 @@ QUnit.test("many2many_tags_email widget can load more than 40 records", async (a
views: [[false, "form"]],
});
- assert.containsN($, '.o_field_widget[name="partner_ids"] .badge', 100);
- assert.containsOnce($, ".o_form_editable");
+ await contains('.o_field_widget[name="partner_ids"] .badge', 100);
+ await contains(".o_form_editable");
// add a record to the relation
await selectDropdownItem(document.body, "partner_ids", "Public user");
- assert.containsN($, '.o_field_widget[name="partner_ids"] .badge', 101);
+ await contains('.o_field_widget[name="partner_ids"] .badge', 101);
});
diff --git a/addons/mail/static/tests/web/follower_list_menu_tests.js b/addons/mail/static/tests/web/follower_list_menu_tests.js
index ea1fbe548f2..f06809af77f 100644
--- a/addons/mail/static/tests/web/follower_list_menu_tests.js
+++ b/addons/mail/static/tests/web/follower_list_menu_tests.js
@@ -279,7 +279,7 @@ QUnit.test("Load 100 recipients at once", async (assert) => {
QUnit.test(
'Show "Add follower" and subtypes edition/removal buttons on all followers if user has write access',
- async (assert) => {
+ async () => {
const pyEnv = await startServer();
const [partnerId_1, partnerId_2] = pyEnv["res.partner"].create([
{ name: "Partner1" },
@@ -317,11 +317,10 @@ QUnit.test(
await click(".o-mail-Followers-button");
await contains("a:contains(Add Followers)");
- const $followers = $(".o-mail-Follower");
- assert.containsOnce($followers[0], "button[title='Edit subscription']");
- assert.containsOnce($followers[0], "button[title='Remove this follower']");
- assert.containsOnce($followers[1], "button[title='Edit subscription']");
- assert.containsOnce($followers[1], "button[title='Remove this follower']");
+ await contains(".o-mail-Follower:eq(0) button[title='Edit subscription']");
+ await contains(".o-mail-Follower:eq(0) button[title='Remove this follower']");
+ await contains(".o-mail-Follower:eq(1) button[title='Edit subscription']");
+ await contains(".o-mail-Follower:eq(1) button[title='Remove this follower']");
}
);