import { describe, expect, test } from "@odoo/hoot";
import { animationFrame } from "@odoo/hoot-mock";
import { WebClient } from "@web/webclient/webclient";
import { clickOnDataset, setupChartJsForTests } from "@web/../tests/views/graph/graph_test_helpers";
import {
contains,
fields,
getService,
mockService,
models,
mountWithCleanup,
} from "@web/../tests/web_test_helpers";
import { defineProjectModels, projectModels } from "./project_models";
describe.current.tags("desktop");
class ReportProjectTaskUser extends models.Model {
_name = "report.project.task.user";
project_id = fields.Many2one({ relation: "project.project" });
display_in_project = fields.Boolean();
task_id = fields.Many2one({ relation: "project.task" });
nbr = fields.Integer({ string: "# of Tasks" });
_records = [
{ id: 4, project_id: 1, display_in_project: true },
{ id: 6, project_id: 1, display_in_project: true },
{ id: 9, project_id: 2, display_in_project: true },
];
_views = {
graph: /* xml */ `
`,
pivot: /* xml */ `
`,
};
}
projectModels.ReportProjectTaskUser = ReportProjectTaskUser;
projectModels.ProjectTask._views = {
form: /* xml */ `
`,
list: /* xml */ `
`,
search: /* xml */ ``,
};
defineProjectModels();
setupChartJsForTests();
async function mountView(viewName, ctx = {}) {
const view = await mountWithCleanup(WebClient);
await getService("action").doAction({
id: 1,
name: "tasks analysis",
res_model: "report.project.task.user",
type: "ir.actions.act_window",
views: [[false, viewName]],
context: ctx,
});
return view;
}
test("report.project.task.user (graph): clicking on a bar leads to project.task list", async () => {
mockService("action", {
doAction({ res_model }) {
expect.step(res_model);
return super.doAction(...arguments);
},
});
const view = await mountView("graph");
await animationFrame();
await clickOnDataset(view);
await animationFrame();
expect(".o_list_renderer").toBeDisplayed({
message: "Clicking on a bar should open a list view",
});
// The model of the list view that is opened consequently should be "project.task"
expect.verifySteps(["report.project.task.user", "project.task"]);
});
test("report.project.task.user (pivot): clicking on a cell leads to project.task list", async () => {
mockService("action", {
doAction({ res_model }) {
expect.step(res_model);
return super.doAction(...arguments);
},
});
await mountView("pivot");
await animationFrame();
await contains(".o_pivot_cell_value").click();
await animationFrame();
expect(".o_list_renderer").toBeDisplayed({
message: "Clicking on a cell should open a list view",
});
// The model of the list view that is opened consequently should be "project.task"
expect.verifySteps(["report.project.task.user", "project.task"]);
});
test("report.project.task.user: fix the domain, in case field is not present in main model", async () => {
mockService("action", {
doAction({ domain, res_model }) {
if (res_model === "project.task") {
expect(domain).toEqual(["&", ["display_in_project", "=", true], "&", [1, "=", 1], ["id", "=", 1]]);
}
return super.doAction(...arguments);
},
});
ReportProjectTaskUser._records = [
{ id: 1, nbr: 1, task_id: 1, display_in_project: true },
{ id: 2, nbr: 1, task_id: 2, display_in_project: true },
];
ReportProjectTaskUser._views = {
graph: /* xml */ `
`
};
const view = await mountView("graph", { group_by: ["task_id", "nbr"] });
await animationFrame();
await clickOnDataset(view);
await animationFrame();
expect(`.o_list_renderer .o_data_row`).toHaveCount(1);
});