import React from 'react'; import { mount } from 'enzyme'; import moment from 'moment'; import MockDate from 'mockdate'; import DatePicker from '..'; import { selectDate, openPanel, clearInput, nextYear, nextMonth, hasSelected } from './utils'; import focusTest from '../../../tests/shared/focusTest'; describe('DatePicker', () => { const errorSpy = jest.spyOn(console, 'error').mockImplementation(() => {}); focusTest(DatePicker); beforeEach(() => { MockDate.set(moment('2016-11-22')); }); afterEach(() => { MockDate.reset(); errorSpy.mockReset(); }); afterAll(() => { errorSpy.mockRestore(); }); it('support name prop', () => { const wrapper = mount(); expect(wrapper.find('input').props().name).toBe('bamboo'); }); it('prop locale should works', () => { const locale = { lang: { placeholder: 'Избери дата', rangePlaceholder: ['Начална дата', 'Крайна дата'], today: 'Днес', now: 'Сега', backToToday: 'Към днес', ok: 'Добре', clear: 'Изчистване', month: 'Месец', year: 'Година', timeSelect: 'Избор на час', dateSelect: 'Избор на дата', monthSelect: 'Избор на месец', yearSelect: 'Избор на година', decadeSelect: 'Десетилетие', previousMonth: 'Предишен месец (PageUp)', nextMonth: 'Следващ месец (PageDown)', previousYear: 'Последна година (Control + left)', nextYear: 'Следваща година (Control + right)', previousDecade: 'Предишно десетилетие', nextDecade: 'Следващо десетилетие', previousCentury: 'Последен век', nextCentury: 'Следващ век', yearFormat: 'YYYY', dateFormat: 'D M YYYY', dayFormat: 'D', dateTimeFormat: 'D M YYYY HH:mm:ss', monthBeforeYear: true, }, timePickerLocale: { placeholder: 'Избор на час', }, }; const birthday = moment('2000-01-01', 'YYYY-MM-DD'); const wrapper = mount(); expect(wrapper.render()).toMatchSnapshot(); }); // Fix https://github.com/ant-design/ant-design/issues/8885 it('control value after panel closed', () => { class Test extends React.Component { state = { cleared: false, value: moment(), }; onChange = value => { let { cleared } = this.state; let newValue = value; if (cleared) { newValue = moment(moment(value).format('YYYY-MM-DD 12:12:12')); cleared = false; } if (!newValue) { cleared = true; } this.setState({ value: newValue, cleared }); }; render() { const { value } = this.state; return ( ); } } const wrapper = mount(); // clear input clearInput(wrapper); openPanel(wrapper); selectDate(wrapper, moment('2016-11-13')); expect(wrapper.find('.ant-calendar-input').getDOMNode().value).toBe('2016-11-13 12:12:12'); selectDate(wrapper, moment('2016-11-14')); expect(wrapper.find('.ant-calendar-input').getDOMNode().value).toBe('2016-11-14 12:12:12'); }); it('triggers onChange only when date was selected', () => { const handleChange = jest.fn(); const wrapper = mount(); openPanel(wrapper); nextYear(wrapper); expect(handleChange).not.toHaveBeenCalled(); nextMonth(wrapper); expect(handleChange).not.toHaveBeenCalled(); selectDate(wrapper, moment('2017-12-22')); expect(handleChange).toHaveBeenCalled(); }); it('clear input', () => { const wrapper = mount(); openPanel(wrapper); selectDate(wrapper, moment('2016-11-23')); clearInput(wrapper); openPanel(wrapper); expect(hasSelected(wrapper, moment('2016-11-22'))).toBe(true); }); it('sets data attributes on input', () => { const wrapper = mount(); const input = wrapper.find('.ant-calendar-picker-input').getDOMNode(); expect(input.getAttribute('data-test')).toBe('test-id'); expect(input.getAttribute('data-id')).toBe('12345'); }); it('sets aria attributes on input', () => { const wrapper = mount(); const input = wrapper.find('.ant-calendar-picker-input').getDOMNode(); expect(input.getAttribute('aria-label')).toBe('some-label'); expect(input.getAttribute('aria-labelledby')).toBe('label-id'); }); it('sets role attribute on input', () => { const wrapper = mount(); const input = wrapper.find('.ant-calendar-picker-input').getDOMNode(); expect(input.getAttribute('role')).toBe('search'); }); it('changes year/month when under control', () => { const wrapper = mount(); openPanel(wrapper); expect(wrapper.find('.ant-calendar-my-select').text()).toBe('Jul2018'); wrapper.find('.ant-calendar-prev-year-btn').simulate('click'); wrapper.find('.ant-calendar-prev-month-btn').simulate('click'); expect(wrapper.find('.ant-calendar-my-select').text()).toBe('Jun2017'); }); it('disabled date', () => { function disabledDate(current) { return current && current < moment().endOf('day'); } const wrapper = mount(); expect(wrapper.render()).toMatchSnapshot(); }); it('extra footer works', () => { const wrapper = mount( {mode}} />, ); openPanel(wrapper); let extraNode = wrapper.find('.extra-node'); expect(extraNode.length).toBe(1); expect(extraNode.text()).toBe('date'); wrapper .find('.ant-calendar-month-select') .hostNodes() .simulate('click'); extraNode = wrapper.find('.ant-calendar-month-panel .extra-node'); expect(extraNode.length).toBe(1); expect(extraNode.text()).toBe('month'); wrapper .find('.ant-calendar-year-select') .hostNodes() .simulate('click'); extraNode = wrapper.find('.ant-calendar-year-panel .extra-node'); expect(extraNode.length).toBe(1); expect(extraNode.text()).toBe('year'); wrapper .find('.ant-calendar-year-panel-decade-select') .hostNodes() .simulate('click'); extraNode = wrapper.find('.ant-calendar-decade-panel .extra-node'); expect(extraNode.length).toBe(1); expect(extraNode.text()).toBe('decade'); }); it('supports multiple formats', () => { const wrapper = mount(); openPanel(wrapper); wrapper.find('.ant-calendar-input').simulate('change', { target: { value: '02/07/18' } }); expect(wrapper.find('.ant-calendar-picker-input').getDOMNode().value).toBe('02/07/2018'); }); describe('warning use if use invalidate moment', () => { const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {}); const invalidateTime = moment('I AM INVALIDATE'); warnSpy.mockReset(); it('defaultValue', () => { mount(); expect(errorSpy).toHaveBeenCalledWith( 'Warning: [antd: DatePicker] `defaultValue` provides invalidate moment time. If you want to set empty value, use `null` instead.', ); }); it('value', () => { mount(); expect(errorSpy).toHaveBeenCalledWith( 'Warning: [antd: DatePicker] `value` provides invalidate moment time. If you want to set empty value, use `null` instead.', ); }); }); });