import { beforeEach, describe, expect, test } from "@odoo/hoot";
import { click, leave, queryAll, queryOne, queryFirst } from "@odoo/hoot-dom";
import { animationFrame, mockDate } from "@odoo/hoot-mock";
import { contains, defineParams, onRpc } from "@web/../tests/web_test_helpers";
import { Tasks, defineGanttModels } from "./gantt_mock_models";
import {
SELECTORS,
clickCell,
getActiveScale,
getCell,
getCellColorProperties,
getGridContent,
getPill,
getPillWrapper,
hoverGridCell,
mountGanttView,
resizePill,
} from "./web_gantt_test_helpers";
describe.current.tags("desktop");
defineGanttModels();
beforeEach(() => {
mockDate("2018-12-20T07:00:00", +1);
defineParams({
lang_parameters: {
time_format: "%I:%M:%S",
},
});
});
test("create attribute", async () => {
Tasks._views.list = `
`;
Tasks._views.search = ``;
onRpc("has_group", () => true);
await mountGanttView({
resModel: "tasks",
arch: ``,
});
expect(".o_dialog").toHaveCount(0);
await hoverGridCell("06 December 2018");
await clickCell("06 December 2018");
expect(".o_dialog").toHaveCount(1);
expect(".modal-title").toHaveText("Plan");
expect(".o_create_button").toHaveCount(0);
});
test("plan attribute", async () => {
Tasks._views.form = `
`;
await mountGanttView({
resModel: "tasks",
arch: ``,
});
expect(".o_dialog").toHaveCount(0);
await hoverGridCell("06 December 2018");
await clickCell("06 December 2018");
expect(".o_dialog").toHaveCount(1);
expect(".modal-title").toHaveText("Create");
});
test("edit attribute", async () => {
Tasks._views.form = ``;
await mountGanttView({
resModel: "tasks",
arch: ``,
});
expect(SELECTORS.resizable).toHaveCount(0);
expect(SELECTORS.draggable).toHaveCount(0);
expect(getGridContent().rows).toEqual([
{
pills: [
{
title: "Task 5",
level: 0,
colSpan: "Out of bounds (1) -> 04 (1/2) December 2018",
},
{ title: "Task 1", level: 1, colSpan: "Out of bounds (1) -> 31 December 2018" },
{
title: "Task 2",
level: 0,
colSpan: "17 (1/2) December 2018 -> 22 (1/2) December 2018",
},
{
title: "Task 4",
level: 2,
colSpan: "20 December 2018 -> 20 (1/2) December 2018",
},
{
title: "Task 7",
level: 2,
colSpan: "20 (1/2) December 2018 -> 20 December 2018",
},
{ title: "Task 3", level: 0, colSpan: "27 December 2018 -> 03 (1/2) January 2019" },
],
},
]);
await contains(getPill("Task 1")).click();
expect(`.o_popover button.btn-primary`).toHaveText(/view/i);
await contains(`.o_popover button.btn-primary`).click();
expect(".modal .o_form_readonly").toHaveCount(1);
});
test("total_row attribute", async () => {
await mountGanttView({
resModel: "tasks",
arch: ``,
});
const { rows } = getGridContent();
expect(rows).toEqual([
{
pills: [
{
title: "Task 5",
level: 0,
colSpan: "Out of bounds (1) -> 04 (1/2) December 2018",
},
{ title: "Task 1", level: 1, colSpan: "Out of bounds (1) -> 31 December 2018" },
{
title: "Task 2",
level: 0,
colSpan: "17 (1/2) December 2018 -> 22 (1/2) December 2018",
},
{
title: "Task 4",
level: 2,
colSpan: "20 December 2018 -> 20 (1/2) December 2018",
},
{
title: "Task 7",
level: 2,
colSpan: "20 (1/2) December 2018 -> 20 December 2018",
},
{ title: "Task 3", level: 0, colSpan: "27 December 2018 -> 03 (1/2) January 2019" },
],
},
{
isTotalRow: true,
pills: [
{
colSpan: "Out of bounds (1) -> 04 (1/2) December 2018",
level: 0,
title: "2",
},
{
colSpan: "04 (1/2) December 2018 -> 17 (1/2) December 2018",
level: 0,
title: "1",
},
{
colSpan: "17 (1/2) December 2018 -> 19 December 2018",
level: 0,
title: "2",
},
{
colSpan: "20 December 2018 -> 20 (1/2) December 2018",
level: 0,
title: "3",
},
{
colSpan: "20 (1/2) December 2018 -> 20 December 2018",
level: 0,
title: "3",
},
{
colSpan: "21 December 2018 -> 22 (1/2) December 2018",
level: 0,
title: "2",
},
{
colSpan: "22 (1/2) December 2018 -> 26 December 2018",
level: 0,
title: "1",
},
{
colSpan: "27 December 2018 -> 31 December 2018",
level: 0,
title: "2",
},
{
colSpan: "01 January 2019 -> 03 (1/2) January 2019",
level: 0,
title: "1",
},
],
},
]);
});
test("default_scale attribute", async () => {
await mountGanttView({
resModel: "tasks",
arch: ``,
});
expect(getActiveScale()).toBe(5); // day scale
const { columnHeaders, range } = getGridContent();
expect(range).toBe("From: 12/20/2018 to: 12/22/2018");
expect(columnHeaders).toHaveLength(38);
});
test("default_scale attribute excluded from scales", async () => {
await mountGanttView({
resModel: "tasks",
arch: ``,
});
const { columnHeaders, range } = getGridContent();
expect(range).toBe("From: 12/20/2018 to: 12/22/2018");
expect(columnHeaders).toHaveLength(38);
});
test("default_scale omitted, scales provided", async () => {
await mountGanttView({
resModel: "tasks",
arch: ``,
});
const { columnHeaders, range } = getGridContent();
expect(range).toBe("From: 12/20/2018 to: 12/22/2018");
expect(columnHeaders).toHaveLength(38);
});
test("scales attribute", async () => {
await mountGanttView({
resModel: "tasks",
arch: ``,
});
expect(queryOne(".o_gantt_renderer_controls input").max).toBe("1", {
message: "there are only 2 valid scales (starting from 0)",
});
expect(getActiveScale()).toBe(1);
});
test("precision attribute", async () => {
onRpc("write", ({ args }) => expect.step(args));
await mountGanttView({
resModel: "tasks",
arch: `
`,
domain: [["id", "=", 7]],
});
// resize of a quarter
const drop = await resizePill(getPillWrapper("Task 7"), "end", 0.25, false);
await animationFrame();
expect(SELECTORS.resizeBadge).toHaveText("+15 minutes");
// manually trigger the drop to trigger a write
await drop();
await animationFrame();
expect(SELECTORS.resizeBadge).toHaveCount(0);
expect.verifySteps([[[7], { stop: "2018-12-20 18:44:59" }]]);
});
test("progress attribute", async () => {
await mountGanttView({
resModel: "tasks",
arch: ``,
groupBy: ["project_id"],
});
expect(`${SELECTORS.pill} .o_gantt_progress`).toHaveCount(3);
expect(
queryAll(SELECTORS.pill).map((el) => ({
text: el.innerText,
progress: el.querySelector(".o_gantt_progress")?.style?.width || null,
}))
).toEqual([
{ text: "Task 1", progress: null },
{ text: "Task 2", progress: "30%" },
{ text: "Task 4", progress: null },
{ text: "Task 3", progress: "60%" },
{ text: "Task 7", progress: "80%" },
]);
});
test("form_view_id attribute", async () => {
Tasks._views[["form", 42]] = ``;
onRpc("get_views", ({ kwargs }) => expect.step(["get_views", kwargs.views]));
await mountGanttView({
resModel: "tasks",
arch: ``,
groupBy: ["project_id"],
});
await contains(queryFirst(SELECTORS.addButton + ":visible")).click();
expect(".modal .o_form_view").toHaveCount(1);
expect.verifySteps([
[
"get_views",
[
[123456789, "gantt"],
[987654321, "search"],
],
], // initial get_views
["get_views", [[42, "form"]]], // get_views when form view dialog opens
]);
});
test("decoration attribute", async () => {
await mountGanttView({
resModel: "tasks",
arch: `
'
`,
});
expect(getPill("Task 1")).toHaveClass("decoration-info");
expect(getPill("Task 2")).not.toHaveClass("decoration-info");
});
test("decoration attribute with date", async () => {
mockDate("2018-12-19T12:00:00");
await mountGanttView({
resModel: "tasks",
arch: ``,
});
expect(getPill("Task 1")).toHaveClass("decoration-danger");
expect(getPill("Task 2")).toHaveClass("decoration-danger");
expect(getPill("Task 5")).toHaveClass("decoration-danger");
expect(getPill("Task 3")).not.toHaveClass("decoration-danger");
expect(getPill("Task 4")).not.toHaveClass("decoration-danger");
expect(getPill("Task 7")).not.toHaveClass("decoration-danger");
});
test("consolidation feature", async () => {
await mountGanttView({
resModel: "tasks",
arch: `
`,
groupBy: ["user_id", "project_id", "stage"],
});
const { rows } = getGridContent();
expect(rows).toHaveLength(18);
expect(rows.filter((r) => r.isGroup)).toHaveLength(12);
expect(".o_gantt_row_headers").toHaveCount(1);
// Check grouped rows
expect(rows[0].isGroup).toBe(true);
expect(rows[0].title).toBe("User 1");
expect(rows[9].isGroup).toBe(true);
expect(rows[9].title).toBe("User 2");
// Consolidation
// 0 over the size of Task 5 (Task 5 is 100 but is excluded!) then 0 over the rest of Task 1, cut by Task 4 which has progress 0
expect(rows[0].pills).toEqual([
{ colSpan: "Out of bounds (8) -> 19 December 2018", title: "0" },
{ colSpan: "20 December 2018 -> 20 (1/2) December 2018", title: "0" },
{ colSpan: "20 (1/2) December 2018 -> 31 December 2018", title: "0" },
]);
// 30 over Task 2 until Task 7 then 110 (Task 2 (30) + Task 7 (80)) then 30 again until end of task 2 then 60 over Task 3
expect(rows[9].pills).toEqual([
{ colSpan: "17 (1/2) December 2018 -> 20 (1/2) December 2018", title: "30" },
{ colSpan: "20 (1/2) December 2018 -> 20 December 2018", title: "110" },
{ colSpan: "21 December 2018 -> 22 (1/2) December 2018", title: "30" },
{ colSpan: "27 December 2018 -> 03 (1/2) January 2019", title: "60" },
]);
const withStatus = [];
for (const el of queryAll(".o_gantt_consolidated_pill")) {
if (el.classList.contains("bg-success") || el.classList.contains("bg-danger")) {
withStatus.push({
title: el.title,
danger: el.classList.contains("border-danger"),
});
}
}
expect(withStatus).toEqual([
{ title: "0", danger: false },
{ title: "0", danger: false },
{ title: "0", danger: false },
{ title: "30", danger: false },
{ title: "110", danger: true },
{ title: "30", danger: false },
{ title: "60", danger: false },
]);
});
test("consolidation feature (single level)", async () => {
Tasks._views.form = `
`;
await mountGanttView({
resModel: "tasks",
arch: ``,
groupBy: ["user_id"],
});
const { rows, range } = getGridContent();
expect(range).toBe("From: 12/01/2018 to: 02/28/2019");
expect(".o_gantt_button_expand_rows").toHaveCount(1);
expect(rows).toEqual([
{
isGroup: true,
pills: [
{
colSpan: "Out of bounds (8) -> 19 December 2018",
title: "0",
},
{
colSpan: "20 December 2018 -> 20 (1/2) December 2018",
title: "0",
},
{
colSpan: "20 (1/2) December 2018 -> 31 December 2018",
title: "0",
},
],
title: "User 1",
},
{
pills: [
{
colSpan: "Out of bounds (1) -> 31 December 2018",
level: 1,
title: "Task 1",
},
{
colSpan: "20 December 2018 -> 20 (1/2) December 2018",
level: 0,
title: "Task 4",
},
],
title: "",
},
{
isGroup: true,
pills: [
{
colSpan: "17 (1/2) December 2018 -> 20 (1/2) December 2018",
title: "30",
},
{
colSpan: "20 (1/2) December 2018 -> 20 December 2018",
title: "110",
},
{
colSpan: "21 December 2018 -> 22 (1/2) December 2018",
title: "30",
},
{
colSpan: "27 December 2018 -> 03 (1/2) January 2019",
title: "60",
},
],
title: "User 2",
},
{
pills: [
{
colSpan: "17 (1/2) December 2018 -> 22 (1/2) December 2018",
level: 0,
title: "Task 2",
},
{
colSpan: "20 (1/2) December 2018 -> 20 December 2018",
level: 1,
title: "Task 7",
},
{
colSpan: "27 December 2018 -> 03 (1/2) January 2019",
level: 0,
title: "Task 3",
},
],
title: "",
},
]);
});
test("color attribute", async () => {
await mountGanttView({
resModel: "tasks",
arch: ``,
});
expect(getPill("Task 1")).toHaveClass("o_gantt_color_0");
expect(getPill("Task 2")).toHaveClass("o_gantt_color_2");
});
test("color attribute in multi-level grouped", async () => {
await mountGanttView({
resModel: "tasks",
arch: ``,
groupBy: ["user_id", "project_id"],
domain: [["id", "=", 1]],
});
expect(`${SELECTORS.pill}.o_gantt_consolidated_pill`).not.toHaveClass("o_gantt_color_0");
expect(`${SELECTORS.pill}:not(.o_gantt_consolidated_pill)`).toHaveClass("o_gantt_color_0");
});
test("color attribute on a many2one", async () => {
await mountGanttView({
resModel: "tasks",
arch: ``,
});
expect(getPill("Task 1")).toHaveClass("o_gantt_color_1");
expect(`${SELECTORS.pill}.o_gantt_color_1`).toHaveCount(4);
expect(`${SELECTORS.pill}.o_gantt_color_2`).toHaveCount(2);
});
test(`Today style with unavailabilities ("week": "day:half")`, async () => {
const unavailabilities = [
{
start: "2018-12-18 10:00:00",
stop: "2018-12-20 14:00:00",
},
];
onRpc("get_gantt_data", async ({ parent }) => {
const result = await parent();
result.unavailabilities.__default = { false: unavailabilities };
return result;
});
await mountGanttView({
resModel: "tasks",
arch: ``,
});
// Normal day / unavailability
expect(getCellColorProperties("18 W51 2018")).toEqual([
"--Gantt__Day-background-color",
"--Gantt__DayOff-background-color",
]);
// Full unavailability
expect(getCellColorProperties("19 W51 2018")).toEqual(["--Gantt__DayOff-background-color"]);
// Unavailability / today
expect(getCell("20 W51 2018")).toHaveClass("o_gantt_today");
expect(getCellColorProperties("20 W51 2018")).toEqual([
"--Gantt__DayOff-background-color",
"--Gantt__DayOffToday-background-color",
]);
});
test("Today style of group rows", async () => {
const unavailabilities = [
{
start: "2018-12-18 10:00:00",
stop: "2018-12-20 14:00:00",
},
];
Tasks._records = [Tasks._records[3]]; // id: 4
onRpc("get_gantt_data", async ({ parent }) => {
expect.step("get_gantt_data");
const result = await parent();
result.unavailabilities.project_id = { 1: unavailabilities };
return result;
});
await mountGanttView({
resModel: "tasks",
arch: ``,
groupBy: ["user_id", "project_id"],
});
expect.verifySteps(["get_gantt_data"]);
// Normal group cell: open
let cell4 = getCell("19 W51 2018");
expect(cell4).not.toHaveClass("o_gantt_today");
expect(cell4).toHaveClass("o_group_open");
expect(cell4).toHaveStyle({
backgroundImage: "linear-gradient(rgb(249, 250, 251), rgb(234, 237, 241))",
});
// Today group cell: open
let cell5 = getCell("20 W51 2018");
expect(cell5).toHaveClass("o_gantt_today");
expect(cell5).toHaveClass("o_group_open");
expect(cell5).toHaveStyle({
backgroundImage: "linear-gradient(rgb(249, 250, 251), rgb(234, 237, 241))",
});
await contains(SELECTORS.group).click(); // fold group
await leave();
// Normal group cell: closed
cell4 = getCell("19 W51 2018");
expect(cell4).not.toHaveClass("o_gantt_today");
expect(cell4).not.toHaveClass("o_group_open");
expect(cell4).toHaveStyle({
backgroundImage: "linear-gradient(rgb(234, 237, 241), rgb(249, 250, 251))",
});
// Today group cell: closed
cell5 = getCell("20 W51 2018");
expect(cell5).toHaveClass("o_gantt_today");
expect(cell5).not.toHaveClass("o_group_open");
expect(cell5).toHaveStyle({ backgroundImage: "none" });
expect(cell5).toHaveStyle({ backgroundColor: "rgb(252, 250, 243)" });
});
test("style without unavailabilities", async () => {
mockDate("2018-12-05T02:00:00");
onRpc("get_gantt_data", ({ kwargs }) => {
expect.step("get_gantt_data");
expect(kwargs.unavailability_fields).toEqual([]);
});
await mountGanttView({
resModel: "tasks",
arch: ``,
});
expect.verifySteps(["get_gantt_data"]);
const cell5 = getCell("05 December 2018");
expect(cell5).toHaveClass("o_gantt_today");
expect(cell5).toHaveAttribute("style", "grid-column:c9/c11;grid-row:r1/r5;");
const cell6 = getCell("06 December 2018");
expect(cell6).toHaveAttribute("style", "grid-column:c11/c13;grid-row:r1/r5;");
});
test(`Unavailabilities ("month": "day:half")`, async () => {
mockDate("2018-12-05T02:00:00");
const unavailabilities = [
{
start: "2018-12-05 09:30:00",
stop: "2018-12-07 08:00:00",
},
{
start: "2018-12-16 09:00:00",
stop: "2018-12-18 13:00:00",
},
];
onRpc("get_gantt_data", ({ model, kwargs, parent }) => {
expect.step("get_gantt_data");
expect(model).toBe("tasks");
expect(kwargs.unavailability_fields).toEqual([]);
expect(kwargs.start_date).toBe("2018-11-30 23:00:00");
expect(kwargs.stop_date).toBe("2019-02-28 23:00:00");
const result = parent();
result.unavailabilities = { __default: { false: unavailabilities } };
return result;
});
await mountGanttView({
resModel: "tasks",
arch: ``,
});
expect.verifySteps(["get_gantt_data"]);
expect(getCell("05 December 2018")).toHaveClass("o_gantt_today");
expect(getCellColorProperties("05 December 2018")).toEqual([
"--Gantt__DayOffToday-background-color",
"--Gantt__DayOff-background-color",
]);
expect(getCellColorProperties("06 December 2018")).toEqual([
"--Gantt__DayOff-background-color",
]);
expect(getCellColorProperties("07 December 2018")).toEqual([]);
expect(getCellColorProperties("16 December 2018")).toEqual([
"--Gantt__Day-background-color",
"--Gantt__DayOff-background-color",
]);
expect(getCellColorProperties("17 December 2018")).toEqual([
"--Gantt__DayOff-background-color",
]);
expect(getCellColorProperties("18 December 2018")).toEqual([
"--Gantt__DayOff-background-color",
"--Gantt__Day-background-color",
]);
});
test(`Unavailabilities ("day": "hours:quarter")`, async () => {
Tasks._records = [];
const unavailabilities = [
// in utc
{
start: "2018-12-20 08:15:00",
stop: "2018-12-20 08:30:00",
},
{
start: "2018-12-20 10:35:00",
stop: "2018-12-20 12:29:00",
},
{
start: "2018-12-20 20:15:00",
stop: "2018-12-20 20:50:00",
},
];
onRpc("get_gantt_data", ({ kwargs, parent }) => {
expect(kwargs.unavailability_fields).toEqual([]);
const result = parent();
result.unavailabilities = { __default: { false: unavailabilities } };
return result;
});
await mountGanttView({
resModel: "tasks",
arch: ``,
});
expect(getCellColorProperties("9am 20 December 2018")).toEqual([
"--Gantt__Day-background-color",
"--Gantt__DayOff-background-color",
"--Gantt__DayOff-background-color",
"--Gantt__Day-background-color",
"--Gantt__Day-background-color",
"--Gantt__Day-background-color",
]);
expect(getCellColorProperties("11am 20 December 2018")).toEqual([
"--Gantt__Day-background-color",
"--Gantt__Day-background-color",
"--Gantt__Day-background-color",
"--Gantt__Day-background-color",
"--Gantt__Day-background-color",
"--Gantt__DayOff-background-color",
]);
expect(getCellColorProperties("12pm 20 December 2018")).toEqual([
"--Gantt__DayOff-background-color",
]);
expect(getCellColorProperties("1pm 20 December 2018")).toEqual([
"--Gantt__DayOff-background-color",
"--Gantt__Day-background-color",
"--Gantt__Day-background-color",
"--Gantt__Day-background-color",
"--Gantt__Day-background-color",
"--Gantt__Day-background-color",
]);
expect(getCellColorProperties("9pm 20 December 2018")).toEqual([
"--Gantt__Day-background-color",
"--Gantt__DayOff-background-color",
"--Gantt__DayOff-background-color",
"--Gantt__DayOff-background-color",
"--Gantt__DayOff-background-color",
"--Gantt__Day-background-color",
]);
});
test("offset attribute", async () => {
await mountGanttView({
resModel: "tasks",
arch: ``,
});
const { range } = getGridContent();
expect(range).toBe("From: 12/16/2018 to: 12/18/2018", {
message: "gantt view should be set to 4 days before initial date",
});
});
test("default_group_by attribute", async () => {
await mountGanttView({
resModel: "tasks",
arch: ``,
});
const { rows } = getGridContent();
expect(rows).toEqual([
{
title: "User 1",
pills: [
{
colSpan: "Out of bounds (1) -> 31 December 2018",
level: 1,
title: "Task 1",
},
{
colSpan: "20 December 2018 -> 20 (1/2) December 2018",
level: 0,
title: "Task 4",
},
],
},
{
title: "User 2",
pills: [
{
colSpan: "17 (1/2) December 2018 -> 22 (1/2) December 2018",
level: 0,
title: "Task 2",
},
{
colSpan: "20 (1/2) December 2018 -> 20 December 2018",
level: 1,
title: "Task 7",
},
{
colSpan: "27 December 2018 -> 03 (1/2) January 2019",
level: 0,
title: "Task 3",
},
],
},
]);
});
test("default_group_by attribute with groupBy", async () => {
// The default_group_by attribute should be ignored if a groupBy is given.
await mountGanttView({
resModel: "tasks",
arch: ``,
groupBy: ["project_id"],
});
const { rows } = getGridContent();
expect(rows).toEqual([
{
title: "Project 1",
pills: [
{
colSpan: "Out of bounds (1) -> 31 December 2018",
level: 0,
title: "Task 1",
},
{
colSpan: "17 (1/2) December 2018 -> 22 (1/2) December 2018",
level: 1,
title: "Task 2",
},
{
colSpan: "20 December 2018 -> 20 (1/2) December 2018",
level: 2,
title: "Task 4",
},
{
colSpan: "27 December 2018 -> 03 (1/2) January 2019",
level: 1,
title: "Task 3",
},
],
},
{
title: "Project 2",
pills: [
{
colSpan: "20 (1/2) December 2018 -> 20 December 2018",
level: 0,
title: "Task 7",
},
],
},
]);
});
test("default_group_by attribute with 2 fields", async () => {
await mountGanttView({
resModel: "tasks",
arch: ``,
});
const { rows } = getGridContent();
expect(rows).toEqual([
{
title: "User 1",
isGroup: true,
pills: [
{
colSpan: "Out of bounds (8) -> 19 December 2018",
title: "1",
},
{
colSpan: "20 December 2018 -> 20 (1/2) December 2018",
title: "2",
},
{
colSpan: "20 (1/2) December 2018 -> 31 December 2018",
title: "1",
},
],
},
{
title: "Project 1",
pills: [
{
colSpan: "Out of bounds (1) -> 31 December 2018",
level: 0,
title: "Task 1",
},
{
colSpan: "20 December 2018 -> 20 (1/2) December 2018",
level: 1,
title: "Task 4",
},
],
},
{
title: "Project 2",
},
{
title: "User 2",
isGroup: true,
pills: [
{
colSpan: "17 (1/2) December 2018 -> 20 (1/2) December 2018",
title: "1",
},
{
colSpan: "20 (1/2) December 2018 -> 20 December 2018",
title: "2",
},
{
colSpan: "21 December 2018 -> 22 (1/2) December 2018",
title: "1",
},
{
colSpan: "27 December 2018 -> 03 (1/2) January 2019",
title: "1",
},
],
},
{
title: "Project 1",
pills: [
{
colSpan: "17 (1/2) December 2018 -> 22 (1/2) December 2018",
level: 0,
title: "Task 2",
},
{
colSpan: "27 December 2018 -> 03 (1/2) January 2019",
level: 0,
title: "Task 3",
},
],
},
{
title: "Project 2",
pills: [
{
colSpan: "20 (1/2) December 2018 -> 20 December 2018",
level: 0,
title: "Task 7",
},
],
},
]);
});
test("default_range attribute", async () => {
await mountGanttView({
resModel: "tasks",
arch: ``,
});
expect(getActiveScale()).toBe(2); // month scale
const { columnHeaders, range } = getGridContent();
expect(range).toBe("12/20/2018");
expect(columnHeaders).toHaveLength(1);
await click(SELECTORS.rangeMenuToggler);
await animationFrame();
const firstRangeMenuItem = queryFirst(`${SELECTORS.rangeMenu} .dropdown-item`);
expect(firstRangeMenuItem).toHaveClass("selected");
expect(firstRangeMenuItem).toHaveText("Today");
});
test("consolidation and unavailabilities", async () => {
const unavailabilities = [
{
start: "2018-12-18 10:00:00",
stop: "2018-12-20 14:00:00",
},
];
onRpc("get_gantt_data", async ({ parent, kwargs }) => {
expect.step("get_gantt_data");
const result = await parent();
expect(kwargs.unavailability_fields).toEqual(["user_id"]);
result.unavailabilities.user_id = { 1: unavailabilities };
return result;
});
await mountGanttView({
resModel: "tasks",
arch: `
`,
groupBy: ["user_id"],
});
expect.verifySteps(["get_gantt_data"]);
// Normal day / unavailability
expect(getCellColorProperties("18 December 2018", "", { num: 2 })).toEqual([
"--Gantt__Day-background-color",
"--Gantt__DayOff-background-color",
]);
// Full unavailability
expect(getCellColorProperties("19 December 2018", "", { num: 2 })).toEqual([
"--Gantt__DayOff-background-color",
]);
// Unavailability / today
expect(getCell("20 December 2018")).toHaveClass("o_gantt_today");
expect(getCellColorProperties("20 December 2018", "", { num: 2 })).toEqual([
"--Gantt__DayOff-background-color",
"--Gantt__DayOffToday-background-color",
]);
});
test("default_range not in scales", async () => {
await mountGanttView({
resModel: "tasks",
arch: ``,
});
const { range } = getGridContent();
expect(range).toBe("2018");
});