import { beforeEach, expect, test } from "@odoo/hoot"; import { click, queryAll, queryAllProperties, queryAllTexts, queryAllValues, queryFirst, queryValue, resize, select, } from "@odoo/hoot-dom"; import { animationFrame, Deferred, mockDate, mockTimeZone } from "@odoo/hoot-mock"; import { getTimePickers } from "@web/../tests/core/datetime/datetime_test_helpers"; import { clickSave, contains, defineModels, fields, models, mountView, onRpc, pagerNext, } from "../../web_test_helpers"; function getPickerCell(expr) { return queryAll(`.o_datetime_picker .o_date_item_cell:contains(/^${expr}$/)`); } class Partner extends models.Model { date = fields.Date({ string: "A date", searchable: true }); datetime = fields.Datetime({ string: "A datetime", searchable: true }); datetime_end = fields.Datetime({ string: "Datetime End" }); bool_field = fields.Boolean({ string: "A boolean" }); _records = [ { id: 1, date: "2017-02-03", datetime: "2017-02-08 10:00:00", }, ]; } class User extends models.Model { _name = "res.users"; name = fields.Char(); has_group() { return true; } } defineModels([Partner, User]); beforeEach(() => { // Date field should not have an offset as they are ignored. // However, in the test environement, a UTC timezone is set to run all tests. And if any code does not use the safe timezone method // provided by the framework (which happens in this case inside the date range picker lib), unexpected behavior kicks in as the timezone // of the dev machine collides with the timezone set by the test env. // To avoid failing test on dev's local machines, a hack is to apply an timezone offset greater than the difference between UTC and the dev's // machine timezone. For belgium, > 60 is enough. For India, > 5h30 is required, hence 330. mockTimeZone(+5.5); }); test.tags("desktop"); test("Datetime field - interaction with the datepicker", async () => { Partner._records[0].datetime_end = "2017-03-13 00:00:00"; await mountView({ type: "form", resModel: "partner", resId: 1, arch: `
`, }); // Check date range picker initialization expect(".o_field_daterange").toHaveCount(1); expect(".o_datetime_picker").toHaveCount(0); // open the first one const daterange = queryFirst(".o_field_daterange"); await contains("input[data-field=datetime]", { root: daterange }).click(); expect(".o_datetime_picker").toBeDisplayed(); expect(".o_date_item_cell.o_select_start").toHaveText("8"); let [hourSelectStart, minuteSelectStart] = getTimePickers().at(0); expect(hourSelectStart).toHaveValue("15"); expect(minuteSelectStart).toHaveValue("30"); expect(".o_date_item_cell.o_select_end").toHaveText("13"); let [hourSelectEnd, minuteSelectEnd] = getTimePickers().at(1); expect(hourSelectEnd).toHaveValue("5"); expect(minuteSelectEnd).toHaveValue("30"); expect(queryAll("option", { root: minuteSelectStart })).toHaveCount(12); // Close picker await contains(".o_form_view_container").click(); expect(".o_datetime_picker").toHaveCount(0); // Try to check with end date await contains("input[data-field=datetime_end]", { root: daterange }).click(); expect(".o_datetime_picker").toBeDisplayed(); expect(".o_date_item_cell.o_select_start").toHaveText("8"); [hourSelectStart, minuteSelectStart] = getTimePickers().at(0); expect(hourSelectStart).toHaveValue("15"); expect(minuteSelectStart).toHaveValue("30"); expect(".o_date_item_cell.o_select_end").toHaveText("13"); [hourSelectEnd, minuteSelectEnd] = getTimePickers().at(1); expect(hourSelectEnd).toHaveValue("5"); expect(minuteSelectEnd).toHaveValue("30"); expect(queryAll("option", { root: minuteSelectStart })).toHaveCount(12); // Select a new range and check that inputs are updated await contains(getPickerCell("8").at(0)).click(); // 02/08/2017 await contains(getPickerCell("9").at(0)).click(); // 02/09/2017 // Save await clickSave(); // Check date after save expect("input[data-field=datetime]").toHaveValue("02/08/2017 15:30:00"); expect("input[data-field=datetime_end]").toHaveValue("02/09/2017 05:30:00"); }); test.tags("desktop"); test("Date field - interaction with the datepicker", async () => { Partner._fields.date_end = fields.Date({ string: "Date end" }); Partner._records[0].date_end = "2017-02-08"; await mountView({ type: "form", resModel: "partner", resId: 1, arch: `
`, }); // Check date range picker initialization expect(".o_field_daterange").toHaveCount(1); expect(".o_datetime_picker").toHaveCount(0); // open the first one await contains("input[data-field=date]").click(); let datepicker = queryFirst(".o_datetime_picker"); expect(datepicker).toBeDisplayed(); expect(".o_select_start").toHaveText("3"); expect(".o_select_end").toHaveText("8"); // Change date await contains(getPickerCell("16").at(0)).click(); // 2017-02-16 await contains(getPickerCell("12").at(1)).click(); // 2017-03-12 // Close picker await contains(".o_form_view").click(); // Check date after change expect(datepicker).not.toBeDisplayed(); expect("input[data-field=date]").toHaveValue("02/16/2017"); expect("input[data-field=date_end]").toHaveValue("03/12/2017"); // Try to change range with end date await contains("input[data-field=date_end]").click(); datepicker = queryFirst(".o_datetime_picker"); expect(datepicker).toBeDisplayed(); expect(".o_select_start").toHaveText("16"); expect(".o_select_end").toHaveText("12"); // Change date await contains(getPickerCell("13").at(0)).click(); await contains(getPickerCell("18").at(1)).click(); // Close picker await contains(".o_form_view").click(); // Check date after change expect(datepicker).not.toBeDisplayed(); expect("input[data-field=date]").toHaveValue("02/13/2017"); expect("input[data-field=date_end]").toHaveValue("03/18/2017"); // Save await clickSave(); // Check date after save expect("input[data-field=date]").toHaveValue("02/13/2017"); expect("input[data-field=date_end]").toHaveValue("03/18/2017"); }); test("date picker should still be present when scrolling outside of it", async () => { Partner._records[0].datetime_end = "2017-03-13 00:00:00"; await mountView({ type: "form", resModel: "partner", resId: 1, arch: `
`, }); await contains("input[data-field=datetime]").click(); expect(".o_datetime_picker").toBeDisplayed(); await contains(document.body).scroll({ top: 50 }); expect(".o_datetime_picker").toBeDisplayed(); }); test("DateRangeField with label opens datepicker on click", async () => { Partner._fields.date_end = fields.Date({ string: "Date end" }); Partner._records[0].date_end = "2017-02-08"; await mountView({ type: "form", resModel: "partner", resId: 1, arch: `