/** @odoo-module **/ import { click, editInput, getFixture, nextTick, patchDate, patchWithCleanup, } from "@web/../tests/helpers/utils"; import { patchUserWithCleanup } from "@web/../tests/helpers/mock_services"; import { changeScale, clickEvent, expandCalendarView, findDateCol, findTimeRow, triggerEventForCalendar, } from "@web/../tests/views/calendar/helpers"; import { makeView, setupViewRegistries } from "@web/../tests/views/helpers"; import { browser } from "@web/core/browser/browser"; let target; let serverData; const uid = -1; async function selectTimeStart(target, startDateTime) { const [startDate, startTime] = startDateTime.split(" "); const startCol = findDateCol(target, startDate); const startRow = findTimeRow(target, startTime); await scrollTo(startRow); const startColRect = startCol.getBoundingClientRect(); const startRowRect = startRow.getBoundingClientRect(); await triggerEventForCalendar(startRow, "mousedown", { x: startColRect.x + startColRect.width / 2, y: startRowRect.y + 1, }); await triggerEventForCalendar(startRow, "mouseup", { x: startColRect.x + startColRect.width / 2, y: startRowRect.y + 1, }); await nextTick(); } QUnit.module("CalendarView", ({ beforeEach }) => { beforeEach(() => { // 2016-12-12 08:00:00 patchDate(2016, 11, 12, 8, 0, 0); patchWithCleanup(browser, { setTimeout: (fn) => fn(), clearTimeout: () => {}, }); target = getFixture(); setupViewRegistries(); patchUserWithCleanup({ get userId() { return uid; }, }); serverData = { models: { event: { fields: { id: { string: "ID", type: "integer" }, user_id: { string: "user", type: "many2one", relation: "user", default: uid, }, partner_id: { string: "user", type: "many2one", relation: "partner", related: "user_id.partner_id", default: 1, }, name: { string: "name", type: "char" }, start_date: { string: "start date", type: "date" }, stop_date: { string: "stop date", type: "date" }, start: { string: "start datetime", type: "datetime" }, stop: { string: "stop datetime", type: "datetime" }, delay: { string: "delay", type: "float" }, duration: { string: "Duration", type: "float", default: 1 }, allday: { string: "allday", type: "boolean" }, partner_ids: { string: "attendees", type: "one2many", relation: "partner", default: [[6, 0, [1]]], }, type: { string: "type", type: "integer" }, event_type_id: { string: "Event Type", type: "many2one", relation: "event_type", }, color_event: { string: "Color", type: "integer", related: "event_type_id.color_event_type", }, is_hatched: { string: "Hatched", type: "boolean" }, is_striked: { string: "Striked", type: "boolean" }, res_model_name: { string: "Linked Model Name", type: "char" }, }, records: [ { id: 1, user_id: uid, partner_id: 1, name: "event 1", start: "2016-12-11 00:00:00", stop: "2016-12-11 01:00:00", allday: false, partner_ids: [1, 2, 3], type: 1, is_hatched: false, }, { id: 2, user_id: uid, partner_id: 1, name: "event 2", start: "2016-12-12 10:55:05", stop: "2016-12-12 14:55:05", allday: false, partner_ids: [1, 2], type: 3, is_hatched: false, }, ], methods: { has_access() { return Promise.resolve(true); }, }, }, user: { fields: { id: { string: "ID", type: "integer" }, display_name: { string: "Displayed name", type: "char" }, partner_id: { string: "partner", type: "many2one", relation: "partner", }, }, records: [ { id: uid, display_name: "user 1", partner_id: 1 }, { id: 4, display_name: "user 4", partner_id: 4 }, ], }, partner: { fields: { id: { string: "ID", type: "integer" }, display_name: { string: "Displayed name", type: "char" }, image: { string: "image", type: "integer" }, }, records: [ { id: 1, display_name: "partner 1", image: "AAA" }, { id: 2, display_name: "partner 2", image: "BBB" }, { id: 3, display_name: "partner 3", image: "CCC" }, { id: 4, display_name: "partner 4", image: "DDD" }, ], }, filter_partner: { fields: { id: { string: "ID", type: "integer" }, user_id: { string: "user", type: "many2one", relation: "user" }, partner_id: { string: "partner", type: "many2one", relation: "partner", }, partner_checked: { string: "checked", type: "boolean" }, }, records: [ { id: 1, user_id: uid, partner_id: 1, partner_checked: true }, { id: 2, user_id: uid, partner_id: 2, partner_checked: true }, { id: 3, user_id: 4, partner_id: 3, partner_checked: true }, ], }, }, }; }); QUnit.test(`Linked record rendering`, async (assert) => { assert.expect(3); serverData.models.event.records.push({ id: 3, user_id: 4, partner_id: 1, name: "event With record", start: "2016-12-11 09:00:00", stop: "2016-12-11 10:00:00", allday: false, partner_ids: [1, 2, 3], res_model_name: "Time Off", }); await makeView({ type: "calendar", resModel: "event", serverData, arch: ` `, mockRPC(route, args) { if (route === "/web/dataset/call_kw/res.users/has_group") { return Promise.resolve(true); } else if (route === "/web/dataset/call_kw/res.partner/get_attendee_detail") { return Promise.resolve([]); } else if (route === "/calendar/check_credentials") { return Promise.resolve({}); } else if (route === "/web/dataset/call_kw/res.users/check_synchronization_status") { return Promise.resolve({}); } else if (route === "/web/dataset/call_kw/calendar.event/get_default_duration") { return 3.25; } }, }); assert.containsOnce( target, ".o_calendar_renderer .fc-view", "should instance of fullcalendar" ); await changeScale(target, "week"); await clickEvent(target, 3); assert.containsOnce(target, ".fa-link", "A link icon should be present"); assert.strictEqual(target.querySelector("li a[href='#']").textContent, "Time Off"); }); QUnit.test(`Default duration rendering`, async (assert) => { assert.expect(2); await makeView({ type: "calendar", resModel: "event", serverData, arch: ` `, mockRPC(route, args) { if (route === "/web/dataset/call_kw/res.users/has_group") { return Promise.resolve(true); } else if (route === "/web/dataset/call_kw/res.partner/get_attendee_detail") { return Promise.resolve([]); } else if (route === "/calendar/check_credentials") { return Promise.resolve({}); } else if (route === "/web/dataset/call_kw/res.users/check_synchronization_status") { return Promise.resolve({}); } else if (route === "/web/dataset/call_kw/calendar.event/get_default_duration") { return 3.25; } }, }); expandCalendarView(target); await changeScale(target, "week"); await selectTimeStart(target, "2016-12-15 15:00:00"); await editInput(target, ".o-calendar-quick-create--input", "Event with new duration"); await click(target, ".o-calendar-quick-create--create-btn"); // This new event is the third await clickEvent(target, 3); assert.strictEqual( target.querySelector('div[name="start"] div').textContent, "12/15/2016 15:00:00" ); assert.strictEqual( target.querySelector('div[name="stop"] div').textContent, "12/15/2016 18:15:00", "The duration should be 3.25 hours" ); }); });