vanillajs-datepicker
Version:
A vanilla JavaScript remake of bootstrap-datepicker for Bulma and other CSS frameworks
1,003 lines (806 loc) • 35 kB
JavaScript
describe('events', function () {
let clock;
let input;
let dp;
let picker;
let viewSwitch;
before(function () {
clock = sinon.useFakeTimers({now: new Date(2020, 1, 14), shouldAdvanceTime: true});
input = document.createElement('input');
testContainer.appendChild(input);
({dp, picker} = createDP(input));
viewSwitch = getViewSwitch(picker);
});
after(function () {
dp.destroy();
testContainer.removeChild(input);
clock.restore();
});
describe('changeDate', function () {
let spyChangeDate;
let pickerSnapshot;
beforeEach(function () {
dp.show();
spyChangeDate = sinon.spy(() => {
const snapshot = dp.picker.element.cloneNode(true);
pickerSnapshot = {
viewSwitchLabel: getViewSwitch(snapshot).textContent,
cells: getCells(snapshot),
};
});
input.addEventListener('changeDate', spyChangeDate);
});
afterEach(function () {
input.removeEventListener('changeDate', spyChangeDate);
dp.hide();
});
it('is triggered when the selection is changed', function () {
// by setDate()
dp.setDate('2/14/2020');
expect(spyChangeDate.calledOnce, 'to be true');
// triggered after the picker element is updated
expect(getCellIndices(pickerSnapshot.cells, '.selected'), 'to equal', [19]);
spyChangeDate.resetHistory();
// by update()
input.value = '4/22/2020';
dp.update();
expect(spyChangeDate.calledOnce, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'April 2020');
expect(getCellIndices(pickerSnapshot.cells, '.selected'), 'to equal', [24]);
spyChangeDate.resetHistory();
// by clicking on a day cell
getCells(picker)[12].click();
expect(spyChangeDate.calledOnce, 'to be true');
expect(getCellIndices(pickerSnapshot.cells, '.selected'), 'to equal', [12]);
spyChangeDate.resetHistory();
// by hitting enter in edit mode
dp.enterEditMode();
input.value = '2/4/2020';
simulant.fire(input, 'keydown', {key: 'Enter'});
expect(spyChangeDate.calledOnce, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'February 2020');
expect(getCellIndices(pickerSnapshot.cells, '.selected'), 'to equal', [9]);
spyChangeDate.resetHistory();
// by hitting enter when the picker is hidden
dp.hide();
input.value = '3/20/2020';
simulant.fire(input, 'keydown', {key: 'Enter'});
expect(spyChangeDate.calledOnce, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'March 2020');
expect(getCellIndices(pickerSnapshot.cells, '.selected'), 'to equal', [19]);
dp.setDate({clear: true});
});
it('is triggered when the selection is cleared', function () {
dp.setDate('2/14/2020');
spyChangeDate.resetHistory();
// by setDate()
dp.setDate({clear: true});
expect(spyChangeDate.calledOnce, 'to be true');
expect(getCellIndices(pickerSnapshot.cells, '.selected'), 'to be empty');
dp.setDate('2/14/2020');
spyChangeDate.resetHistory();
// by update()
input.value = '';
dp.update();
expect(spyChangeDate.calledOnce, 'to be true');
expect(getCellIndices(pickerSnapshot.cells, '.selected'), 'to be empty');
dp.setDate('2/14/2020');
spyChangeDate.resetHistory();
// by hitting enter in edit mode
dp.enterEditMode();
input.value = '';
simulant.fire(input, 'keydown', {key: 'Enter'});
expect(spyChangeDate.calledOnce, 'to be true');
expect(getCellIndices(pickerSnapshot.cells, '.selected'), 'to be empty');
dp.setDate('2/14/2020');
spyChangeDate.resetHistory();
// by hitting enter when the picker is hidden
dp.hide();
input.value = '';
simulant.fire(input, 'keydown', {key: 'Enter'});
expect(spyChangeDate.calledOnce, 'to be true');
expect(getCellIndices(pickerSnapshot.cells, '.selected'), 'to be empty');
});
it('is not triggered when trying to update with the current value', function () {
dp.setDate('2/14/2020');
spyChangeDate.resetHistory();
// by setDate()
dp.setDate('2/14/2020');
expect(spyChangeDate.called, 'to be false');
// by update()
dp.update();
expect(spyChangeDate.called, 'to be false');
// by clicking on a day cell
getCells(picker)[19].click();
expect(spyChangeDate.called, 'to be false');
// by hitting enter in edit mode
dp.enterEditMode();
simulant.fire(input, 'keydown', {key: 'Enter'});
expect(spyChangeDate.called, 'to be false');
// by hitting enter when the picker is hidden
dp.hide();
simulant.fire(input, 'keydown', {key: 'Enter'});
expect(spyChangeDate.called, 'to be false');
dp.setDate({clear: true});
});
});
describe('changeMonth', function () {
let spyChangeMonth;
let pickerSnapshot;
beforeEach(function () {
dp.show();
spyChangeMonth = sinon.spy(() => {
const snapshot = dp.picker.element.cloneNode(true);
pickerSnapshot = {
viewSwitchLabel: getViewSwitch(snapshot).textContent,
cells: getCells(snapshot),
};
});
input.addEventListener('changeMonth', spyChangeMonth);
});
afterEach(function () {
input.removeEventListener('changeMonth', spyChangeMonth);
dp.hide();
});
it('is triggered when prevButton or nextButton is clicked on days view', function () {
const [prevButton, nextButton] = getParts(picker, ['.prev-button', '.next-button']);
prevButton.click();
expect(spyChangeMonth.calledOnce, 'to be true');
// triggered after the picker element is updated
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'January 2020');
nextButton.click();
expect(spyChangeMonth.calledTwice, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'February 2020');
spyChangeMonth.resetHistory();
// months view
viewSwitch.click();
prevButton.click();
expect(spyChangeMonth.called, 'to be false');
nextButton.click();
expect(spyChangeMonth.called, 'to be false');
// years view
viewSwitch.click();
prevButton.click();
expect(spyChangeMonth.called, 'to be false');
nextButton.click();
expect(spyChangeMonth.called, 'to be false');
// decades view
viewSwitch.click();
prevButton.click();
expect(spyChangeMonth.called, 'to be false');
nextButton.click();
expect(spyChangeMonth.called, 'to be false');
});
it('is triggered when ctrl + arrow lett/right is pressed on days view', function () {
simulant.fire(input, 'keydown', {key: 'ArrowLeft'});
expect(spyChangeMonth.called, 'to be false');
simulant.fire(input, 'keydown', {key: 'ArrowRight'});
expect(spyChangeMonth.called, 'to be false');
simulant.fire(input, 'keydown', {key: 'ArrowLeft', ctrlKey: true});
expect(spyChangeMonth.calledOnce, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'January 2020');
simulant.fire(input, 'keydown', {key: 'ArrowRight', ctrlKey: true});
expect(spyChangeMonth.calledTwice, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'February 2020');
spyChangeMonth.resetHistory();
// months view
viewSwitch.click();
simulant.fire(input, 'keydown', {key: 'ArrowLeft', ctrlKey: true});
expect(spyChangeMonth.called, 'to be false');
simulant.fire(input, 'keydown', {key: 'ArrowRight', ctrlKey: true});
expect(spyChangeMonth.called, 'to be false');
// years view
viewSwitch.click();
simulant.fire(input, 'keydown', {key: 'ArrowLeft', ctrlKey: true});
expect(spyChangeMonth.called, 'to be false');
simulant.fire(input, 'keydown', {key: 'ArrowRight', ctrlKey: true});
expect(spyChangeMonth.called, 'to be false');
// decades view
viewSwitch.click();
simulant.fire(input, 'keydown', {key: 'ArrowLeft', ctrlKey: true});
expect(spyChangeMonth.called, 'to be false');
simulant.fire(input, 'keydown', {key: 'ArrowRight', ctrlKey: true});
expect(spyChangeMonth.called, 'to be false');
});
it('is triggered when a previous or next month\'s day is clicked', function () {
getCells(picker)[19].click();
expect(spyChangeMonth.called, 'to be false');
getCells(picker)[2].click();
expect(spyChangeMonth.calledOnce, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'January 2020');
getCells(picker)[40].click();
expect(spyChangeMonth.calledTwice, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'February 2020');
dp.setDate({clear: true});
});
it('is triggered when view date is moved to a previous or next month\'s day by arrow keys', function () {
// move to 2/1/2020
simulant.fire(input, 'keydown', {key: 'ArrowRight'});
simulant.fire(input, 'keydown', {key: 'ArrowUp'});
simulant.fire(input, 'keydown', {key: 'ArrowUp'});
// go to 1/31
simulant.fire(input, 'keydown', {key: 'ArrowLeft'});
expect(spyChangeMonth.calledOnce, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'January 2020');
// go back to 2/1
simulant.fire(input, 'keydown', {key: 'ArrowRight'});
expect(spyChangeMonth.calledTwice, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'February 2020');
spyChangeMonth.resetHistory();
// move to 2/3/2020
simulant.fire(input, 'keydown', {key: 'ArrowRight'});
simulant.fire(input, 'keydown', {key: 'ArrowRight'});
// go to 1/27
simulant.fire(input, 'keydown', {key: 'ArrowUp'});
expect(spyChangeMonth.calledOnce, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'January 2020');
// go back to 2/3
simulant.fire(input, 'keydown', {key: 'ArrowDown'});
expect(spyChangeMonth.calledTwice, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'February 2020');
});
it('is triggered when a different month is selected on months view', function () {
viewSwitch.click();
getCells(picker)[1].click();
expect(spyChangeMonth.called, 'to be false');
viewSwitch.click();
getCells(picker)[2].click();
expect(spyChangeMonth.calledOnce, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'March 2020');
});
it('is triggered when moving month by arrow keys on months view', function () {
viewSwitch.click();
simulant.fire(input, 'keydown', {key: 'ArrowRight'});
expect(spyChangeMonth.callCount, 'to be', 1);
expect(getCellIndices(pickerSnapshot.cells, '.focused'), 'to equal', [2]);
simulant.fire(input, 'keydown', {key: 'ArrowLeft'});
expect(spyChangeMonth.callCount, 'to be', 2);
expect(getCellIndices(pickerSnapshot.cells, '.focused'), 'to equal', [1]);
simulant.fire(input, 'keydown', {key: 'ArrowDown'});
expect(spyChangeMonth.callCount, 'to be', 3);
expect(getCellIndices(pickerSnapshot.cells, '.focused'), 'to equal', [5]);
simulant.fire(input, 'keydown', {key: 'ArrowUp'});
expect(spyChangeMonth.callCount, 'to be', 4);
expect(getCellIndices(pickerSnapshot.cells, '.focused'), 'to equal', [1]);
});
it('is triggered when the selection is updated to a different month by API calls', function () {
dp.setDate('2/22/2020');
expect(spyChangeMonth.called, 'to be false');
dp.setDate('4/22/2020');
expect(spyChangeMonth.calledOnce, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'April 2020');
input.value = '3/14/2020';
dp.update();
expect(spyChangeMonth.calledTwice, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'March 2020');
});
it('is triggered when the selection is cleard from a date of a different month from default view date', function () {
dp.setDate('2/22/2020');
spyChangeMonth.resetHistory();
dp.setDate({clear: true});
expect(spyChangeMonth.called, 'to be false');
dp.setDate('4/22/2020');
spyChangeMonth.resetHistory();
dp.setDate({clear: true});
expect(spyChangeMonth.calledOnce, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'February 2020');
dp.setDate('4/22/2020');
spyChangeMonth.resetHistory();
input.value = '';
dp.update();
expect(spyChangeMonth.calledOnce, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'February 2020');
dp.setDate('4/22/2020');
spyChangeMonth.resetHistory();
dp.enterEditMode();
input.value = '';
simulant.fire(input, 'keydown', {key: 'Enter'});
expect(spyChangeMonth.calledOnce, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'February 2020');
});
it('is triggered before changeDate when triggered on change of the selection', function () {
const spyChangeDate = sinon.spy();
input.addEventListener('changeDate', spyChangeDate);
dp.setDate('4/22/2020');
expect(spyChangeDate.called, 'to be true');
expect(spyChangeMonth.called, 'to be true');
expect(spyChangeMonth.calledBefore(spyChangeDate), 'to be true');
input.removeEventListener('changeDate', spyChangeDate);
dp.setDate({clear: true});
});
it('is triggered when view is reset from different month from default view date on hide', function () {
picker.querySelector('.next-button').click();
spyChangeMonth.resetHistory();
dp.hide();
expect(spyChangeMonth.calledOnce, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'February 2020');
});
it('is not triggered when view date is changed to the same month of different year', function () {
viewSwitch.click();
viewSwitch.click();
// years view
getCells(picker)[3].click();
expect(spyChangeMonth.called, 'to be false');
// months view
getCells(picker)[1].click();
expect(spyChangeMonth.called, 'to be false');
viewSwitch.click();
viewSwitch.click();
// years view
simulant.fire(input, 'keydown', {key: 'ArrowLeft'});
simulant.fire(input, 'keydown', {key: 'Enter'});
expect(spyChangeMonth.called, 'to be false');
// months view
simulant.fire(input, 'keydown', {key: 'Enter'});
expect(spyChangeMonth.called, 'to be false');
});
});
describe('changeYear', function () {
let spyChangeYear;
let pickerSnapshot;
beforeEach(function () {
dp.show();
spyChangeYear = sinon.spy(() => {
const snapshot = dp.picker.element.cloneNode(true);
pickerSnapshot = {
viewSwitchLabel: getViewSwitch(snapshot).textContent,
cells: getCells(snapshot),
};
});
input.addEventListener('changeYear', spyChangeYear);
});
afterEach(function () {
input.removeEventListener('changeYear', spyChangeYear);
dp.hide();
});
it('is triggered when prevButton on January on days view or nextButton on December is clicked', function () {
const [prevButton, nextButton] = getParts(picker, ['.prev-button', '.next-button']);
// move to 1/15
prevButton.click();
spyChangeYear.resetHistory();
prevButton.click();
expect(spyChangeYear.calledOnce, 'to be true');
// triggered after the picker element is updated
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'December 2019');
nextButton.click();
expect(spyChangeYear.calledTwice, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'January 2020');
});
it('is triggered when ctrl + arrow lett is pressed on January on days view or right on December', function () {
// move to 1/15
picker.querySelector('.prev-button').click();
spyChangeYear.resetHistory();
simulant.fire(input, 'keydown', {key: 'ArrowLeft'});
expect(spyChangeYear.called, 'to be false');
simulant.fire(input, 'keydown', {key: 'ArrowRight'});
expect(spyChangeYear.called, 'to be false');
simulant.fire(input, 'keydown', {key: 'ArrowLeft', ctrlKey: true});
expect(spyChangeYear.calledOnce, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'December 2019');
simulant.fire(input, 'keydown', {key: 'ArrowRight', ctrlKey: true});
expect(spyChangeYear.calledTwice, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'January 2020');
});
it('is triggered when a previous month\'s day on January or a next month\'s on December is clicked', function () {
// move to 1/15
picker.querySelector('.prev-button').click();
spyChangeYear.resetHistory();
getCells(picker)[19].click();
expect(spyChangeYear.called, 'to be false');
getCells(picker)[2].click();
expect(spyChangeYear.calledOnce, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'December 2019');
getCells(picker)[40].click();
expect(spyChangeYear.calledTwice, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'January 2020');
dp.setDate({clear: true});
});
it('is triggered when prevButton or nextButton is clicked on months view', function () {
const [prevButton, nextButton] = getParts(picker, ['.prev-button', '.next-button']);
viewSwitch.click();
prevButton.click();
expect(spyChangeYear.calledOnce, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', '2019');
nextButton.click();
expect(spyChangeYear.calledTwice, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', '2020');
});
it('is triggered when view month is moved to a previous or next year\'s by arrow keys', function () {
viewSwitch.click();
// move to january
simulant.fire(input, 'keydown', {key: 'ArrowLeft'});
// go to last year's December
simulant.fire(input, 'keydown', {key: 'ArrowLeft'});
expect(spyChangeYear.calledOnce, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', '2019');
// go back to January
simulant.fire(input, 'keydown', {key: 'ArrowRight'});
expect(spyChangeYear.calledTwice, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', '2020');
spyChangeYear.resetHistory();
// go to last year's September
simulant.fire(input, 'keydown', {key: 'ArrowUp'});
expect(spyChangeYear.calledOnce, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', '2019');
// go back to January
simulant.fire(input, 'keydown', {key: 'ArrowDown'});
expect(spyChangeYear.calledTwice, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', '2020');
});
it('is triggered when a different year/decade is selected on years/decades view', function () {
viewSwitch.click();
viewSwitch.click();
viewSwitch.click();
// decades view
getCells(picker)[0].click();
expect(spyChangeYear.calledOnce, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', '1990-1999');
// years view
getCells(picker)[2].click();
expect(spyChangeYear.calledTwice, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', '1991');
});
it('is triggered when moving year/decade by arrow keys on years/decades view', function () {
viewSwitch.click();
viewSwitch.click();
simulant.fire(input, 'keydown', {key: 'ArrowRight'});
expect(spyChangeYear.callCount, 'to be', 1);
expect(getCellIndices(pickerSnapshot.cells, '.focused'), 'to equal', [2]);
simulant.fire(input, 'keydown', {key: 'ArrowLeft'});
expect(spyChangeYear.callCount, 'to be', 2);
expect(getCellIndices(pickerSnapshot.cells, '.focused'), 'to equal', [1]);
simulant.fire(input, 'keydown', {key: 'ArrowDown'});
expect(spyChangeYear.callCount, 'to be', 3);
expect(getCellIndices(pickerSnapshot.cells, '.focused'), 'to equal', [5]);
simulant.fire(input, 'keydown', {key: 'ArrowUp'});
expect(spyChangeYear.callCount, 'to be', 4);
expect(getCellIndices(pickerSnapshot.cells, '.focused'), 'to equal', [1]);
viewSwitch.click();
spyChangeYear.resetHistory();
simulant.fire(input, 'keydown', {key: 'ArrowRight'});
expect(spyChangeYear.callCount, 'to be', 1);
expect(getCellIndices(pickerSnapshot.cells, '.focused'), 'to equal', [4]);
simulant.fire(input, 'keydown', {key: 'ArrowLeft'});
expect(spyChangeYear.callCount, 'to be', 2);
expect(getCellIndices(pickerSnapshot.cells, '.focused'), 'to equal', [3]);
simulant.fire(input, 'keydown', {key: 'ArrowDown'});
expect(spyChangeYear.callCount, 'to be', 3);
expect(getCellIndices(pickerSnapshot.cells, '.focused'), 'to equal', [7]);
simulant.fire(input, 'keydown', {key: 'ArrowUp'});
expect(spyChangeYear.callCount, 'to be', 4);
expect(getCellIndices(pickerSnapshot.cells, '.focused'), 'to equal', [3]);
});
it('is triggered when the selection is updated to a different year by API calls', function () {
dp.setDate('2/22/2020');
expect(spyChangeYear.called, 'to be false');
dp.setDate('4/22/2022');
expect(spyChangeYear.calledOnce, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'April 2022');
input.value = '3/14/2018';
dp.update();
expect(spyChangeYear.calledTwice, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'March 2018');
});
it('is triggered when the selection is cleard from a date of a different year from default view date', function () {
dp.setDate('2/22/2020');
spyChangeYear.resetHistory();
dp.setDate({clear: true});
expect(spyChangeYear.called, 'to be false');
dp.setDate('4/22/2022');
spyChangeYear.resetHistory();
dp.setDate({clear: true});
expect(spyChangeYear.calledOnce, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'February 2020');
dp.setDate('4/22/2022');
spyChangeYear.resetHistory();
input.value = '';
dp.update();
expect(spyChangeYear.calledOnce, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'February 2020');
dp.setDate('4/22/2022');
spyChangeYear.resetHistory();
dp.enterEditMode();
input.value = '';
simulant.fire(input, 'keydown', {key: 'Enter'});
expect(spyChangeYear.calledOnce, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'February 2020');
});
it('is triggered before changeDate/Month when triggered on change of the selection', function () {
const spyChangeDate = sinon.spy();
const spyChangeMonth = sinon.spy();
input.addEventListener('changeDate', spyChangeDate);
input.addEventListener('changeMonth', spyChangeMonth);
dp.setDate('4/22/2022');
expect(spyChangeDate.called, 'to be true');
expect(spyChangeMonth.called, 'to be true');
expect(spyChangeYear.called, 'to be true');
expect(spyChangeYear.calledBefore(spyChangeDate), 'to be true');
expect(spyChangeYear.calledBefore(spyChangeMonth), 'to be true');
input.removeEventListener('changeDate', spyChangeDate);
input.removeEventListener('changeDate', spyChangeMonth);
dp.setDate({clear: true});
});
it('is triggered when view is reset from different year from default view date on hide', function () {
picker.querySelector('.prev-button').click();
picker.querySelector('.prev-button').click();
spyChangeYear.resetHistory();
dp.hide();
expect(spyChangeYear.calledOnce, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'February 2020');
});
it('is not triggered when view date is changed to the same year of different decades/century', function () {
viewSwitch.click();
viewSwitch.click();
viewSwitch.click();
// decades view
getCells(picker)[3].click();
expect(spyChangeYear.called, 'to be false');
// years view
getCells(picker)[1].click();
expect(spyChangeYear.called, 'to be false');
viewSwitch.click();
viewSwitch.click();
// decades view
simulant.fire(input, 'keydown', {key: 'Enter'});
expect(spyChangeYear.called, 'to be false');
// months view
simulant.fire(input, 'keydown', {key: 'Enter'});
expect(spyChangeYear.called, 'to be false');
});
});
describe('changeView', function () {
let spyChangeView;
let pickerSnapshot;
beforeEach(function () {
dp.show();
spyChangeView = sinon.spy(() => {
const snapshot = dp.picker.element.cloneNode(true);
pickerSnapshot = {
viewSwitchLabel: getViewSwitch(snapshot).textContent,
};
});
input.addEventListener('changeView', spyChangeView);
});
afterEach(function () {
input.removeEventListener('changeView', spyChangeView);
dp.hide();
});
it('is triggered when view is changed by clicking view switch', function () {
viewSwitch.click();
expect(spyChangeView.calledOnce, 'to be true');
// triggered after the picker element is updated
expect(pickerSnapshot.viewSwitchLabel, 'to be', '2020');
// on months view
viewSwitch.click();
expect(spyChangeView.calledTwice, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', '2020-2029');
// on years view
viewSwitch.click();
expect(spyChangeView.calledThrice, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', '2000-2090');
// on decades view
viewSwitch.click();
expect(spyChangeView.calledThrice, 'to be true');
});
it('is triggered when view is changed by pressing ctrl + arrow up', function () {
simulant.fire(input, 'keydown', {key: 'ArrowUp'});
expect(spyChangeView.called, 'to be false');
simulant.fire(input, 'keydown', {key: 'ArrowUp', ctrlKey: true});
expect(spyChangeView.calledOnce, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', '2020');
// on months view
simulant.fire(input, 'keydown', {key: 'ArrowUp', ctrlKey: true});
expect(spyChangeView.calledTwice, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', '2020-2029');
// on years view
simulant.fire(input, 'keydown', {key: 'ArrowUp', ctrlKey: true});
expect(spyChangeView.calledThrice, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', '2000-2090');
// on decades view
simulant.fire(input, 'keydown', {key: 'ArrowUp', ctrlKey: true});
expect(spyChangeView.calledThrice, 'to be true');
});
it('is triggered when view is changed by seleting a decade/year/month on decades/years/months view', function () {
viewSwitch.click();
viewSwitch.click();
viewSwitch.click();
spyChangeView.resetHistory();
// on decades view
getCells(picker)[2].click();
expect(spyChangeView.calledOnce, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', '2010-2019');
// on years view
getCells(picker)[2].click();
expect(spyChangeView.calledTwice, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', '2011');
// on months view
getCells(picker)[2].click();
expect(spyChangeView.calledThrice, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'March 2011');
// on days view
getCells(picker)[12].click();
expect(spyChangeView.calledThrice, 'to be true');
viewSwitch.click();
viewSwitch.click();
viewSwitch.click();
spyChangeView.resetHistory();
// on decades view
simulant.fire(input, 'keydown', {key: 'Enter'});
expect(spyChangeView.calledOnce, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', '2010-2019');
// on years view
simulant.fire(input, 'keydown', {key: 'Enter'});
expect(spyChangeView.calledTwice, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', '2011');
// on months view
simulant.fire(input, 'keydown', {key: 'Enter'});
expect(spyChangeView.calledThrice, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'March 2011');
// on days view
simulant.fire(input, 'keydown', {key: 'Enter'});
expect(spyChangeView.calledThrice, 'to be true');
simulant.fire(input, 'keydown', {key: 'Enter'});
expect(spyChangeView.calledThrice, 'to be true');
dp.setDate({clear: true});
});
it('is triggered before changeDate/Month/Year when triggered on change of the selection', function () {
const spyChangeDate = sinon.spy();
const spyChangeMonth = sinon.spy();
const spyChangeYear = sinon.spy();
input.addEventListener('changeDate', spyChangeDate);
input.addEventListener('changeMonth', spyChangeMonth);
input.addEventListener('changeYear', spyChangeYear);
viewSwitch.click();
dp.setDate('4/22/2022');
expect(spyChangeDate.called, 'to be true');
expect(spyChangeMonth.called, 'to be true');
expect(spyChangeYear.called, 'to be true');
expect(spyChangeView.calledBefore(spyChangeDate), 'to be true');
expect(spyChangeView.calledBefore(spyChangeMonth), 'to be true');
expect(spyChangeView.calledBefore(spyChangeYear), 'to be true');
input.removeEventListener('changeDate', spyChangeDate);
input.removeEventListener('changeDate', spyChangeMonth);
input.removeEventListener('changeYear', spyChangeYear);
dp.setDate({clear: true});
});
it('is triggered when view is reset on hide', function () {
viewSwitch.click();
spyChangeView.resetHistory();
dp.hide();
expect(spyChangeView.calledOnce, 'to be true');
expect(pickerSnapshot.viewSwitchLabel, 'to be', 'February 2020');
});
});
describe('show', function () {
let spyShow;
beforeEach(function () {
dp.show();
spyShow = sinon.spy();
input.addEventListener('show', spyShow);
});
afterEach(function () {
input.removeEventListener('show', spyShow);
dp.hide();
});
it('is triggered when the picker becomes visible', function () {
// not triggered if already shown
dp.show();
expect(spyShow.called, 'to be false');
spyShow.resetHistory();
dp.hide();
// by API call
dp.show();
expect(spyShow.called, 'to be true');
spyShow.resetHistory();
dp.hide();
input.blur();
// by getting focus
input.focus();
expect(spyShow.called, 'to be true');
spyShow.resetHistory();
// by toggling picker's display by API call
dp.toggle(); // hiding
expect(spyShow.called, 'to be false');
dp.toggle(); // showing
expect(spyShow.called, 'to be true');
spyShow.resetHistory();
// by toggling picker's display by Esc key
simulant.fire(input, 'keydown', {key: 'Escape'}); // hiding
expect(spyShow.called, 'to be false');
simulant.fire(input, 'keydown', {key: 'Escape'}); // showing
expect(spyShow.called, 'to be true');
});
});
describe('hide', function () {
let spyHide;
beforeEach(function () {
dp.show();
spyHide = sinon.spy();
input.addEventListener('hide', spyHide);
});
afterEach(function () {
input.removeEventListener('hide', spyHide);
dp.hide();
});
it('is triggered when the picker becomes hidden', function () {
// by API call
dp.hide();
expect(spyHide.called, 'to be true');
spyHide.resetHistory();
dp.show();
// by clicking outside
simulant.fire(testContainer, 'mousedown');
input.blur();
expect(spyHide.called, 'to be true');
spyHide.resetHistory();
input.focus();
// by pressing tab key
simulant.fire(input, 'keydown', {key: 'Tab'});
input.blur();
expect(spyHide.called, 'to be true');
spyHide.resetHistory();
// by toggling picker's display by API call
dp.toggle(); // showing
expect(spyHide.called, 'to be false');
dp.toggle(); // hiding
expect(spyHide.called, 'to be true');
spyHide.resetHistory();
// by toggling picker's display by Esc key
simulant.fire(input, 'keydown', {key: 'Escape'}); // showing
expect(spyHide.called, 'to be false');
simulant.fire(input, 'keydown', {key: 'Escape'}); // hiding
expect(spyHide.called, 'to be true');
});
});
describe('event object', function () {
const stubChangeDate = (ev) => {
eventObj = ev;
};
let eventObj;
before(function () {
input.addEventListener('changeDate', stubChangeDate);
});
after(function () {
input.removeEventListener('changeDate', stubChangeDate);
});
beforeEach(function () {
dp.setDate('2/14/2020');
});
afterEach(function () {
dp.setDate({clear: true});
eventObj = undefined;
});
it('is a custom event object', function () {
expect(eventObj, 'to be a', CustomEvent);
});
it('has the result of getDate() in detail.date', function () {
expect(eventObj.detail.date, 'to equal', dp.getDate());
});
it('has a date object of view date in detail.viewDate', function () {
expect(eventObj.detail.viewDate, 'to be a date');
expect(eventObj.detail.viewDate.getTime(), 'to be', dateValue(2020, 1, 14));
});
it('has view mode of current view in detail.viewId', function () {
expect(eventObj.detail.viewId, 'to be', 0);
});
it('has the Datepicker instance in detail.datepicker', function () {
expect(eventObj.detail.datepicker, 'to be', dp);
});
it('bubbles', function () {
expect(eventObj.bubbles, 'to be true');
const listener = sinon.spy();
document.body.addEventListener('changeDate', listener);
dp.setDate('4/22/2020');
expect(listener.called, 'to be true');
const event = listener.args[0][0];
expect(event.detail.date.getTime(), 'to be', dateValue(2020, 3, 22));
document.body.removeEventListener('changeDate', listener);
});
it('is cancellable', function () {
expect(eventObj.cancelable, 'to be true');
expect(eventObj.defaultPrevented, 'to be false');
eventObj.preventDefault();
expect(eventObj.defaultPrevented, 'to be true');
});
});
});