Skip to content

Commit c57aece

Browse files
committed
build(datepicker): upgrade react-native to 0.49 and switch to Jest
1 parent 43b8cfb commit c57aece

File tree

36 files changed

+1749
-1339
lines changed

36 files changed

+1749
-1339
lines changed

.npmignore

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
example
22
.*
33
coverage
4-
index.android.js
5-
index.ios.js
4+
index.js
65
android/
76
ios/
87
google_calendar.png

__tests__/Datepicker.test.js

Lines changed: 357 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,357 @@
1+
import React from 'react';
2+
import {Platform, Animated, DatePickerAndroid, Modal, View} from 'react-native';
3+
import Enzyme, {shallow} from 'enzyme';
4+
import Adapter from 'enzyme-adapter-react-16';
5+
import Moment from 'moment';
6+
import DatePicker from '../datepicker.js';
7+
8+
Enzyme.configure({adapter: new Adapter()});
9+
10+
import 'jsdom-global/register';
11+
console.error = function () {};
12+
13+
14+
describe('DatePicker', () => {
15+
16+
it('initialize', () => {
17+
const wrapper = shallow(<DatePicker />);
18+
const datePicker = wrapper.instance();
19+
20+
expect(datePicker.props.mode).toEqual('date');
21+
expect(datePicker.props.duration).toEqual(300);
22+
expect(datePicker.props.height).toBeGreaterThan(200);
23+
expect(datePicker.props.confirmBtnText).toEqual('确定');
24+
expect(datePicker.props.cancelBtnText).toEqual('取消');
25+
expect(datePicker.props.customStyles).toMatchObject({});
26+
expect(datePicker.props.showIcon).toEqual(true);
27+
expect(datePicker.props.disabled).toEqual(false);
28+
29+
expect(wrapper.state('date')).toBeInstanceOf(Date);
30+
expect(wrapper.state('modalVisible')).toEqual(false);
31+
expect(wrapper.state('animatedHeight')).toBeInstanceOf(Animated.Value);
32+
expect(datePicker._renderIcon()).toBeTruthy();
33+
34+
const wrapper1 = shallow(
35+
<DatePicker
36+
date="2016-05-11"
37+
format="YYYY/MM/DD"
38+
mode="datetime"
39+
duration={400}
40+
confirmBtnText="Confirm"
41+
cancelBtnText="Cancel"
42+
iconSource={{}}
43+
customStyles={{testStyle: 123}}
44+
disabled={true}
45+
showIcon={false}
46+
/>
47+
);
48+
const datePicker1 = wrapper1.instance();
49+
50+
expect(datePicker1.props.mode).toEqual('datetime');
51+
expect(datePicker1.props.format).toEqual('YYYY/MM/DD');
52+
expect(datePicker1.props.duration).toEqual(400);
53+
expect(datePicker1.props.confirmBtnText).toEqual('Confirm');
54+
expect(datePicker1.props.cancelBtnText).toEqual('Cancel');
55+
expect(datePicker1.props.iconSource).toMatchObject({});
56+
expect(datePicker1.props.customStyles).toMatchObject({testStyle: 123});
57+
expect(datePicker1.props.showIcon).toEqual(false);
58+
expect(datePicker1.props.disabled).toEqual(true);
59+
60+
expect(wrapper1.state('date')).toMatchObject(Moment('2016-05-11', 'YYYY-MM-DD').toDate());
61+
expect(datePicker1._renderIcon()).toEqual(null);
62+
63+
// find not work with mount, and defaultProps not work with shallow...
64+
const iconComponent = shallow(<View>iconComponent</View>);
65+
const wrapper2 = shallow(<DatePicker date={new Date('2016/09/09')} iconComponent={iconComponent}/>);
66+
const datePicker2 = wrapper2.instance();
67+
expect(wrapper2.instance().getDateStr()).toEqual('2016-09-09');
68+
expect(datePicker2._renderIcon()).toEqual(iconComponent);
69+
70+
const wrapper3 = shallow(<DatePicker showIcon={false} date={{test: 123}} />);
71+
expect(wrapper3.find('Image').length).toEqual(0);
72+
expect(wrapper3.instance().getDateStr()).toEqual('Invalid date');
73+
expect(datePicker1._renderIcon()).toEqual(null);
74+
75+
});
76+
77+
it('default selected Date', () => {
78+
var dateStr = null;
79+
const wrapper = shallow(<DatePicker date="" onDateChange={(date) => {
80+
dateStr = date;
81+
}}/>);
82+
const datePicker = wrapper.instance();
83+
84+
datePicker.onPressConfirm();
85+
86+
expect(dateStr).toEqual(Moment().format('YYYY-MM-DD'));
87+
});
88+
89+
it('default selected Date with minDate and maxDate', () => {
90+
var dateStr = null;
91+
var dateStrMax = null;
92+
var dateStrNormal = null;
93+
94+
const wrapper = shallow(<DatePicker date="" minDate="3000-09-09" onDateChange={(date) => {
95+
dateStr = date;
96+
}}/>);
97+
const datePicker = wrapper.instance();
98+
99+
datePicker.onPressConfirm();
100+
101+
expect(dateStr).toEqual('3000-09-09');
102+
103+
104+
const wrapperMax = shallow(<DatePicker date="" maxDate="2016-07-07" onDateChange={(date) => {
105+
dateStrMax = date;
106+
}}/>);
107+
const datePickerMax = wrapperMax.instance();
108+
109+
datePickerMax.onPressConfirm();
110+
111+
expect(dateStrMax).toEqual('2016-07-07');
112+
113+
114+
const wrapperNormal = shallow(
115+
<DatePicker date="" minDate="2016-07-07" maxDate="3000-09-09" onDateChange={(date) => {dateStrNormal = date;}}/>
116+
);
117+
const datePickerNormal = wrapperNormal.instance();
118+
119+
datePickerNormal.onPressConfirm();
120+
121+
expect(dateStrNormal).toEqual(Moment().format('YYYY-MM-DD'));
122+
});
123+
124+
it('setModalVisible', () => {
125+
const wrapper = shallow(<DatePicker />);
126+
const datePicker = wrapper.instance();
127+
128+
datePicker.setModalVisible(true);
129+
130+
expect(wrapper.state('modalVisible')).toEqual(true);
131+
expect(wrapper.state('animatedHeight')._animation._toValue).toBeGreaterThan(200);
132+
133+
datePicker.setModalVisible(false);
134+
expect(wrapper.state('animatedHeight')._animation._toValue).toEqual(0);
135+
});
136+
137+
it('onPressCancel', () => {
138+
const setModalVisible = jest.fn();
139+
const onCloseModal = jest.fn();
140+
const wrapper = shallow(<DatePicker onCloseModal={onCloseModal}/>);
141+
const datePicker = wrapper.instance();
142+
datePicker.setModalVisible = setModalVisible;
143+
144+
datePicker.onPressCancel();
145+
146+
expect(setModalVisible).toHaveBeenCalledWith(false);
147+
expect(onCloseModal).toHaveBeenCalledTimes(1);
148+
});
149+
150+
it('onPressMask', () => {
151+
const onPressMask = jest.fn();
152+
const wrapper = shallow(<DatePicker onPressMask={onPressMask}/>);
153+
const datePicker = wrapper.instance();
154+
155+
datePicker.onPressMask();
156+
157+
expect(onPressMask).toHaveBeenCalledTimes(1);
158+
159+
// call onPressCancel when without onPressMask cb func
160+
const onPressCancel = jest.fn();
161+
const wrapper1 = shallow(<DatePicker />);
162+
const datePicker1 = wrapper1.instance();
163+
datePicker1.onPressCancel = onPressCancel;
164+
165+
datePicker1.onPressMask();
166+
167+
expect(onPressCancel).toHaveBeenCalledTimes(1);
168+
});
169+
170+
it('onPressConfirm', () => {
171+
const setModalVisible = jest.fn();
172+
const datePicked = jest.fn();
173+
const onCloseModal = jest.fn();
174+
const wrapper = shallow(<DatePicker onCloseModal={onCloseModal}/>);
175+
const datePicker = wrapper.instance();
176+
datePicker.setModalVisible = setModalVisible;
177+
datePicker.datePicked = datePicked;
178+
179+
datePicker.onPressConfirm();
180+
181+
expect(setModalVisible).toHaveBeenCalledWith(false);
182+
expect(datePicked).toHaveBeenCalledTimes(1);
183+
expect(onCloseModal).toHaveBeenCalledTimes(1);
184+
});
185+
186+
it('getDate', () => {
187+
const wrapper = shallow(<DatePicker date="2016-06-04"/>);
188+
const datePicker = wrapper.instance();
189+
190+
expect(datePicker.getDate()).toMatchObject(Moment('2016-06-04', 'YYYY-MM-DD').toDate());
191+
expect(datePicker.getDate('2016-06-06')).toMatchObject(Moment('2016-06-06', 'YYYY-MM-DD').toDate());
192+
193+
const date = new Date();
194+
expect(datePicker.getDate(date)).toEqual(date);
195+
});
196+
197+
it('getDateStr', () => {
198+
const wrapper = shallow(<DatePicker date="2016-06-01"/>);
199+
const datePicker = wrapper.instance();
200+
201+
expect(datePicker.getDateStr()).toEqual('2016-06-01');
202+
expect(datePicker.getDateStr(new Date('2016-06-02'))).toEqual('2016-06-02');
203+
expect(datePicker.getDateStr('2016-06-03')).toEqual('2016-06-03');
204+
205+
wrapper.setProps({format: 'YYYY/MM/DD'});
206+
expect(datePicker.getDateStr(new Date('2016-06-02'))).toEqual('2016/06/02');
207+
});
208+
209+
it('datePicked', () => {
210+
const onDateChange = jest.fn();
211+
const wrapper = shallow(<DatePicker onDateChange={onDateChange}/>);
212+
const datePicker = wrapper.instance();
213+
const date = new Date('2016-06-06');
214+
wrapper.setState({date});
215+
216+
datePicker.datePicked();
217+
218+
expect(onDateChange).toHaveBeenCalledWith('2016-06-06', date);
219+
});
220+
221+
it('onDatePicked', () => {
222+
const onDateChange = jest.fn();
223+
const wrapper = shallow(<DatePicker onDateChange={onDateChange}/>);
224+
const datePicker = wrapper.instance();
225+
226+
datePicker.onDatePicked({action: DatePickerAndroid.dismissedAction, year: 2016, month: 5, day: 12});
227+
datePicker.onDatePicked({action: '', year: 2016, month: 5, day: 12});
228+
229+
expect(wrapper.state('date')).toMatchObject(new Date(2016, 5, 12));
230+
expect(onDateChange).toHaveBeenCalledTimes(1);
231+
});
232+
233+
it('onTimePicked', () => {
234+
const onDateChange = jest.fn();
235+
const wrapper = shallow(<DatePicker onDateChange={onDateChange}/>);
236+
const datePicker = wrapper.instance();
237+
238+
datePicker.onTimePicked({action: DatePickerAndroid.dismissedAction, hour: 12, minute: 10});
239+
datePicker.onTimePicked({action: '', hour: 12, minute: 10});
240+
241+
expect(wrapper.state('date').getHours()).toEqual(12);
242+
expect(wrapper.state('date').getMinutes()).toEqual(10);
243+
expect(onDateChange).toHaveBeenCalledTimes(1);
244+
});
245+
246+
it('onDatetimeTimePicked', () => {
247+
const onDateChange = jest.fn();
248+
const wrapper = shallow(<DatePicker onDateChange={onDateChange}/>);
249+
const datePicker = wrapper.instance();
250+
251+
datePicker.onDatetimePicked({action: DatePickerAndroid.dismissedAction, year: 2016, month: 12, day: 12});
252+
datePicker.onDatetimePicked({action: '', year: 2016, month: 12, day: 12});
253+
datePicker.onDatetimeTimePicked(2016, 6, 1, {action: DatePickerAndroid.dismissedAction, hour: 12, minute: 10});
254+
datePicker.onDatetimeTimePicked(2016, 6, 1, {action: '', hour: 12, minute: 10});
255+
256+
expect(wrapper.state('date').getFullYear()).toEqual(2016);
257+
expect(wrapper.state('date').getMonth()).toEqual(6);
258+
expect(wrapper.state('date').getDate()).toEqual(1);
259+
expect(wrapper.state('date').getHours()).toEqual(12);
260+
expect(wrapper.state('date').getMinutes()).toEqual(10);
261+
expect(onDateChange).toHaveBeenCalledTimes(1);
262+
});
263+
264+
it('onPressDate', () => {
265+
Platform.OS = 'ios';
266+
const setModalVisible = jest.fn();
267+
const onOpenModal = jest.fn();
268+
const wrapper = shallow(
269+
<DatePicker date="2016-05-06" minDate="2016-04-01" maxDate="2016-06-01" onOpenModal={onOpenModal}/>
270+
);
271+
const datePicker = wrapper.instance();
272+
datePicker.setModalVisible = setModalVisible;
273+
274+
wrapper.setProps({disabled: true});
275+
datePicker.onPressDate();
276+
277+
expect(setModalVisible).toHaveBeenCalledTimes(0);
278+
279+
wrapper.setProps({disabled: false});
280+
datePicker.onPressDate();
281+
expect(wrapper.state('date')).toMatchObject(datePicker.getDate());
282+
expect(setModalVisible).toHaveBeenCalledTimes(1);
283+
expect(onOpenModal).toHaveBeenCalledTimes(1);
284+
285+
Platform.OS = 'android';
286+
expect(datePicker.onPressDate).not.toThrow(Error);
287+
288+
wrapper.setProps({mode: 'datetime'});
289+
expect(datePicker.onPressDate).not.toThrow(Error);
290+
291+
wrapper.setProps({mode: 'time'});
292+
expect(datePicker.onPressDate).not.toThrow(Error);
293+
294+
wrapper.setProps({mode: 'tttt'});
295+
expect(datePicker.onPressDate).toThrow(Error);
296+
});
297+
298+
it('panResponder', () => {
299+
Platform.OS = 'ios';
300+
const wrapper = shallow(<DatePicker date="2016-05-06" minDate="2016-04-01" maxDate="2016-06-01"/>);
301+
const datePicker = wrapper.instance();
302+
303+
datePicker.onPressDate();
304+
305+
expect(datePicker.onStartShouldSetResponder()).toEqual(true);
306+
expect(datePicker.onMoveShouldSetResponder()).toEqual(true);
307+
308+
expect(datePicker.props.modalOnResponderTerminationRequest()).toEqual(true);
309+
});
310+
311+
it('getTitleElement - with placeholder', () => {
312+
const placeholder = 'Please pick a date';
313+
const wrapper = shallow(<DatePicker placeholder={placeholder} />);
314+
const datePicker = wrapper.instance();
315+
316+
expect(datePicker.getTitleElement().props.children).toEqual(placeholder);
317+
});
318+
319+
it('getTitleElement - without placeholder', () => {
320+
const wrapper = shallow(<DatePicker date="2016-06-04" />);
321+
const datePicker = wrapper.instance();
322+
323+
expect(datePicker.getTitleElement().props.children).toEqual(datePicker.getDateStr());
324+
});
325+
326+
it('`date` prop changes', () => {
327+
const wrapper = shallow(<DatePicker date="2016-06-04" />);
328+
329+
expect(wrapper.state('date')).toMatchObject(new Date(2016, 5, 4));
330+
331+
wrapper.setProps({date: '2016-06-05'});
332+
333+
expect(wrapper.state('date')).toMatchObject(new Date(2016, 5, 5));
334+
});
335+
});
336+
337+
describe('Coverage', () => {
338+
339+
it('Event: onRequestClose', () => {
340+
Platform.OS = 'ios';
341+
const setModalVisible = jest.fn();
342+
const wrapper = shallow(<DatePicker />);
343+
const datePicker = wrapper.instance();
344+
datePicker.setModalVisible = setModalVisible;
345+
346+
wrapper.find(Modal).simulate('requestClose');
347+
348+
expect(setModalVisible).toHaveBeenCalledTimes(1);
349+
});
350+
351+
it('Event: onDateChange', () => {
352+
Platform.OS = 'ios';
353+
const wrapper = shallow(<DatePicker />);
354+
355+
wrapper.find('DatePickerIOS').simulate('dateChange');
356+
});
357+
});

__tests__/index.android.js

Lines changed: 0 additions & 12 deletions
This file was deleted.

__tests__/index.ios.js

Lines changed: 0 additions & 12 deletions
This file was deleted.

android/.gradle/2.4/taskArtifacts/cache.properties

Lines changed: 0 additions & 1 deletion
This file was deleted.
Binary file not shown.
-185 KB
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

0 commit comments

Comments
 (0)