import * as React from 'react'; import Button from '../../button'; import TimePicker from '../TimePicker'; import Locale from '../../locale/source/zh_CN'; import { clear } from 'jest-date-mock'; import * as _ from 'lodash'; import { IconClose } from '@douyinfe/semi-icons'; import { genAfterEach, genBeforeEach, mount, sleep, trigger } from '../../_test_/utils'; import { isTimeFormatLike } from '@douyinfe/semi-foundation/timePicker/utils'; import { BASE_CLASS_PREFIX } from '../../../semi-foundation/base/constants'; describe(`TimePicker`, () => { beforeEach(() => { clear(); genBeforeEach()(); }); afterEach(genAfterEach()); it(`test time picker appearance`, async () => { const defaultHour = 10; const defaultMinute = 24; const defaultSeconds = 18; const onFocus = sinon.spy(); const onChange = sinon.spy(); const elem = mount( Select Time} locale={Locale.TimePicker} localeCode={Locale.code} defaultOpen={true} scrollItemProps={{ mode: 'wheel', cycled: false }} format={'HH:mm:ss'} defaultValue={`${defaultHour}:${defaultMinute}:${defaultSeconds}`} panelFooter={Select Time} /> ); expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-scrolllist`).length).toBe(1); expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-timepicker`).length).toBe(1); expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-scrolllist-header`).length).toBe(1); expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-scrolllist-footer`).length).toBe(1); // click minute const minuteUl = elem.find(`.${BASE_CLASS_PREFIX}-timepicker-panel-list-minute .${BASE_CLASS_PREFIX}-scrolllist-list-outer ul`); const minuteLis = minuteUl.find(`li`); minuteUl.simulate('click', { target: minuteLis.at(0).getDOMNode(), nativeEvent: null }); await sleep(200); const newMinute = 0; let currentDate = elem.state('value')[newMinute]; expect(currentDate.getHours()).toBe(defaultHour); expect(currentDate.getMinutes()).toBe(newMinute); // focus elem.find(`input`).simulate('focus'); await sleep(200); expect(onFocus.calledOnce).toBeTruthy(); // input value const newInputHour = 10; const newInputMinute = 18; const newInputSeconds = 18; elem.find(`input`).simulate('change', { target: { value: `${newInputHour}:${newInputMinute}:${newInputSeconds}` }, }); await sleep(200); currentDate = elem.state('value')[0]; expect(currentDate.getMinutes()).toBe(newInputMinute); // click inside document.querySelector(`.${BASE_CLASS_PREFIX}-scrolllist`).click(); expect(elem.state('open')).toBe(true); // click outside // document.body.click(); trigger(document, 'mousedown'); await sleep(200); expect(elem.state('open')).toBe(false); expect(onChange.called).toBeTruthy(); const args = onChange.getCall(0).args; expect(args[0] instanceof Date).toBe(true); expect(typeof args[1]).toBe('string'); elem.unmount(); }); it(`test controlled value`, async () => { const defaultHour = 10; const defaultMinute = 24; const defaultSeconds = 18; const elem0 = mount( Select Time} locale={Locale.TimePicker} localeCode={Locale.code} defaultOpen={true} scrollItemProps={{ cycled: false }} format={'HH:mm:ss'} value={`${defaultHour}:${defaultMinute}:${defaultSeconds}`} panelFooter={Select Time} /> ); const newInputHour = 10; const newInputMinute = 18; const newInputSeconds = 18; elem0.find(`input`).simulate('change', { target: { value: `${newInputHour}:${newInputMinute}:${newInputSeconds}` }, }); await sleep(200); let currentDate0 = elem0.state('value')[0]; expect(currentDate0.getMinutes()).toBe(defaultMinute); elem0.unmount(); }); it(`test controlled value with onchange`, async () => { const defaultHour = 10; const defaultMinute = 24; const defaultSeconds = 18; const onChange = sinon.spy((date, str) => { elem1.setProps({ value: date }); }); const elem1 = mount( Select Time} locale={Locale.TimePicker} localeCode={Locale.code} defaultOpen={true} scrollItemProps={{ cycled: false }} format={'HH:mm:ss'} value={`${defaultHour}:${defaultMinute}:${defaultSeconds}`} panelFooter={Select Time} /> ); const newInputHour = 10; const newInputMinute = 18; const newInputSeconds = 18; elem1.find(`input`).simulate('change', { target: { value: `${newInputHour}:${newInputMinute}:${newInputSeconds}` }, }); await sleep(200); let currentDate1 = elem1.state('value')[0]; expect(currentDate1.getMinutes()).toBe(newInputMinute); elem1.unmount(); }); it(`test controlled open`, async () => { const defaultHour = 10; const defaultMinute = 24; const defaultSeconds = 18; const defaultOpen = true; const onChange = sinon.spy((date, str) => { elem1.setProps({ value: date }); }); const onOpenChange = sinon.spy(open => elem.setProps({ open })); const elem = mount( Select Time} locale={Locale.TimePicker} localeCode={Locale.code} scrollItemProps={{ cycled: false }} format={'HH:mm:ss'} value={`${defaultHour}:${defaultMinute}:${defaultSeconds}`} panelFooter={