334 lines
15 KiB
JavaScript
334 lines
15 KiB
JavaScript
odoo.define('web.datepicker_tests', function (require) {
|
|
"use strict";
|
|
|
|
const { DatePicker, DateTimePicker } = require('web.DatePickerOwl');
|
|
const testUtils = require('web.test_utils');
|
|
const time = require('web.time');
|
|
|
|
const { createComponent } = testUtils;
|
|
|
|
QUnit.module('Components', {}, function () {
|
|
|
|
QUnit.module('DatePicker (legacy)');
|
|
|
|
QUnit.test("basic rendering", async function (assert) {
|
|
assert.expect(8);
|
|
|
|
const picker = await createComponent(DatePicker, {
|
|
props: { date: moment('1997-01-09'), onDateTimeChanged: () => {} },
|
|
});
|
|
|
|
|
|
assert.containsOnce(picker, 'input.o_input.o_datepicker_input');
|
|
assert.containsOnce(picker, 'span.o_datepicker_button');
|
|
assert.containsNone(document.body, 'div.bootstrap-datetimepicker-widget');
|
|
|
|
const input = picker.el.querySelector('input.o_input.o_datepicker_input');
|
|
assert.strictEqual(input.value, '01/09/1997',
|
|
"Value should be the one given")
|
|
;
|
|
assert.strictEqual(input.dataset.target, `#${picker.el.id}`,
|
|
"DatePicker id should match its input target");
|
|
|
|
await testUtils.dom.click(input);
|
|
|
|
assert.containsOnce(document.body, 'div.bootstrap-datetimepicker-widget .datepicker');
|
|
assert.containsNone(document.body, 'div.bootstrap-datetimepicker-widget .timepicker');
|
|
assert.strictEqual(
|
|
document.querySelector('.datepicker .day.active').dataset.day,
|
|
'01/09/1997',
|
|
"Datepicker should have set the correct day"
|
|
);
|
|
});
|
|
|
|
QUnit.test("pick a date", async function (assert) {
|
|
assert.expect(5);
|
|
|
|
const picker = await createComponent(DatePicker, {
|
|
props: {
|
|
date: moment('1997-01-09'),
|
|
onDateTimeChanged: date => {
|
|
assert.step('datetime-changed');
|
|
assert.strictEqual(date.format('MM/DD/YYYY'), '02/08/1997',
|
|
"Event should transmit the correct date");
|
|
},
|
|
}
|
|
});
|
|
const input = picker.el.querySelector('.o_datepicker_input');
|
|
|
|
await testUtils.dom.click(input);
|
|
await testUtils.dom.click(document.querySelector('.datepicker th.next')); // next month
|
|
|
|
assert.verifySteps([]);
|
|
|
|
await testUtils.dom.click(document.querySelectorAll('.datepicker table td')[15]); // previous day
|
|
|
|
assert.strictEqual(input.value, '02/08/1997');
|
|
assert.verifySteps(['datetime-changed']);
|
|
});
|
|
|
|
QUnit.test("pick a date with locale", async function (assert) {
|
|
assert.expect(4);
|
|
|
|
// weird shit of moment https://github.com/moment/moment/issues/5600
|
|
// When month regex returns undefined, january is taken (first month of the default "nameless" locale)
|
|
const originalLocale = moment.locale();
|
|
// Those parameters will make Moment's internal compute stuff that are relevant to the bug
|
|
const months = 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_');
|
|
const monthsShort = 'janv._févr._mars_avr._mai_juin_juil._août_custSept._oct._nov._déc.'.split('_');
|
|
moment.defineLocale('frenchForTests', { months, monthsShort, code: 'frTest' , monthsParseExact: true});
|
|
|
|
const hasChanged = testUtils.makeTestPromise();
|
|
const picker = await createComponent(DatePicker, {
|
|
translateParameters: {
|
|
date_format: "%d %b, %Y", // Those are important too
|
|
time_format: "%H:%M:%S",
|
|
},
|
|
props: {
|
|
date: moment('09/01/1997', 'MM/DD/YYYY'),
|
|
onDateTimeChanged: date => {
|
|
assert.step('datetime-changed');
|
|
assert.strictEqual(date.format('MM/DD/YYYY'), '09/02/1997',
|
|
"Event should transmit the correct date");
|
|
hasChanged.resolve();
|
|
},
|
|
}
|
|
});
|
|
const input = picker.el.querySelector('.o_datepicker_input');
|
|
await testUtils.dom.click(input);
|
|
|
|
await testUtils.dom.click(document.querySelectorAll('.datepicker table td')[3]); // next day
|
|
|
|
assert.strictEqual(input.value, '02 custSept., 1997');
|
|
assert.verifySteps(['datetime-changed']);
|
|
|
|
moment.locale(originalLocale);
|
|
moment.updateLocale('frenchForTests', null);
|
|
});
|
|
|
|
QUnit.test("enter a date value", async function (assert) {
|
|
assert.expect(5);
|
|
|
|
const picker = await createComponent(DatePicker, {
|
|
props: {
|
|
date: moment('1997-01-09'),
|
|
onDateTimeChanged: date => {
|
|
assert.step('datetime-changed');
|
|
assert.strictEqual(date.format('MM/DD/YYYY'), '02/08/1997',
|
|
"Event should transmit the correct date");
|
|
},
|
|
}
|
|
});
|
|
const input = picker.el.querySelector('.o_datepicker_input');
|
|
|
|
assert.verifySteps([]);
|
|
|
|
await testUtils.fields.editAndTrigger(input, '02/08/1997', ['change']);
|
|
|
|
assert.verifySteps(['datetime-changed']);
|
|
|
|
await testUtils.dom.click(input);
|
|
|
|
assert.strictEqual(
|
|
document.querySelector('.datepicker .day.active').dataset.day,
|
|
'02/08/1997',
|
|
"Datepicker should have set the correct day"
|
|
);
|
|
});
|
|
|
|
QUnit.test("Date format is correctly set", async function (assert) {
|
|
assert.expect(2);
|
|
|
|
testUtils.mock.patch(time, { getLangDateFormat: () => "YYYY/MM/DD" });
|
|
const picker = await createComponent(DatePicker, {
|
|
props: { date: moment('1997-01-09'), onDateTimeChanged: () => {} },
|
|
});
|
|
const input = picker.el.querySelector('.o_datepicker_input');
|
|
|
|
assert.strictEqual(input.value, '1997/01/09');
|
|
|
|
// Forces an update to assert that the registered format is the correct one
|
|
await testUtils.dom.click(input);
|
|
|
|
assert.strictEqual(input.value, '1997/01/09');
|
|
|
|
testUtils.mock.unpatch(time);
|
|
});
|
|
|
|
QUnit.module('DateTimePicker (legacy)');
|
|
|
|
QUnit.test("basic rendering", async function (assert) {
|
|
assert.expect(11);
|
|
|
|
const picker = await createComponent(DateTimePicker, {
|
|
props: { date: moment('1997-01-09 12:30:01'), onDateTimeChanged: () => {} },
|
|
});
|
|
|
|
assert.containsOnce(picker, 'input.o_input.o_datepicker_input');
|
|
assert.containsOnce(picker, 'span.o_datepicker_button');
|
|
assert.containsNone(document.body, 'div.bootstrap-datetimepicker-widget');
|
|
|
|
const input = picker.el.querySelector('input.o_input.o_datepicker_input');
|
|
assert.strictEqual(input.value, '01/09/1997 12:30:01', "Value should be the one given");
|
|
assert.strictEqual(input.dataset.target, `#${picker.el.id}`,
|
|
"DateTimePicker id should match its input target");
|
|
|
|
await testUtils.dom.click(input);
|
|
|
|
assert.containsOnce(document.body, 'div.bootstrap-datetimepicker-widget .datepicker');
|
|
assert.containsOnce(document.body, 'div.bootstrap-datetimepicker-widget .timepicker');
|
|
assert.strictEqual(
|
|
document.querySelector('.datepicker .day.active').dataset.day,
|
|
'01/09/1997',
|
|
"Datepicker should have set the correct day");
|
|
|
|
assert.strictEqual(document.querySelector('.timepicker .timepicker-hour').innerText.trim(), '12',
|
|
"Datepicker should have set the correct hour");
|
|
assert.strictEqual(document.querySelector('.timepicker .timepicker-minute').innerText.trim(), '30',
|
|
"Datepicker should have set the correct minute");
|
|
assert.strictEqual(document.querySelector('.timepicker .timepicker-second').innerText.trim(), '01',
|
|
"Datepicker should have set the correct second");
|
|
});
|
|
|
|
QUnit.test("pick a date and time", async function (assert) {
|
|
assert.expect(5);
|
|
|
|
const picker = await createComponent(DateTimePicker, {
|
|
props: {
|
|
date: moment('1997-01-09 12:30:01'),
|
|
onDateTimeChanged: date => {
|
|
assert.step('datetime-changed');
|
|
assert.strictEqual(date.format('MM/DD/YYYY HH:mm:ss'), '02/08/1997 15:45:05',
|
|
"Event should transmit the correct date");
|
|
},
|
|
}
|
|
});
|
|
const input = picker.el.querySelector('input.o_input.o_datepicker_input');
|
|
|
|
await testUtils.dom.click(input);
|
|
await testUtils.dom.click(document.querySelector('.datepicker th.next')); // February
|
|
await testUtils.dom.click(document.querySelectorAll('.datepicker table td')[15]); // 08
|
|
await testUtils.dom.click(document.querySelector('a[title="Select Time"]'));
|
|
await testUtils.dom.click(document.querySelector('.timepicker .timepicker-hour'));
|
|
await testUtils.dom.click(document.querySelectorAll('.timepicker .hour')[15]); // 15h
|
|
await testUtils.dom.click(document.querySelector('.timepicker .timepicker-minute'));
|
|
await testUtils.dom.click(document.querySelectorAll('.timepicker .minute')[9]); // 45m
|
|
await testUtils.dom.click(document.querySelector('.timepicker .timepicker-second'));
|
|
|
|
assert.verifySteps([]);
|
|
|
|
await testUtils.dom.click(document.querySelectorAll('.timepicker .second')[1]); // 05s
|
|
|
|
assert.strictEqual(input.value, '02/08/1997 15:45:05');
|
|
assert.verifySteps(['datetime-changed']);
|
|
});
|
|
|
|
QUnit.test("pick a date and time with locale", async function (assert) {
|
|
assert.expect(5);
|
|
|
|
// weird shit of moment https://github.com/moment/moment/issues/5600
|
|
// When month regex returns undefined, january is taken (first month of the default "nameless" locale)
|
|
const originalLocale = moment.locale();
|
|
// Those parameters will make Moment's internal compute stuff that are relevant to the bug
|
|
const months = 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_');
|
|
const monthsShort = 'janv._févr._mars_avr._mai_juin_juil._août_custSept._oct._nov._déc.'.split('_');
|
|
moment.defineLocale('frenchForTests', { months, monthsShort, code: 'frTest' , monthsParseExact: true});
|
|
|
|
const hasChanged = testUtils.makeTestPromise();
|
|
const picker = await createComponent(DateTimePicker, {
|
|
translateParameters: {
|
|
date_format: "%d %b, %Y", // Those are important too
|
|
time_format: "%H:%M:%S",
|
|
},
|
|
props: {
|
|
date: moment('09/01/1997 12:30:01', 'MM/DD/YYYY HH:mm:ss'),
|
|
onDateTimeChanged: date => {
|
|
assert.step('datetime-changed');
|
|
assert.strictEqual(date.format('MM/DD/YYYY HH:mm:ss'), '09/02/1997 15:45:05',
|
|
"Event should transmit the correct date");
|
|
hasChanged.resolve();
|
|
},
|
|
}
|
|
});
|
|
|
|
const input = picker.el.querySelector('input.o_input.o_datepicker_input');
|
|
|
|
await testUtils.dom.click(input);
|
|
await testUtils.dom.click(document.querySelectorAll('.datepicker table td')[3]); // next day
|
|
await testUtils.dom.click(document.querySelector('a[title="Select Time"]'));
|
|
await testUtils.dom.click(document.querySelector('.timepicker .timepicker-hour'));
|
|
await testUtils.dom.click(document.querySelectorAll('.timepicker .hour')[15]); // 15h
|
|
await testUtils.dom.click(document.querySelector('.timepicker .timepicker-minute'));
|
|
await testUtils.dom.click(document.querySelectorAll('.timepicker .minute')[9]); // 45m
|
|
await testUtils.dom.click(document.querySelector('.timepicker .timepicker-second'));
|
|
|
|
assert.verifySteps([]);
|
|
await testUtils.dom.click(document.querySelectorAll('.timepicker .second')[1]); // 05s
|
|
|
|
assert.strictEqual(input.value, '02 custSept., 1997 15:45:05');
|
|
assert.verifySteps(['datetime-changed']);
|
|
|
|
await hasChanged;
|
|
|
|
moment.locale(originalLocale);
|
|
moment.updateLocale('frenchForTests', null);
|
|
});
|
|
|
|
QUnit.test("enter a datetime value", async function (assert) {
|
|
assert.expect(9);
|
|
|
|
const picker = await createComponent(DateTimePicker, {
|
|
props: {
|
|
date: moment('1997-01-09 12:30:01'),
|
|
onDateTimeChanged: date => {
|
|
assert.step('datetime-changed');
|
|
assert.strictEqual(date.format('MM/DD/YYYY HH:mm:ss'), '02/08/1997 15:45:05',
|
|
"Event should transmit the correct date");
|
|
},
|
|
}
|
|
});
|
|
const input = picker.el.querySelector('.o_datepicker_input');
|
|
|
|
assert.verifySteps([]);
|
|
|
|
await testUtils.fields.editAndTrigger(input, '02/08/1997 15:45:05', ['change']);
|
|
|
|
assert.verifySteps(['datetime-changed']);
|
|
|
|
await testUtils.dom.click(input);
|
|
|
|
assert.strictEqual(input.value, '02/08/1997 15:45:05');
|
|
assert.strictEqual(
|
|
document.querySelector('.datepicker .day.active').dataset.day,
|
|
'02/08/1997',
|
|
"Datepicker should have set the correct day"
|
|
);
|
|
assert.strictEqual(document.querySelector('.timepicker .timepicker-hour').innerText.trim(), '15',
|
|
"Datepicker should have set the correct hour");
|
|
assert.strictEqual(document.querySelector('.timepicker .timepicker-minute').innerText.trim(), '45',
|
|
"Datepicker should have set the correct minute");
|
|
assert.strictEqual(document.querySelector('.timepicker .timepicker-second').innerText.trim(), '05',
|
|
"Datepicker should have set the correct second");
|
|
});
|
|
|
|
QUnit.test("Date time format is correctly set", async function (assert) {
|
|
assert.expect(2);
|
|
|
|
testUtils.mock.patch(time, { getLangDatetimeFormat: () => "hh:mm:ss YYYY/MM/DD" });
|
|
const picker = await createComponent(DateTimePicker, {
|
|
props: { date: moment('1997-01-09 12:30:01'), onDateTimeChanged: () => {} },
|
|
});
|
|
const input = picker.el.querySelector('.o_datepicker_input');
|
|
|
|
assert.strictEqual(input.value, '12:30:01 1997/01/09');
|
|
|
|
// Forces an update to assert that the registered format is the correct one
|
|
await testUtils.dom.click(input);
|
|
|
|
assert.strictEqual(input.value, '12:30:01 1997/01/09');
|
|
|
|
testUtils.mock.unpatch(time);
|
|
});
|
|
});
|
|
});
|