|
1 | 1 | /* eslint-disable @typescript-eslint/no-loop-func */
|
2 | 2 | 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'; |
5 | 4 | import moment from 'moment';
|
6 | 5 | import 'moment/locale/zh-cn';
|
7 | 6 | import KeyCode from '@rc-component/util/lib/KeyCode';
|
@@ -1197,24 +1196,153 @@ describe('Picker.Basic', () => {
|
1197 | 1196 | expect(onChange.mock.calls[0][0].format('YYYY-MM-DD')).toEqual('1990-09-04');
|
1198 | 1197 | });
|
1199 | 1198 |
|
1200 |
| - it('presets - disabled does not trigger', () => { |
| 1199 | + it('presets - trigger', () => { |
1201 | 1200 | const onChange = jest.fn();
|
| 1201 | + const mockHover = jest.fn(); |
1202 | 1202 |
|
1203 |
| - const futureDate = dayjs().add(1, 'day'); |
| 1203 | + const yesterday = dayjs().subtract(1, 'day'); |
1204 | 1204 | render(
|
1205 | 1205 | <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 })} |
1210 | 1213 | />,
|
1211 | 1214 | );
|
1212 | 1215 |
|
1213 | 1216 | 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'); |
1214 | 1244 |
|
1215 |
| - // Click |
1216 | 1245 | fireEvent.click(presetEle);
|
1217 | 1246 | 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(); // ✅ 应该能调用 |
1218 | 1346 | });
|
1219 | 1347 |
|
1220 | 1348 | it('presets support callback', () => {
|
|
0 commit comments