import { defineMailModels } from "@mail/../tests/mail_test_helpers";
import { expect, test } from "@odoo/hoot";
import {
contains,
defineModels,
fields,
models,
mountView,
onRpc,
} from "@web/../tests/web_test_helpers";
import { serializeDateTime } from "@web/core/l10n/dates";
const now = luxon.DateTime.now();
class Users extends models.Model {
name = fields.Char();
_records = [
{ id: 1, name: "Mario" },
{ id: 2, name: "Luigi" },
{ id: 3, name: "Link" },
{ id: 4, name: "Zelda" },
];
}
class Team extends models.Model {
_name = "crm.team";
name = fields.Char();
member_ids = fields.Many2many({ string: "Members", relation: "users" });
_records = [
{ id: 1, name: "Mushroom Kingdom", member_ids: [1, 2] },
{ id: 2, name: "Hyrule", member_ids: [3, 4] },
];
}
class Stage extends models.Model {
_name = "crm.stage";
name = fields.Char();
is_won = fields.Boolean({ string: "Is won" });
_records = [
{ id: 1, name: "Start" },
{ id: 2, name: "Middle" },
{ id: 3, name: "Won", is_won: true },
];
}
class Lead extends models.Model {
_name = "crm.lead";
name = fields.Char();
planned_revenue = fields.Float({ string: "Revenue" });
date_closed = fields.Datetime({ string: "Date closed" });
stage_id = fields.Many2one({ string: "Stage", relation: "crm.stage" });
user_id = fields.Many2one({ string: "Salesperson", relation: "users" });
team_id = fields.Many2one({ string: "Sales Team", relation: "crm.team" });
_records = [
{
id: 1,
name: "Lead 1",
planned_revenue: 5.0,
stage_id: 1,
team_id: 1,
user_id: 1,
},
{
id: 2,
name: "Lead 2",
planned_revenue: 5.0,
stage_id: 2,
team_id: 2,
user_id: 4,
},
{
id: 3,
name: "Lead 3",
planned_revenue: 3.0,
stage_id: 3,
team_id: 1,
user_id: 1,
date_closed: serializeDateTime(now.minus({ days: 5 })),
},
{
id: 4,
name: "Lead 4",
planned_revenue: 4.0,
stage_id: 3,
team_id: 2,
user_id: 4,
date_closed: serializeDateTime(now.minus({ days: 23 })),
},
{
id: 5,
name: "Lead 5",
planned_revenue: 7.0,
stage_id: 3,
team_id: 1,
user_id: 1,
date_closed: serializeDateTime(now.minus({ days: 20 })),
},
{
id: 6,
name: "Lead 6",
planned_revenue: 4.0,
stage_id: 2,
team_id: 1,
user_id: 2,
},
{
id: 7,
name: "Lead 7",
planned_revenue: 1.8,
stage_id: 3,
team_id: 2,
user_id: 3,
date_closed: serializeDateTime(now.minus({ days: 23 })),
},
{
id: 8,
name: "Lead 8",
planned_revenue: 1.9,
stage_id: 1,
team_id: 2,
user_id: 3,
},
{
id: 9,
name: "Lead 9",
planned_revenue: 1.5,
stage_id: 3,
team_id: 2,
user_id: 3,
date_closed: serializeDateTime(now.minus({ days: 5 })),
},
{
id: 10,
name: "Lead 10",
planned_revenue: 1.7,
stage_id: 2,
team_id: 2,
user_id: 3,
},
{
id: 11,
name: "Lead 11",
planned_revenue: 2.0,
stage_id: 3,
team_id: 2,
user_id: 4,
date_closed: serializeDateTime(now.minus({ days: 5 })),
},
];
}
defineModels([Lead, Users, Stage, Team]);
defineMailModels();
const testFormView = {
arch: `
`,
type: "form",
resModel: "crm.lead",
};
const testKanbanView = {
arch: `
`,
resModel: "crm.lead",
type: "kanban",
groupBy: ["stage_id"],
};
onRpc("crm.lead", "get_rainbowman_message", ({ parent }) => {
const result = parent();
expect.step(result || "no rainbowman");
return result;
});
test.tags("desktop");
test("first lead won, click on statusbar on desktop", async () => {
await mountView({
...testFormView,
resId: 6,
});
await contains(".o_statusbar_status button[data-value='3']").click();
expect(".o_reward svg.o_reward_rainbow_man").toHaveCount(1);
expect.verifySteps(["Go, go, go! Congrats for your first deal."]);
});
test.tags("mobile");
test("first lead won, click on statusbar on mobile", async () => {
await mountView({
...testFormView,
resId: 6,
});
await contains(".o_statusbar_status button.dropdown-toggle").click();
await contains(".o-dropdown--menu .dropdown-item:contains('Won')").click();
expect(".o_reward svg.o_reward_rainbow_man").toHaveCount(1);
expect.verifySteps(["Go, go, go! Congrats for your first deal."]);
});
test.tags("desktop");
test("first lead won, click on statusbar in edit mode on desktop", async () => {
await mountView({
...testFormView,
resId: 6,
});
await contains(".o_statusbar_status button[data-value='3']").click();
expect(".o_reward svg.o_reward_rainbow_man").toHaveCount(1);
expect.verifySteps(["Go, go, go! Congrats for your first deal."]);
});
test.tags("mobile");
test("first lead won, click on statusbar in edit mode on mobile", async () => {
await mountView({
...testFormView,
resId: 6,
});
await contains(".o_statusbar_status button.dropdown-toggle").click();
await contains(".o-dropdown--menu .dropdown-item:contains('Won')").click();
expect(".o_reward svg.o_reward_rainbow_man").toHaveCount(1);
expect.verifySteps(["Go, go, go! Congrats for your first deal."]);
});
test.tags("desktop");
test("team record 30 days, click on statusbar on desktop", async () => {
await mountView({
...testFormView,
resId: 2,
});
await contains(".o_statusbar_status button[data-value='3']").click();
expect(".o_reward svg.o_reward_rainbow_man").toHaveCount(1);
expect.verifySteps(["Boom! Team record for the past 30 days."]);
});
test.tags("mobile");
test("team record 30 days, click on statusbar on mobile", async () => {
await mountView({
...testFormView,
resId: 2,
});
await contains(".o_statusbar_status button.dropdown-toggle").click();
await contains(".o-dropdown--menu .dropdown-item:contains('Won')").click();
expect(".o_reward svg.o_reward_rainbow_man").toHaveCount(1);
expect.verifySteps(["Boom! Team record for the past 30 days."]);
});
test.tags("desktop");
test("team record 7 days, click on statusbar on desktop", async () => {
await mountView({
...testFormView,
resId: 1,
});
await contains(".o_statusbar_status button[data-value='3']").click();
expect(".o_reward svg.o_reward_rainbow_man").toHaveCount(1);
expect.verifySteps(["Yeah! Best deal out of the last 7 days for the team."]);
});
test.tags("mobile");
test("team record 7 days, click on statusbar on mobile", async () => {
await mountView({
...testFormView,
resId: 1,
});
await contains(".o_statusbar_status button.dropdown-toggle").click();
await contains(".o-dropdown--menu .dropdown-item:contains('Won')").click();
expect(".o_reward svg.o_reward_rainbow_man").toHaveCount(1);
expect.verifySteps(["Yeah! Best deal out of the last 7 days for the team."]);
});
test.tags("desktop");
test("user record 30 days, click on statusbar on desktop", async () => {
await mountView({
...testFormView,
resId: 8,
});
await contains(".o_statusbar_status button[data-value='3']").click();
expect(".o_reward svg.o_reward_rainbow_man").toHaveCount(1);
expect.verifySteps(["You just beat your personal record for the past 30 days."]);
});
test.tags("mobile");
test("user record 30 days, click on statusbar on mobile", async () => {
await mountView({
...testFormView,
resId: 8,
});
await contains(".o_statusbar_status button.dropdown-toggle").click();
await contains(".o-dropdown--menu .dropdown-item:contains('Won')").click();
expect(".o_reward svg.o_reward_rainbow_man").toHaveCount(1);
expect.verifySteps(["You just beat your personal record for the past 30 days."]);
});
test.tags("desktop");
test("user record 7 days, click on statusbar on desktop", async () => {
await mountView({
...testFormView,
resId: 10,
});
await contains(".o_statusbar_status button[data-value='3']").click();
expect(".o_reward svg.o_reward_rainbow_man").toHaveCount(1);
expect.verifySteps(["You just beat your personal record for the past 7 days."]);
});
test.tags("mobile");
test("user record 7 days, click on statusbar on mobile", async () => {
await mountView({
...testFormView,
resId: 10,
});
await contains(".o_statusbar_status button.dropdown-toggle").click();
await contains(".o-dropdown--menu .dropdown-item:contains('Won')").click();
expect(".o_reward svg.o_reward_rainbow_man").toHaveCount(1);
expect.verifySteps(["You just beat your personal record for the past 7 days."]);
});
test.tags("desktop");
test("click on stage (not won) on statusbar on desktop", async () => {
await mountView({
...testFormView,
resId: 1,
});
await contains(".o_statusbar_status button[data-value='2']").click();
expect(".o_reward svg.o_reward_rainbow_man").toHaveCount(0);
expect.verifySteps(["no rainbowman"]);
});
test.tags("mobile");
test("click on stage (not won) on statusbar on mobile", async () => {
await mountView({
...testFormView,
resId: 1,
});
await contains(".o_statusbar_status button.dropdown-toggle").click();
await contains(".o-dropdown--menu .dropdown-item:contains('Middle')").click();
expect(".o_reward svg.o_reward_rainbow_man").toHaveCount(0);
expect.verifySteps(["no rainbowman"]);
});
test.tags("desktop");
test("first lead won, drag & drop kanban", async () => {
await mountView({
...testKanbanView,
});
await contains(".o_kanban_record:contains(Lead 6):eq(0)").dragAndDrop(".o_kanban_group:eq(2)");
expect(".o_reward svg.o_reward_rainbow_man").toHaveCount(1);
expect.verifySteps(["Go, go, go! Congrats for your first deal."]);
});
test.tags("desktop");
test("team record 30 days, drag & drop kanban", async () => {
await mountView({
...testKanbanView,
});
await contains(".o_kanban_record:contains(Lead 2):eq(0)").dragAndDrop(".o_kanban_group:eq(2)");
expect(".o_reward svg.o_reward_rainbow_man").toHaveCount(1);
expect.verifySteps(["Boom! Team record for the past 30 days."]);
});
test.tags("desktop");
test("team record 7 days, drag & drop kanban", async () => {
await mountView({
...testKanbanView,
});
await contains(".o_kanban_record:contains(Lead 1):eq(0)").dragAndDrop(".o_kanban_group:eq(2)");
expect(".o_reward svg.o_reward_rainbow_man").toHaveCount(1);
expect.verifySteps(["Yeah! Best deal out of the last 7 days for the team."]);
});
test.tags("desktop");
test("user record 30 days, drag & drop kanban", async () => {
await mountView({
...testKanbanView,
});
await contains(".o_kanban_record:contains(Lead 8):eq(0)").dragAndDrop(".o_kanban_group:eq(2)");
expect(".o_reward svg.o_reward_rainbow_man").toHaveCount(1);
expect.verifySteps(["You just beat your personal record for the past 30 days."]);
});
test.tags("desktop");
test("user record 7 days, drag & drop kanban", async () => {
await mountView({
...testKanbanView,
});
await contains(".o_kanban_record:contains(Lead 10):eq(0)").dragAndDrop(".o_kanban_group:eq(2)");
expect(".o_reward svg.o_reward_rainbow_man").toHaveCount(1);
expect.verifySteps(["You just beat your personal record for the past 7 days."]);
});
test.tags("desktop");
test("drag & drop record kanban in stage not won", async () => {
await mountView({
...testKanbanView,
});
await contains(".o_kanban_record:contains(Lead 8):eq(0)").dragAndDrop(".o_kanban_group:eq(1)");
expect(".o_reward svg.o_reward_rainbow_man").toHaveCount(0);
expect.verifySteps(["no rainbowman"]);
});
test.tags("desktop");
test("drag & drop record in kanban not grouped by stage_id", async () => {
await mountView({
...testKanbanView,
groupBy: ["user_id"],
});
await contains(".o_kanban_group:eq(0)").dragAndDrop(".o_kanban_group:eq(1)");
expect(".o_reward svg.o_reward_rainbow_man").toHaveCount(0);
expect.verifySteps([]); // Should never pass by the rpc
});