Skip to content

Commit 92dcd27

Browse files
Ivan KitanovIvan Kitanov
authored andcommitted
Adding tests for calendar selection and date-range-util
1 parent d84413c commit 92dcd27

File tree

2 files changed

+145
-0
lines changed

2 files changed

+145
-0
lines changed

src/components/date-range-picker/date-range-picker.spec.ts

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { elementUpdated, expect, fixture, html } from '@open-wc/testing';
2+
import { spy } from 'sinon';
23
import IgcCalendarComponent from '../calendar/calendar.js';
4+
import { CalendarDay } from '../calendar/model.js';
35
import { defineComponents } from '../common/definitions/defineComponents.js';
46
import IgcDateTimeInputComponent from '../date-time-input/date-time-input.js';
57
import IgcDateRangePickerComponent from './date-range-picker.js';
@@ -10,6 +12,10 @@ describe('Date range picker', () => {
1012
let picker: IgcDateRangePickerComponent;
1113
let _dateTimeInput: IgcDateTimeInputComponent;
1214
let calendar: IgcCalendarComponent;
15+
const date_1 = new CalendarDay({ year: 2025, month: 2, date: 19 });
16+
const date_2 = date_1.set({ date: 22 });
17+
const date_1_str = date_1.native.toISOString();
18+
const date_2_str = date_2.native.toISOString();
1319

1420
beforeEach(async () => {
1521
picker = await fixture<IgcDateRangePickerComponent>(
@@ -122,4 +128,98 @@ describe('Date range picker', () => {
122128
expect(calendar.parentElement).to.equal(dialog);
123129
});
124130
});
131+
describe('Selection via the calendar', () => {
132+
it('should select a single date in dropdown mode and emit igcChange', async () => {
133+
const eventSpy = spy(picker, 'emitEvent');
134+
135+
picker.open = true;
136+
await elementUpdated(picker);
137+
138+
calendar.values = `${date_1_str}`;
139+
140+
expect(eventSpy).calledWith('igcChange');
141+
expect(picker.value?.length).to.equal(2);
142+
expect(picker.value?.[0]).to.deep.equal(date_1);
143+
expect(picker.value?.[1]).to.deep.equal(date_1);
144+
expect(
145+
picker.shadowRoot!.querySelector('igc-popover')?.hasAttribute('open')
146+
).to.equal(false);
147+
});
148+
149+
it('should select a range of dates in dropdown mode and emit igcChange', async () => {
150+
const eventSpy = spy(picker, 'emitEvent');
151+
152+
picker.open = true;
153+
await elementUpdated(picker);
154+
155+
calendar.values = `${date_1_str}, ${date_2_str}`;
156+
157+
expect(eventSpy).calledWith('igcChange');
158+
expect(picker.value?.length).to.equal(2);
159+
expect(picker.value?.[0]).to.deep.equal(date_1);
160+
expect(picker.value?.[1]).to.deep.equal(date_2);
161+
expect(
162+
picker.shadowRoot!.querySelector('igc-popover')?.hasAttribute('open')
163+
).to.equal(false);
164+
});
165+
166+
it('should select a range of dates in dialog mode and emit igcChange when done is clicked', async () => {
167+
const eventSpy = spy(picker, 'emitEvent');
168+
169+
picker.mode = 'dialog';
170+
await elementUpdated(picker);
171+
picker.open = true;
172+
await elementUpdated(picker);
173+
174+
calendar.values = `${date_1_str}, ${date_2_str}`;
175+
176+
expect(eventSpy).not.to.be.calledWith('igcChange');
177+
expect(
178+
picker.shadowRoot!.querySelector('igc-popover')?.hasAttribute('open')
179+
).to.equal(true);
180+
181+
const doneBtn = picker.shadowRoot!.querySelector(
182+
'igc-button[slot="footer"]:last-of-type'
183+
)!;
184+
doneBtn?.dispatchEvent(new MouseEvent('click', { bubbles: true }));
185+
186+
expect(eventSpy).calledWith('igcChange');
187+
expect(picker.value?.length).to.equal(2);
188+
expect(picker.value?.[0]).to.deep.equal(date_1);
189+
expect(picker.value?.[1]).to.deep.equal(date_2);
190+
expect(
191+
picker.shadowRoot!.querySelector('igc-popover')?.hasAttribute('open')
192+
).to.equal(false);
193+
});
194+
195+
it('should not emit igcChange when cancel is clicked and the value should be the initial value', async () => {
196+
const eventSpy = spy(picker, 'emitEvent');
197+
198+
picker.value;
199+
picker.mode = 'dialog';
200+
await elementUpdated(picker);
201+
picker.open = true;
202+
await elementUpdated(picker);
203+
204+
calendar.values = `${date_1_str}, ${date_2_str}`;
205+
206+
expect(eventSpy).not.to.be.calledWith('igcChange');
207+
expect(
208+
picker.shadowRoot!.querySelector('igc-popover')?.hasAttribute('open')
209+
).to.equal(true);
210+
211+
const cancelBtn = picker.shadowRoot!.querySelector(
212+
'igc-button[slot="footer"]'
213+
)!;
214+
cancelBtn?.dispatchEvent(new MouseEvent('click', { bubbles: true }));
215+
216+
expect(eventSpy).not.to.be.calledWith('igcChange');
217+
expect(picker.value?.length).to.equal(2);
218+
expect(picker.value?.[0]).to.deep.equal(date_1);
219+
expect(picker.value?.[1]).to.deep.equal(date_2);
220+
expect(
221+
picker.shadowRoot!.querySelector('igc-popover')?.hasAttribute('open')
222+
).to.equal(false);
223+
});
224+
});
125225
});
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import { expect } from '@open-wc/testing';
2+
import { selectDateRange } from './date-range-util.js';
3+
4+
describe('DateRangeUtil', () => {
5+
const today = new Date();
6+
today.setHours(0, 0, 0, 0);
7+
8+
it('should return the last 7 days', () => {
9+
const result: Date[] = selectDateRange('last7Days');
10+
expect(result[0]).to.deep.equal(
11+
new Date(today.getFullYear(), today.getMonth(), today.getDate() - 7)
12+
);
13+
expect(result[1]).to.deep.equal(today);
14+
});
15+
16+
it('should return the last 30 days', () => {
17+
const result: Date[] = selectDateRange('last30Days');
18+
expect(result[0]).to.deep.equal(
19+
new Date(today.getFullYear(), today.getMonth(), today.getDate() - 29)
20+
);
21+
expect(result[1]).to.deep.equal(today);
22+
});
23+
24+
it('should return the current month', () => {
25+
const result: Date[] = selectDateRange('currentMonth');
26+
expect(result[0]).to.deep.equal(
27+
new Date(today.getFullYear(), today.getMonth(), 1)
28+
);
29+
expect(result[1]).to.deep.equal(
30+
new Date(today.getFullYear(), today.getMonth() + 1, 0)
31+
);
32+
});
33+
34+
it('should return the year-to-date', () => {
35+
const result: Date[] = selectDateRange('yearToDate');
36+
expect(result[0]).to.deep.equal(new Date(today.getFullYear(), 0, 1));
37+
expect(result[1]).to.deep.equal(today);
38+
});
39+
40+
it('should throw an error for an invalid date range type', () => {
41+
expect(() => selectDateRange('invalidType' as any)).to.throw(
42+
'Invalid date range type'
43+
);
44+
});
45+
});

0 commit comments

Comments
 (0)