import { assertSteps, click, contains, defineMailModels, editInput, onRpcBefore, openFormView, start, startServer, step, } from "@mail/../tests/mail_test_helpers"; import { describe, expect, test } from "@odoo/hoot"; import { Deferred } from "@odoo/hoot-mock"; import { mockService, onRpc } from "@web/../tests/web_test_helpers"; describe.current.tags("desktop"); defineMailModels(); test("base rendering not editable", async () => { const pyEnv = await startServer(); const [threadId, partnerId] = pyEnv["res.partner"].create([ { hasWriteAccess: false }, { hasWriteAccess: false }, ]); pyEnv["mail.followers"].create({ is_active: true, partner_id: partnerId, res_id: threadId, res_model: "res.partner", }); await start(); await openFormView("res.partner", threadId); await click(".o-mail-Followers-button"); await contains(".o-mail-Follower"); await contains(".o-mail-Follower-details"); await contains(".o-mail-Follower-avatar"); await contains(".o-mail-Follower-action", { count: 0 }); }); test("base rendering editable", async () => { const pyEnv = await startServer(); const [threadId, partnerId] = pyEnv["res.partner"].create([{}, {}]); pyEnv["mail.followers"].create({ is_active: true, partner_id: partnerId, res_id: threadId, res_model: "res.partner", }); await start(); await openFormView("res.partner", threadId); await click(".o-mail-Followers-button"); await contains(".o-mail-Follower"); await contains(".o-mail-Follower-details"); await contains(".o-mail-Follower-avatar"); await contains(".o-mail-Follower"); await contains("button[title='Edit subscription']"); await contains("button[title='Remove this follower']"); }); test("click on partner follower details", async () => { const pyEnv = await startServer(); const [threadId, partnerId] = pyEnv["res.partner"].create([{}, {}]); pyEnv["mail.followers"].create({ is_active: true, partner_id: partnerId, res_id: threadId, res_model: "res.partner", }); const openFormDef = new Deferred(); mockService("action", { doAction(action) { if (action?.res_id !== partnerId) { return super.doAction(...arguments); } step("do_action"); expect(action.res_id).toBe(partnerId); expect(action.res_model).toBe("res.partner"); expect(action.type).toBe("ir.actions.act_window"); openFormDef.resolve(); }, }); await start(); await openFormView("res.partner", threadId); await click(".o-mail-Followers-button"); await contains(".o-mail-Follower"); await contains(".o-mail-Follower-details"); await click(".o-mail-Follower-details:first"); await openFormDef; await assertSteps(["do_action"]); // redirect to partner profile }); test("click on edit follower", async () => { const pyEnv = await startServer(); const [threadId, partnerId] = pyEnv["res.partner"].create([{}, {}]); pyEnv["mail.followers"].create({ is_active: true, partner_id: partnerId, res_id: threadId, res_model: "res.partner", }); onRpcBefore("/mail/read_subscription_data", () => step("fetch_subtypes")); await start(); await openFormView("res.partner", threadId); await click(".o-mail-Followers-button"); await contains(".o-mail-Follower"); await contains("button[title='Edit subscription']"); await click("button[title='Edit subscription']"); await contains(".o-mail-Follower", { count: 0 }); await assertSteps(["fetch_subtypes"]); await contains(".o-mail-FollowerSubtypeDialog"); }); test("edit follower and close subtype dialog", async () => { const pyEnv = await startServer(); const [threadId, partnerId] = pyEnv["res.partner"].create([{}, {}]); pyEnv["mail.followers"].create({ is_active: true, partner_id: partnerId, res_id: threadId, res_model: "res.partner", }); onRpcBefore("/mail/read_subscription_data", () => step("fetch_subtypes")); await start(); await openFormView("res.partner", threadId); await click(".o-mail-Followers-button"); await contains(".o-mail-Follower"); await contains("button[title='Edit subscription']"); await click("button[title='Edit subscription']"); await contains(".o-mail-FollowerSubtypeDialog"); await assertSteps(["fetch_subtypes"]); await click(".o-mail-FollowerSubtypeDialog button", { text: "Cancel" }); await contains(".o-mail-FollowerSubtypeDialog", { count: 0 }); }); test("remove a follower in a dirty form view", async () => { const pyEnv = await startServer(); const [threadId, partnerId] = pyEnv["res.partner"].create([{}, {}]); pyEnv["discuss.channel"].create({ name: "General", display_name: "General" }); pyEnv["mail.followers"].create({ is_active: true, partner_id: partnerId, res_id: threadId, res_model: "res.partner", }); await start(); await openFormView("res.partner", threadId, { arch: `
`, }); await click(".o_field_many2many_tags[name='channel_ids'] input"); await click(".dropdown-item", { text: "General" }); await contains(".o_tag", { text: "General" }); await contains(".o-mail-Followers-counter", { text: "1" }); await editInput(document.body, ".o_field_char[name=name] input", "some value"); await click(".o-mail-Followers-button"); await click("button[title='Remove this follower']"); await contains(".o-mail-Followers-counter", { text: "0" }); await contains(".o_field_char[name=name] input", { value: "some value" }); await contains(".o_tag", { text: "General" }); }); test("removing a follower should reload form view", async function () { const pyEnv = await startServer(); const [threadId, partnerId] = pyEnv["res.partner"].create([{}, {}]); pyEnv["mail.followers"].create({ is_active: true, partner_id: partnerId, res_id: threadId, res_model: "res.partner", }); onRpc("res.partner", "web_read", ({ args }) => step(`read ${args[0][0]}`)); await start(); await openFormView("res.partner", threadId); await contains(".o-mail-Followers-button"); await assertSteps([`read ${threadId}`]); await click(".o-mail-Followers-button"); await click("button[title='Remove this follower']"); await contains(".o-mail-Followers-counter", { text: "0" }); await assertSteps([`read ${threadId}`]); });