33 */
44
55import { render , fireEvent , act , waitFor } from "@testing-library/react" ;
6+ import { setDate , startOfMonth , eachDayOfInterval , endOfMonth } from "date-fns" ;
67import { endOfYear } from "date-fns/endOfYear" ;
78import { isSunday } from "date-fns/isSunday" ;
89import { eo } from "date-fns/locale/eo" ;
@@ -28,6 +29,8 @@ import {
2829 isSameDay ,
2930 subMonths ,
3031 subYears ,
32+ addDays ,
33+ getDate ,
3134} from "../date_utils" ;
3235import DatePicker from "../index" ;
3336
@@ -2257,6 +2260,112 @@ describe("Calendar", () => {
22572260 currentMonth === 0 ? 11 : currentMonth - 1 ,
22582261 ) ;
22592262 } ) ;
2263+
2264+ describe ( "pre-selection & disabled dates" , ( ) => {
2265+ it ( "should update the pre-selected dates to the first enabled day in a month when the next month is selected" , ( ) => {
2266+ const selected = new Date ( "2024-06-01" ) ;
2267+ const excludeDate = addMonths ( selected , 1 ) ;
2268+
2269+ const { container } = render (
2270+ < DatePicker selected = { selected } excludeDates = { [ excludeDate ] } /> ,
2271+ ) ;
2272+ const input = safeQuerySelector < HTMLInputElement > ( container , "input" ) ;
2273+ fireEvent . focus ( input ) ;
2274+
2275+ const nextButton = safeQuerySelector < HTMLButtonElement > (
2276+ container ,
2277+ ".react-datepicker__navigation--next" ,
2278+ ) ;
2279+ fireEvent . click ( nextButton ) ;
2280+
2281+ const preSelectedNewDate = safeQuerySelector (
2282+ container ,
2283+ ".react-datepicker__day--keyboard-selected" ,
2284+ ) . textContent ;
2285+ const expectedPreSelectedNewDate = addDays ( excludeDate , 1 ) ;
2286+
2287+ expect ( Number ( preSelectedNewDate ) ) . toBe (
2288+ getDate ( expectedPreSelectedNewDate ) ,
2289+ ) ;
2290+ } ) ;
2291+
2292+ it ( "should update the pre-selected dates to the first enabled day in a month when the previous month is selected" , ( ) => {
2293+ const selected = new Date ( "2024-06-08" ) ;
2294+ const excludeDate = addMonths ( selected , 1 ) ;
2295+
2296+ const { container } = render (
2297+ < DatePicker selected = { selected } excludeDates = { [ excludeDate ] } /> ,
2298+ ) ;
2299+ const input = safeQuerySelector < HTMLInputElement > ( container , "input" ) ;
2300+ fireEvent . focus ( input ) ;
2301+
2302+ const nextButton = safeQuerySelector < HTMLButtonElement > (
2303+ container ,
2304+ ".react-datepicker__navigation--next" ,
2305+ ) ;
2306+ fireEvent . click ( nextButton ) ;
2307+
2308+ const preSelectedNewDate = safeQuerySelector (
2309+ container ,
2310+ ".react-datepicker__day--keyboard-selected" ,
2311+ ) . textContent ;
2312+ const expectedPreSelectedNewDate = setDate ( excludeDate , 1 ) ;
2313+
2314+ expect ( Number ( preSelectedNewDate ) ) . toBe (
2315+ getDate ( expectedPreSelectedNewDate ) ,
2316+ ) ;
2317+ } ) ;
2318+
2319+ it ( "shouldn't set pre-select any date if all dates of a next month is disabled" , ( ) => {
2320+ const selected = new Date ( "2024-06-08" ) ;
2321+ const nextMonth = addMonths ( selected , 1 ) ;
2322+ const excludeDates = eachDayOfInterval ( {
2323+ start : startOfMonth ( nextMonth ) ,
2324+ end : endOfMonth ( nextMonth ) ,
2325+ } ) ;
2326+
2327+ const { container } = render (
2328+ < DatePicker selected = { selected } excludeDates = { excludeDates } /> ,
2329+ ) ;
2330+ const input = safeQuerySelector < HTMLInputElement > ( container , "input" ) ;
2331+ fireEvent . focus ( input ) ;
2332+
2333+ const nextButton = safeQuerySelector < HTMLButtonElement > (
2334+ container ,
2335+ ".react-datepicker__navigation--next" ,
2336+ ) ;
2337+ fireEvent . click ( nextButton ) ;
2338+
2339+ expect (
2340+ container . querySelector ( ".react-datepicker__day--keyboard-selected" ) ,
2341+ ) . toBeNull ( ) ;
2342+ } ) ;
2343+
2344+ it ( "shouldn't set pre-select any date if all dates of a last month is disabled" , ( ) => {
2345+ const selected = new Date ( "2024-06-08" ) ;
2346+ const lastMonth = subMonths ( selected , 1 ) ;
2347+ const excludeDates = eachDayOfInterval ( {
2348+ start : startOfMonth ( lastMonth ) ,
2349+ end : endOfMonth ( lastMonth ) ,
2350+ } ) ;
2351+
2352+ const { container } = render (
2353+ < DatePicker selected = { selected } excludeDates = { excludeDates } /> ,
2354+ ) ;
2355+ const input = safeQuerySelector < HTMLInputElement > ( container , "input" ) ;
2356+ fireEvent . focus ( input ) ;
2357+
2358+ const nextButton = safeQuerySelector < HTMLButtonElement > (
2359+ container ,
2360+ ".react-datepicker__navigation--previous" ,
2361+ ) ;
2362+ fireEvent . click ( nextButton ) ;
2363+
2364+ expect (
2365+ container . querySelector ( ".react-datepicker__day--keyboard-selected" ) ,
2366+ ) . toBeNull ( ) ;
2367+ } ) ;
2368+ } ) ;
22602369 } ) ;
22612370
22622371 describe ( "showTimeSelect" , ( ) => {
0 commit comments