@@ -257,28 +257,6 @@ describe('DateRangePicker Component', () => {
257257 expect ( screen . getByTestId ( 'calendar-month-year' ) . textContent ) . toBe ( 'January 2025' ) ;
258258 } ) ;
259259
260- test ( 'resets to initial range when calendar is closed without selection' , ( ) => {
261- const initialDateRange = {
262- startDate : null ,
263- endDate : null
264- } ;
265-
266- render ( < DateRangePicker initialDateRange = { initialDateRange } /> ) ;
267-
268- // Open calendar
269- fireEvent . click ( screen . getByTestId ( 'date-range-display' ) ) ;
270-
271- // Select only start date
272- const startDateElement = screen . getAllByTestId ( 'calendar-day-10' ) ?. [ 0 ] ;
273- fireEvent . click ( startDateElement ) ;
274-
275- // Close calendar without selecting end date
276- fireEvent . click ( screen . getByTestId ( 'date-range-close-btn' ) ) ;
277-
278- // Date range should reset to initial
279- const dateRangeText = screen . getByTestId ( 'date-range-text' ) ;
280- expect ( dateRangeText . textContent ) . toBe ( 'MM/DD/YYYY - MM/DD/YYYY' ) ;
281- } ) ;
282260
283261 test ( 'handles selection when end date is before start date' , ( ) => {
284262 render ( < DateRangePicker onChange = { mockOnChange } /> ) ;
@@ -315,4 +293,254 @@ describe('DateRangePicker Component', () => {
315293 const dateRangePicker = screen . getByTestId ( 'date-range-picker' ) ;
316294 expect ( dateRangePicker ) . toHaveClass ( 'custom-class' ) ;
317295 } ) ;
296+
297+ // Additional tests to add to the existing test suite
298+
299+ test ( 'resets date range when clicking close button' , ( ) => {
300+ const initialDateRange = {
301+ startDate : new Date ( 2025 , 0 , 1 ) , // Jan 1, 2025
302+ endDate : new Date ( 2025 , 0 , 15 ) // Jan 15, 2025
303+ } ;
304+
305+ render ( < DateRangePicker initialDateRange = { initialDateRange } onChange = { mockOnChange } /> ) ;
306+
307+ // Open calendar
308+ fireEvent . click ( screen . getByTestId ( 'date-range-display' ) ) ;
309+
310+ // Click close button
311+ fireEvent . click ( screen . getByTestId ( 'close-icon' ) ) ;
312+
313+ // Check if onChange was called with null dates
314+ expect ( mockOnChange ) . toHaveBeenCalledWith ( {
315+ startDate : null ,
316+ endDate : null
317+ } ) ;
318+
319+ // Check if the display text was reset
320+ expect ( screen . getByTestId ( 'date-range-text' ) . textContent ) . toBe ( 'MM/DD/YYYY - MM/DD/YYYY' ) ;
321+ } ) ;
322+
323+ test ( 'navigates to previous and next month' , ( ) => {
324+ const initialDateRange = {
325+ startDate : new Date ( 2025 , 2 , 15 ) , // Mar 15, 2025
326+ endDate : new Date ( 2025 , 2 , 20 ) // Mar 20, 2025
327+ } ;
328+
329+ render ( < DateRangePicker initialDateRange = { initialDateRange } /> ) ;
330+
331+ // Open calendar
332+ fireEvent . click ( screen . getByTestId ( 'date-range-display' ) ) ;
333+
334+ // Initial month
335+ expect ( screen . getByTestId ( 'calendar-month-year' ) . textContent ) . toBe ( 'March 2025' ) ;
336+
337+ // Go to next month
338+ fireEvent . click ( screen . getByTestId ( 'angle-right-icon' ) ) ;
339+ expect ( screen . getByTestId ( 'calendar-month-year' ) . textContent ) . toBe ( 'April 2025' ) ;
340+
341+ // Go to previous month
342+ fireEvent . click ( screen . getByTestId ( 'angle-left-icon' ) ) ;
343+ expect ( screen . getByTestId ( 'calendar-month-year' ) . textContent ) . toBe ( 'March 2025' ) ;
344+ } ) ;
345+
346+ test ( 'completes selection when clicking outside with only start date selected' , async ( ) => {
347+ render ( < DateRangePicker onChange = { mockOnChange } /> ) ;
348+
349+ // Open calendar
350+ fireEvent . click ( screen . getByTestId ( 'date-range-display' ) ) ;
351+
352+ // Select only start date (15th of current month)
353+ const startDateElement = screen . getByTestId ( 'calendar-day-15' ) ;
354+ fireEvent . click ( startDateElement ) ;
355+
356+ // Simulate clicking outside
357+ fireEvent . mouseDown ( document . body ) ;
358+
359+ // Check if onChange was called with start and end date being the same
360+ await waitFor ( ( ) => {
361+ expect ( mockOnChange ) . toHaveBeenCalledTimes ( 1 ) ;
362+ const onChangeCalls = mockOnChange . mock . calls [ 0 ] [ 0 ] ;
363+
364+ // Start and end date should be the same (15th)
365+ expect ( onChangeCalls . startDate . getDate ( ) ) . toBe ( 15 ) ;
366+ expect ( onChangeCalls . endDate . getDate ( ) ) . toBe ( 15 ) ;
367+ } ) ;
368+ } ) ;
369+
370+
371+ test ( 'renders correct weekday headers' , ( ) => {
372+ render ( < DateRangePicker /> ) ;
373+
374+ // Open calendar
375+ fireEvent . click ( screen . getByTestId ( 'date-range-display' ) ) ;
376+
377+ // Check if all weekday headers are present
378+ const weekdays = [ 'MO' , 'TU' , 'WE' , 'TH' , 'FR' , 'SA' , 'SU' ] ;
379+ const weekdayElements = screen . getByTestId ( 'calendar-days-header' ) . children ;
380+
381+ expect ( weekdayElements . length ) . toBe ( 7 ) ;
382+
383+ for ( let i = 0 ; i < weekdays . length ; i ++ ) {
384+ expect ( weekdayElements [ i ] . textContent ) . toBe ( weekdays [ i ] ) ;
385+ }
386+ } ) ;
387+
388+ test ( 'generates correct number of days in calendar' , ( ) => {
389+ render ( < DateRangePicker /> ) ;
390+
391+ // Open calendar
392+ fireEvent . click ( screen . getByTestId ( 'date-range-display' ) ) ;
393+
394+ // Calendar should have 6 weeks (42 days)
395+ const daysContainer = screen . getByTestId ( 'calendar-days' ) ;
396+ expect ( daysContainer . children . length ) . toBe ( 42 ) ;
397+ } ) ;
398+
399+ test ( 'handles space key for date selection' , ( ) => {
400+ render ( < DateRangePicker onChange = { mockOnChange } /> ) ;
401+
402+ // Open calendar
403+ fireEvent . click ( screen . getByTestId ( 'date-range-display' ) ) ;
404+
405+ // Select start date with space key
406+ const startDateElement = screen . getByTestId ( 'calendar-day-15' ) ;
407+ fireEvent . keyDown ( startDateElement , { key : ' ' } ) ;
408+
409+ // Select end date with space key
410+ const endDateElement = screen . getByTestId ( 'calendar-day-20' ) ;
411+ fireEvent . keyDown ( endDateElement , { key : ' ' } ) ;
412+
413+ // Check if onChange was called
414+ expect ( mockOnChange ) . toHaveBeenCalledTimes ( 1 ) ;
415+
416+ const onChangeCalls = mockOnChange . mock . calls [ 0 ] [ 0 ] ;
417+ expect ( onChangeCalls . startDate . getDate ( ) ) . toBe ( 15 ) ;
418+ expect ( onChangeCalls . endDate . getDate ( ) ) . toBe ( 20 ) ;
419+ } ) ;
420+
421+ test ( 'updates when initialDateRange prop changes' , ( ) => {
422+ const { rerender } = render (
423+ < DateRangePicker
424+ initialDateRange = { {
425+ startDate : new Date ( 2025 , 0 , 1 ) ,
426+ endDate : new Date ( 2025 , 0 , 15 )
427+ } }
428+ />
429+ ) ;
430+
431+ // Check initial render
432+ expect ( screen . getByTestId ( 'date-range-text' ) . textContent ) . toBe ( '01/01/2025 - 01/15/2025' ) ;
433+
434+ // Update props
435+ rerender (
436+ < DateRangePicker
437+ initialDateRange = { {
438+ startDate : new Date ( 2026 , 5 , 10 ) ,
439+ endDate : new Date ( 2026 , 5 , 20 )
440+ } }
441+ />
442+ ) ;
443+
444+ // Check if display updated
445+ expect ( screen . getByTestId ( 'date-range-text' ) . textContent ) . toBe ( '06/10/2026 - 06/20/2026' ) ;
446+ } ) ;
447+
448+ test ( 'displays days from previous and next months' , ( ) => {
449+ // Use a specific date to ensure consistent test results
450+ const initialDateRange = {
451+ startDate : new Date ( 2025 , 0 , 15 ) , // Jan 15, 2025
452+ endDate : new Date ( 2025 , 0 , 20 ) // Jan 20, 2025
453+ } ;
454+
455+ render ( < DateRangePicker initialDateRange = { initialDateRange } /> ) ;
456+
457+ // Open calendar
458+ fireEvent . click ( screen . getByTestId ( 'date-range-display' ) ) ;
459+
460+ // Find all day elements
461+ const dayElements = screen . getByTestId ( 'calendar-days' ) . children ;
462+
463+ // Check if there are days from previous month (should have "other-month" class)
464+ const previousMonthDays = Array . from ( dayElements ) . filter (
465+ el => el . classList . contains ( 'other-month' ) && parseInt ( el . textContent || '0' ) > 20
466+ ) ;
467+ expect ( previousMonthDays . length ) . toBeGreaterThan ( 0 ) ;
468+
469+ // Check if there are days from next month (should have "other-month" class)
470+ const nextMonthDays = Array . from ( dayElements ) . filter (
471+ el => el . classList . contains ( 'other-month' ) && parseInt ( el . textContent || '0' ) < 15
472+ ) ;
473+ expect ( nextMonthDays . length ) . toBeGreaterThan ( 0 ) ;
474+ } ) ;
475+
476+ test ( 'correctly marks start and end dates with appropriate classes' , ( ) => {
477+ // Use a specific date range
478+ const initialDateRange = {
479+ startDate : new Date ( 2025 , 0 , 10 ) , // Jan 10, 2025
480+ endDate : new Date ( 2025 , 0 , 20 ) // Jan 20, 2025
481+ } ;
482+
483+ render ( < DateRangePicker initialDateRange = { initialDateRange } /> ) ;
484+
485+ // Open calendar
486+ fireEvent . click ( screen . getByTestId ( 'date-range-display' ) ) ;
487+
488+ // Find all day elements for the 10th and 20th
489+ const allDays = screen . getByTestId ( 'calendar-days' ) . children ;
490+
491+ // Find the current month's day 10 (start date)
492+ const startDateElement = Array . from ( allDays ) . find (
493+ el => el . textContent === '10' && el . classList . contains ( 'current-month' )
494+ ) ;
495+
496+ // Find the current month's day 20 (end date)
497+ const endDateElement = Array . from ( allDays ) . find (
498+ el => el . textContent === '20' && el . classList . contains ( 'current-month' )
499+ ) ;
500+
501+ // Check if they have the correct classes
502+ expect ( startDateElement ) . toHaveClass ( 'start-date' ) ;
503+ expect ( startDateElement ) . toHaveClass ( 'selected' ) ;
504+ expect ( endDateElement ) . toHaveClass ( 'end-date' ) ;
505+ expect ( endDateElement ) . toHaveClass ( 'selected' ) ;
506+
507+ // Check if days in between are also selected
508+ const day15Element = Array . from ( allDays ) . find (
509+ el => el . textContent === '15' && el . classList . contains ( 'current-month' )
510+ ) ;
511+ expect ( day15Element ) . toHaveClass ( 'selected' ) ;
512+ expect ( day15Element ) . not . toHaveClass ( 'start-date' ) ;
513+ expect ( day15Element ) . not . toHaveClass ( 'end-date' ) ;
514+ } ) ;
515+
516+ test ( 'toggles calendar open/close when clicking display area' , ( ) => {
517+ render ( < DateRangePicker /> ) ;
518+
519+ // Calendar should be closed initially
520+ expect ( screen . queryByTestId ( 'calendar-container' ) ) . not . toBeInTheDocument ( ) ;
521+
522+ // Open calendar
523+ fireEvent . click ( screen . getByTestId ( 'date-range-display' ) ) ;
524+ expect ( screen . getByTestId ( 'calendar-container' ) ) . toBeInTheDocument ( ) ;
525+
526+ // Close calendar by clicking display again
527+ fireEvent . click ( screen . getByTestId ( 'date-range-display' ) ) ;
528+ expect ( screen . queryByTestId ( 'calendar-container' ) ) . not . toBeInTheDocument ( ) ;
529+ } ) ;
530+
531+ test ( 'shows correct toggle icon based on calendar state' , ( ) => {
532+ render ( < DateRangePicker /> ) ;
533+
534+ // When closed, should show down arrow
535+ expect ( screen . getByTestId ( 'down-arrow-icon' ) ) . toBeInTheDocument ( ) ;
536+ expect ( screen . queryByTestId ( 'up-arrow-icon' ) ) . not . toBeInTheDocument ( ) ;
537+
538+ // Open calendar
539+ fireEvent . click ( screen . getByTestId ( 'date-range-display' ) ) ;
540+
541+ // When open, should show up arrow
542+ expect ( screen . queryByTestId ( 'down-arrow-icon' ) ) . not . toBeInTheDocument ( ) ;
543+ expect ( screen . getByTestId ( 'up-arrow-icon' ) ) . toBeInTheDocument ( ) ;
544+ } ) ;
545+
318546} ) ;
0 commit comments