@@ -185,4 +185,109 @@ describe("DatePicker", () => {
185185 expect ( onChange ) . toHaveBeenCalledWith ( expectedDate ) ;
186186 } ) ;
187187 } ) ;
188+
189+ describe ( "Time Select Only with openToDate" , ( ) => {
190+ it ( "should use openToDate as the base date when selecting time with showTimeSelectOnly and selected is null" , ( ) => {
191+ const onChange = jest . fn ( ) ;
192+ const openToDate = new Date ( "2025-11-01T00:00:00" ) ;
193+
194+ const { container } = render (
195+ < DatePicker
196+ selected = { null }
197+ openToDate = { openToDate }
198+ onChange = { onChange }
199+ showTimeSelect
200+ showTimeSelectOnly
201+ /> ,
202+ ) ;
203+
204+ const input = safeQuerySelector ( container , "input" ) ;
205+ fireEvent . click ( input ) ;
206+
207+ // Find and click a time option (e.g., 09:00)
208+ const timeListItems = container . querySelectorAll (
209+ ".react-datepicker__time-list-item" ,
210+ ) ;
211+ expect ( timeListItems . length ) . toBeGreaterThan ( 0 ) ;
212+
213+ // Click on a time option
214+ fireEvent . click ( timeListItems [ 0 ] ! ) ;
215+
216+ expect ( onChange ) . toHaveBeenCalled ( ) ;
217+ const selectedDate = onChange . mock . calls [ 0 ] [ 0 ] as Date ;
218+
219+ // Verify the date part comes from openToDate
220+ expect ( selectedDate . getFullYear ( ) ) . toBe ( 2025 ) ;
221+ expect ( selectedDate . getMonth ( ) ) . toBe ( 10 ) ; // November is month 10 (0-indexed)
222+ expect ( selectedDate . getDate ( ) ) . toBe ( 1 ) ;
223+ } ) ;
224+
225+ it ( "should use current date when showTimeSelectOnly is true and neither selected nor openToDate is provided" , ( ) => {
226+ const onChange = jest . fn ( ) ;
227+ const today = new Date ( ) ;
228+
229+ const { container } = render (
230+ < DatePicker
231+ selected = { null }
232+ onChange = { onChange }
233+ showTimeSelect
234+ showTimeSelectOnly
235+ /> ,
236+ ) ;
237+
238+ const input = safeQuerySelector ( container , "input" ) ;
239+ fireEvent . click ( input ) ;
240+
241+ const timeListItems = container . querySelectorAll (
242+ ".react-datepicker__time-list-item" ,
243+ ) ;
244+ expect ( timeListItems . length ) . toBeGreaterThan ( 0 ) ;
245+
246+ fireEvent . click ( timeListItems [ 0 ] ! ) ;
247+
248+ expect ( onChange ) . toHaveBeenCalled ( ) ;
249+ const selectedDate = onChange . mock . calls [ 0 ] [ 0 ] as Date ;
250+
251+ // Verify the date part comes from today
252+ expect ( selectedDate . getFullYear ( ) ) . toBe ( today . getFullYear ( ) ) ;
253+ expect ( selectedDate . getMonth ( ) ) . toBe ( today . getMonth ( ) ) ;
254+ expect ( selectedDate . getDate ( ) ) . toBe ( today . getDate ( ) ) ;
255+ } ) ;
256+
257+ it ( "should use openToDate for showTimeInput when selected is null" , ( ) => {
258+ const onChange = jest . fn ( ) ;
259+ const openToDate = new Date ( "2025-11-01T00:00:00" ) ;
260+
261+ const { container } = render (
262+ < DatePicker
263+ selected = { null }
264+ openToDate = { openToDate }
265+ onChange = { onChange }
266+ showTimeInput
267+ /> ,
268+ ) ;
269+
270+ const input = safeQuerySelector ( container , "input" ) ;
271+ fireEvent . focus ( input ) ;
272+
273+ const timeInput = safeQuerySelector < HTMLInputElement > (
274+ container ,
275+ 'input[type="time"].react-datepicker-time__input' ,
276+ ) ;
277+
278+ fireEvent . change ( timeInput , {
279+ target : { value : "14:30" } ,
280+ } ) ;
281+
282+ expect ( onChange ) . toHaveBeenCalled ( ) ;
283+ const selectedDate = onChange . mock . calls [ 0 ] [ 0 ] as Date ;
284+
285+ // Verify the date part comes from openToDate
286+ expect ( selectedDate . getFullYear ( ) ) . toBe ( 2025 ) ;
287+ expect ( selectedDate . getMonth ( ) ) . toBe ( 10 ) ; // November
288+ expect ( selectedDate . getDate ( ) ) . toBe ( 1 ) ;
289+ expect ( selectedDate . getHours ( ) ) . toBe ( 14 ) ;
290+ expect ( selectedDate . getMinutes ( ) ) . toBe ( 30 ) ;
291+ } ) ;
292+ } ) ;
188293} ) ;
0 commit comments