11import { elementUpdated , expect , fixture , html } from '@open-wc/testing' ;
2+ import { spy } from 'sinon' ;
23import IgcCalendarComponent from '../calendar/calendar.js' ;
4+ import { CalendarDay } from '../calendar/model.js' ;
35import { defineComponents } from '../common/definitions/defineComponents.js' ;
46import IgcDateTimeInputComponent from '../date-time-input/date-time-input.js' ;
57import 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} ) ;
0 commit comments