/**
* Copyright (c) HashiCorp, Inc.
* SPDX-License-Identifier: MPL-2.0
*/
import { module, test } from 'qunit';
import { setupRenderingTest } from 'ember-qunit';
import { render, click } from '@ember/test-helpers';
import sinon from 'sinon';
import hbs from 'htmlbars-inline-precompile';
import calendarDropdown from 'vault/tests/pages/components/calendar-widget';
import { ARRAY_OF_MONTHS } from 'core/utils/date-formatters';
import { subMonths, subYears } from 'date-fns';
import timestamp from 'core/utils/timestamp';
module('Integration | Component | calendar-widget', function (hooks) {
setupRenderingTest(hooks);
hooks.before(function () {
sinon.stub(timestamp, 'now').callsFake(() => new Date('2018-04-03T14:15:30'));
});
hooks.beforeEach(function () {
const CURRENT_DATE = timestamp.now();
this.set('currentDate', CURRENT_DATE);
this.set('calendarStartDate', subMonths(CURRENT_DATE, 12));
this.set('calendarEndDate', CURRENT_DATE);
this.set('startTimestamp', subMonths(CURRENT_DATE, 12).toISOString());
this.set('endTimestamp', CURRENT_DATE.toISOString());
this.set('handleClientActivityQuery', sinon.spy());
});
hooks.after(function () {
timestamp.now.restore();
});
test('it renders and disables correct months when start date is 12 months ago', async function (assert) {
assert.expect(14);
await render(hbs`
`);
assert
.dom('[data-test-calendar-widget-trigger]')
.hasText(`Apr 2017 - Apr 2018`, 'renders and formats start and end dates');
await calendarDropdown.openCalendar();
assert.ok(calendarDropdown.showsCalendar, 'renders the calendar component');
// assert months in current year are disabled/enabled correctly
const enabledMonths = ['January', 'February', 'March', 'April'];
ARRAY_OF_MONTHS.forEach(function (month) {
if (enabledMonths.includes(month)) {
assert
.dom(`[data-test-calendar-month="${month}"]`)
.doesNotHaveClass('is-readOnly', `${month} is enabled`);
} else {
assert.dom(`[data-test-calendar-month="${month}"]`).hasClass('is-readOnly', `${month} is read only`);
}
});
});
test('it renders and disables months before start timestamp', async function (assert) {
await render(hbs`
`);
await calendarDropdown.openCalendar();
assert.dom('[data-test-next-year]').isDisabled('Future year is disabled');
await calendarDropdown.clickPreviousYear();
assert
.dom('[data-test-display-year]')
.hasText(`${subYears(this.currentDate, 1).getFullYear()}`, 'shows the previous year');
assert.dom('[data-test-previous-year]').isDisabled('disables previous year');
// assert months in previous year are disabled/enabled correctly
const disabledMonths = ['January', 'February', 'March'];
ARRAY_OF_MONTHS.forEach(function (month) {
if (disabledMonths.includes(month)) {
assert.dom(`[data-test-calendar-month="${month}"]`).hasClass('is-readOnly', `${month} is read only`);
} else {
assert
.dom(`[data-test-calendar-month="${month}"]`)
.doesNotHaveClass('is-readOnly', `${month} is enabled`);
}
});
});
test('it calls parent callback with correct arg when clicking "Current billing period"', async function (assert) {
await render(hbs`
`);
await calendarDropdown.menuToggle();
await calendarDropdown.clickCurrentBillingPeriod();
assert.propEqual(
this.handleClientActivityQuery.args[0][0],
{ dateType: 'reset' },
'it calls parent function with reset dateType'
);
});
test('it calls parent callback with correct arg when clicking "Current month"', async function (assert) {
await render(hbs`
`);
await calendarDropdown.menuToggle();
await calendarDropdown.clickCurrentMonth();
assert.propEqual(
this.handleClientActivityQuery.args[0][0],
{ dateType: 'currentMonth' },
'it calls parent function with currentMoth dateType'
);
});
test('it calls parent callback with correct arg when selecting a month', async function (assert) {
await render(hbs`
`);
await calendarDropdown.openCalendar();
await click(`[data-test-calendar-month="April"`);
assert.propEqual(
this.handleClientActivityQuery.lastCall.lastArg,
{
dateType: 'endDate',
monthIdx: 3,
monthName: 'April',
year: 2018,
},
'it calls parent function with end date (current) month/year'
);
await calendarDropdown.openCalendar();
await calendarDropdown.clickPreviousYear();
await click(`[data-test-calendar-month="March"]`);
assert.propEqual(
this.handleClientActivityQuery.lastCall.lastArg,
{
dateType: 'endDate',
monthIdx: 2,
monthName: 'March',
year: 2017,
},
'it calls parent function with selected start date month/year'
);
});
test('it disables correct months when start date 6 months ago', async function (assert) {
this.set('calendarStartDate', subMonths(this.currentDate, 6)); // Nov 3, 2017
this.set('startTimestamp', subMonths(this.currentDate, 6).toISOString());
await render(hbs`
`);
await calendarDropdown.openCalendar();
assert.dom('[data-test-next-year]').isDisabled('Future year is disabled');
// Check start year disables correct months
await calendarDropdown.clickPreviousYear();
assert.dom('[data-test-previous-year]').isDisabled('previous year is disabled');
const prevYearEnabled = ['October', 'November', 'December'];
ARRAY_OF_MONTHS.forEach(function (month) {
if (prevYearEnabled.includes(month)) {
assert
.dom(`[data-test-calendar-month="${month}"]`)
.doesNotHaveClass('is-readOnly', `${month} is enabled`);
} else {
assert.dom(`[data-test-calendar-month="${month}"]`).hasClass('is-readOnly', `${month} is read only`);
}
});
// Check end year disables correct months
await click('[data-test-next-year]');
const currYearEnabled = ['January', 'February', 'March', 'April'];
ARRAY_OF_MONTHS.forEach(function (month) {
if (currYearEnabled.includes(month)) {
assert
.dom(`[data-test-calendar-month="${month}"]`)
.doesNotHaveClass('is-readOnly', `${month} is enabled`);
} else {
assert.dom(`[data-test-calendar-month="${month}"]`).hasClass('is-readOnly', `${month} is read only`);
}
});
});
test('it disables correct months when start date 36 months ago', async function (assert) {
this.set('calendarStartDate', subMonths(this.currentDate, 36)); // April 3 2015
this.set('startTimestamp', subMonths(this.currentDate, 36).toISOString());
await render(hbs`
`);
await calendarDropdown.openCalendar();
assert.dom('[data-test-next-year]').isDisabled('Future year is disabled');
for (const year of [2017, 2016, 2015]) {
await calendarDropdown.clickPreviousYear();
assert.dom('[data-test-display-year]').hasText(year.toString());
}
assert.dom('[data-test-previous-year]').isDisabled('previous year is disabled');
assert.dom('[data-test-next-year]').isEnabled('next year is enabled');
assert.dom('.calendar-widget .is-readOnly').exists('Some months disabled');
const disabledMonths = ['January', 'February', 'March'];
ARRAY_OF_MONTHS.forEach(function (month) {
if (disabledMonths.includes(month)) {
assert.dom(`[data-test-calendar-month="${month}"]`).hasClass('is-readOnly', `${month} is read only`);
} else {
assert
.dom(`[data-test-calendar-month="${month}"]`)
.doesNotHaveClass('is-readOnly', `${month} is enabled`);
}
});
await click('[data-test-next-year]');
assert.dom('.calendar-widget .is-readOnly').doesNotExist('All months enabled for 2016');
await click('[data-test-next-year]');
assert.dom('.calendar-widget .is-readOnly').doesNotExist('All months enabled for 2017');
await click('[data-test-next-year]');
assert.dom('.calendar-widget .is-readOnly').exists('Some months disabled for 2018');
const enabledMonths = ['January', 'February', 'March', 'April'];
ARRAY_OF_MONTHS.forEach(function (month) {
if (enabledMonths.includes(month)) {
assert
.dom(`[data-test-calendar-month="${month}"]`)
.doesNotHaveClass('is-readOnly', `${month} is enabled`);
} else {
assert.dom(`[data-test-calendar-month="${month}"]`).hasClass('is-readOnly', `${month} is read only`);
}
});
});
});