import { beforeEach, describe, expect, test } from "@odoo/hoot"; import { mockDate } from "@odoo/hoot-mock"; import { onRpc } from "@web/../tests/web_test_helpers"; import { defineGanttModels } from "./gantt_mock_models"; import { SELECTORS, getCellColorProperties, getGridContent, mountGanttView, } from "./web_gantt_test_helpers"; describe.current.tags("desktop"); defineGanttModels(); beforeEach(() => mockDate("2018-12-20T08:00:00", +1)); test("empty sparse gantt", async () => { await mountGanttView({ resModel: "tasks", arch: ``, domain: [["id", "=", 0]], }); const { viewTitle, range, columnHeaders, rows } = getGridContent(); expect(viewTitle).toBe("Gantt View"); expect(range).toBe("From: 12/01/2018 to: 02/28/2019"); expect(columnHeaders).toHaveLength(34); expect(rows).toEqual([{ title: "" }]); expect(SELECTORS.noContentHelper).toHaveCount(0); }); test("sparse gantt", async () => { await mountGanttView({ resModel: "tasks", arch: ``, domain: [["id", "=", 1]], }); const { viewTitle, range, columnHeaders, rows } = getGridContent(); expect(viewTitle).toBe("Gantt View"); expect(range).toBe("From: 12/01/2018 to: 02/28/2019"); expect(columnHeaders).toHaveLength(34); expect(rows).toEqual([ { pills: [ { colSpan: "Out of bounds (1) -> 31 December 2018", level: 0, title: "Task 1", }, ], title: "Task 1", }, ]); expect(SELECTORS.noContentHelper).toHaveCount(0); }); test("sparse grouped gantt", async () => { await mountGanttView({ resModel: "tasks", arch: ``, groupBy: ["stage"], }); const { viewTitle, range, columnHeaders, rows } = getGridContent(); expect(viewTitle).toBe("Gantt View"); expect(range).toBe("From: 12/01/2018 to: 02/28/2019"); expect(columnHeaders).toHaveLength(34); expect(rows).toEqual([ { isGroup: true, pills: [ { colSpan: "Out of bounds (1) -> 31 December 2018", title: "1", }, ], title: "To Do", }, { pills: [ { colSpan: "Out of bounds (1) -> 31 December 2018", level: 0, title: "Task 1", }, ], title: "Task 1", }, { isGroup: true, pills: [ { colSpan: "20 December 2018 -> 20 (1/2) December 2018", title: "1", }, ], title: "In Progress", }, { pills: [ { colSpan: "20 December 2018 -> 20 (1/2) December 2018", level: 0, title: "Task 4", }, ], title: "Task 4", }, { isGroup: true, pills: [ { colSpan: "17 (1/2) December 2018 -> 22 (1/2) December 2018", title: "1", }, ], title: "Done", }, { title: "Task 5", }, { pills: [ { colSpan: "17 (1/2) December 2018 -> 22 (1/2) December 2018", level: 0, title: "Task 2", }, ], title: "Task 2", }, { isGroup: true, pills: [ { colSpan: "20 (1/2) December 2018 -> 20 December 2018", title: "1", }, { colSpan: "27 December 2018 -> 03 (1/2) January 2019", title: "1", }, ], title: "Cancelled", }, { pills: [ { colSpan: "20 (1/2) December 2018 -> 20 December 2018", level: 0, title: "Task 7", }, ], title: "Task 7", }, { pills: [ { colSpan: "27 December 2018 -> 03 (1/2) January 2019", level: 0, title: "Task 3", }, ], title: "Task 3", }, ]); expect(SELECTORS.noContentHelper).toHaveCount(0); }); test("sparse gantt with consolidation", async () => { await mountGanttView({ resModel: "tasks", arch: ` `, groupBy: ["stage"], }); const { viewTitle, range, columnHeaders, rows } = getGridContent(); expect(viewTitle).toBe("Gantt View"); expect(range).toBe("From: 12/01/2018 to: 02/28/2019"); expect(columnHeaders).toHaveLength(34); expect(rows).toEqual([ { isGroup: true, pills: [ { colSpan: "Out of bounds (1) -> 31 December 2018", title: "1", }, ], title: "To Do", }, { pills: [ { colSpan: "Out of bounds (1) -> 31 December 2018", level: 0, title: "Task 1", }, ], title: "Task 1", }, { isGroup: true, pills: [ { colSpan: "20 December 2018 -> 20 (1/2) December 2018", title: "1", }, ], title: "In Progress", }, { pills: [ { colSpan: "20 December 2018 -> 20 (1/2) December 2018", level: 0, title: "Task 4", }, ], title: "Task 4", }, { isGroup: true, pills: [ { colSpan: "17 (1/2) December 2018 -> 22 (1/2) December 2018", title: "1", }, ], title: "Done", }, { title: "Task 5", }, { pills: [ { colSpan: "17 (1/2) December 2018 -> 22 (1/2) December 2018", level: 0, title: "Task 2", }, ], title: "Task 2", }, { isGroup: true, pills: [ { colSpan: "20 (1/2) December 2018 -> 20 December 2018", title: "1", }, { colSpan: "27 December 2018 -> 03 (1/2) January 2019", title: "1", }, ], title: "Cancelled", }, { pills: [ { colSpan: "20 (1/2) December 2018 -> 20 December 2018", level: 0, title: "Task 7", }, ], title: "Task 7", }, { pills: [ { colSpan: "27 December 2018 -> 03 (1/2) January 2019", level: 0, title: "Task 3", }, ], title: "Task 3", }, ]); expect(SELECTORS.noContentHelper).toHaveCount(0); }); test("sparse gantt with a group expand", async () => { onRpc("get_gantt_data", () => { return { groups: [ { stage: "todo", __record_ids: [], }, { stage: "in_progress", __record_ids: [4], }, ], length: 2, records: [ { display_name: "Task 4", id: 4, progress: 0, stage: "in_progress", start: "2018-12-20 02:30:00", stop: "2018-12-20 06:29:59", }, ], }; }); await mountGanttView({ resModel: "tasks", arch: ` `, groupBy: ["stage"], }); const { viewTitle, range, columnHeaders, rows } = getGridContent(); expect(viewTitle).toBe("Gantt View"); expect(range).toBe("From: 12/01/2018 to: 02/28/2019"); expect(columnHeaders).toHaveLength(34); expect(rows).toEqual([ { isGroup: true, title: "To Do", }, { title: "", }, { isGroup: true, pills: [ { colSpan: "20 December 2018 -> 20 (1/2) December 2018", title: "1", }, ], title: "In Progress", }, { pills: [ { colSpan: "20 December 2018 -> 20 (1/2) December 2018", level: 0, title: "Task 4", }, ], title: "Task 4", }, ]); expect(SELECTORS.noContentHelper).toHaveCount(0); }); test("empty sparse gantt with unavailabilities", async () => { const unavailabilities = [ { start: "2018-12-18 23:00:00", stop: "2018-12-19 23:00:00", }, ]; onRpc("get_gantt_data", async ({ parent, kwargs }) => { expect.step("get_gantt_data"); const result = await parent(); expect(kwargs.unavailability_fields).toEqual([]); result.unavailabilities.__default = { false: unavailabilities }; return result; }); await mountGanttView({ resModel: "tasks", arch: ``, domain: [["id", "=", 0]], }); expect.verifySteps(["get_gantt_data"]); // Full unavailability expect(getCellColorProperties("19 December 2018")).toEqual([ "--Gantt__DayOff-background-color", ]); }); test("sparse gantt with unavailabilities", async () => { const unavailabilities = [ { start: "2018-12-18 23:00:00", stop: "2018-12-19 23:00:00", }, ]; onRpc("get_gantt_data", async ({ parent, kwargs }) => { expect.step("get_gantt_data"); const result = await parent(); expect(kwargs.unavailability_fields).toEqual([]); result.unavailabilities.__default = { false: unavailabilities }; return result; }); await mountGanttView({ resModel: "tasks", arch: ``, domain: [["id", "=", 1]], }); expect.verifySteps(["get_gantt_data"]); // Full unavailability expect(getCellColorProperties("19 December 2018")).toEqual([ "--Gantt__DayOff-background-color", ]); }); test("sparse grouped gantt with unavailabilities", async () => { const unavailabilities = [ { start: "2018-12-18 23:00:00", stop: "2018-12-19 23: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"]); // Full unavailability expect(getCellColorProperties("19 December 2018", "Task 5")).toEqual([ "--Gantt__DayOff-background-color", ]); }); test("sparse gantt with consolidation with unavailabilities", async () => { const unavailabilities = [ { start: "2018-12-18 23:00:00", stop: "2018-12-19 23: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"]); // Full unavailability expect(getCellColorProperties("19 December 2018", "", { num: 2 })).toEqual([ "--Gantt__DayOff-background-color", ]); }); test("sparse gantt with a group expand and unavailabilities", async () => { const unavailabilities = [ { start: "2018-12-18 23:00:00", stop: "2018-12-19 23:00:00", }, ]; onRpc("get_gantt_data", ({ kwargs }) => { expect.step("get_gantt_data"); expect(kwargs.unavailability_fields).toEqual(["user_id"]); return { groups: [ { user_id: [1, "Charles"], __record_ids: [], }, { user_id: [2, "Louis"], __record_ids: [4], }, ], length: 2, records: [ { display_name: "Task 4", id: 4, progress: 0, user_id: 1, start: "2018-12-20 02:30:00", stop: "2018-12-20 06:29:59", }, ], unavailabilities: { user_id: { 1: unavailabilities, 2: [] }, }, }; }); await mountGanttView({ resModel: "tasks", arch: ` `, groupBy: ["user_id"], }); expect.verifySteps(["get_gantt_data"]); expect(getCellColorProperties("19 December 2018", "", { num: 2 })).toEqual([ "--Gantt__DayOff-background-color", ]); });