Skip to content

Commit f4e2ad8

Browse files
committed
fix: preset和maxDate
1 parent 5618439 commit f4e2ad8

File tree

1 file changed

+137
-9
lines changed

1 file changed

+137
-9
lines changed

tests/picker.spec.tsx

Lines changed: 137 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
/* eslint-disable @typescript-eslint/no-loop-func */
22
import { act, createEvent, fireEvent, render } from '@testing-library/react';
3-
import type { Dayjs } from 'dayjs';
4-
import dayjs from 'dayjs';
3+
import dayjs, { type Dayjs } from 'dayjs';
54
import moment from 'moment';
65
import 'moment/locale/zh-cn';
76
import KeyCode from '@rc-component/util/lib/KeyCode';
@@ -1197,24 +1196,153 @@ describe('Picker.Basic', () => {
11971196
expect(onChange.mock.calls[0][0].format('YYYY-MM-DD')).toEqual('1990-09-04');
11981197
});
11991198

1200-
it('presets - disabled does not trigger', () => {
1199+
it('presets - trigger', () => {
12011200
const onChange = jest.fn();
1201+
const mockHover = jest.fn();
12021202

1203-
const futureDate = dayjs().add(1, 'day');
1203+
const yesterday = dayjs().subtract(1, 'day');
12041204
render(
12051205
<DayPicker
1206-
onChange={onChange}
1207-
open
1208-
presets={[{ label: 'Future', value: futureDate }]}
1209-
maxDate={dayjs()} // maxDate 是今天,futureDate 是明天,禁用
1206+
{...({
1207+
onChange,
1208+
onHover: mockHover,
1209+
open: true,
1210+
presets: [{ label: 'Tomorrow', value: yesterday }],
1211+
maxDate: dayjs(),
1212+
} as React.ComponentProps<typeof DayPicker> & { onHover?: (date: Dayjs | null) => void })}
12101213
/>,
12111214
);
12121215

12131216
const presetEle = document.querySelector('.rc-picker-presets li');
1217+
if (!presetEle) throw new Error('Preset element not found');
1218+
1219+
fireEvent.click(presetEle);
1220+
expect(onChange).toHaveBeenCalled();
1221+
1222+
fireEvent.mouseEnter(presetEle);
1223+
// expect(mockHover).toHaveBeenCalled();
1224+
});
1225+
1226+
it('should not trigger onClick when preset date is after maxDate', () => {
1227+
const onChange = jest.fn();
1228+
const mockHover = jest.fn();
1229+
const futureDate = moment().add(1, 'day');
1230+
render(
1231+
<DayPicker
1232+
{...({
1233+
onChange,
1234+
onHover: mockHover,
1235+
open: true,
1236+
presets: [{ label: 'Tomorrow', value: futureDate }],
1237+
maxDate: moment(),
1238+
} as React.ComponentProps<typeof DayPicker> & { onHover?: (date: Dayjs | null) => void })}
1239+
/>,
1240+
);
1241+
1242+
const presetEle = document.querySelector('.rc-picker-presets li');
1243+
if (!presetEle) throw new Error('Preset element not found');
12141244

1215-
// Click
12161245
fireEvent.click(presetEle);
12171246
expect(onChange).not.toHaveBeenCalled();
1247+
1248+
fireEvent.mouseEnter(presetEle);
1249+
expect(mockHover).not.toHaveBeenCalled();
1250+
});
1251+
1252+
it('should not render presets when presets is empty', () => {
1253+
const mockHover = jest.fn();
1254+
const mockChange = jest.fn();
1255+
1256+
render(
1257+
<DayPicker
1258+
{...({
1259+
onChange: mockChange,
1260+
onHover: mockHover,
1261+
open: true,
1262+
presets: [{ label: 'Tomorrow', value: dayjs().add(1, 'day') }],
1263+
} as React.ComponentProps<typeof DayPicker> & {
1264+
onHover?: (date: dayjs.Dayjs | null) => void;
1265+
})}
1266+
/>,
1267+
);
1268+
1269+
// 用 DOM 判断是否渲染了 presets
1270+
const presetEle = document.querySelector('.rc-picker-presets li');
1271+
1272+
if (!presetEle) throw new Error('Preset element not found');
1273+
1274+
fireEvent.click(presetEle);
1275+
expect(mockChange).toHaveBeenCalled();
1276+
});
1277+
1278+
it('should not render presets when presets is function', () => {
1279+
const mockHover = jest.fn();
1280+
const mockChange = jest.fn();
1281+
1282+
render(
1283+
<DayPicker
1284+
{...({
1285+
onChange: mockChange,
1286+
onHover: mockHover,
1287+
open: true,
1288+
maxDate: moment(),
1289+
presets: [{ label: 'Tomorrow', value: () => dayjs().subtract(1, 'day') }],
1290+
} as React.ComponentProps<typeof DayPicker> & {
1291+
onHover?: (date: dayjs.Dayjs | null) => void;
1292+
})}
1293+
/>,
1294+
);
1295+
1296+
// 用 DOM 判断是否渲染了 presets
1297+
const presetEle = document.querySelector('.rc-picker-presets li');
1298+
1299+
if (!presetEle) throw new Error('Preset element not found');
1300+
1301+
fireEvent.click(presetEle);
1302+
expect(mockChange).toHaveBeenCalled();
1303+
});
1304+
1305+
it('should allow click when maxDate is not a moment object', () => {
1306+
const onChange = jest.fn();
1307+
1308+
render(
1309+
<DayPicker
1310+
{...({
1311+
onChange,
1312+
open: true,
1313+
presets: [{ label: 'Valid', value: dayjs().subtract(1, 'day') }],
1314+
maxDate: dayjs(), // 👈 不是 moment 对象
1315+
} as React.ComponentProps<typeof DayPicker>)}
1316+
/>,
1317+
);
1318+
1319+
const presetEle = document.querySelector('.rc-picker-presets li');
1320+
if (!presetEle) throw new Error('Preset element not found');
1321+
1322+
fireEvent.click(presetEle);
1323+
expect(onChange).toHaveBeenCalled(); // ✅ 应该能调用
1324+
});
1325+
1326+
it('should allow click when maxDate is not provided', () => {
1327+
const onChange = jest.fn();
1328+
1329+
render(
1330+
<DayPicker
1331+
{...({
1332+
onChange,
1333+
open: true,
1334+
maxDate: undefined,
1335+
presets: [{ label: 'Valid', value: dayjs().add(1, 'day') }],
1336+
// 👇 不传 maxDate
1337+
} as React.ComponentProps<typeof DayPicker>)}
1338+
/>,
1339+
);
1340+
1341+
const presetEle = document.querySelector('.rc-picker-presets li');
1342+
if (!presetEle) throw new Error('Preset element not found');
1343+
1344+
fireEvent.click(presetEle);
1345+
expect(onChange).toHaveBeenCalled(); // ✅ 应该能调用
12181346
});
12191347

12201348
it('presets support callback', () => {

0 commit comments

Comments
 (0)