Skip to content

Commit 22b951e

Browse files
authored
Incubator.Dialog - fix test (add mocks) (#2551)
* Incubator.Dialog - fix test (add mocks) * Change implementation of the Object.defineProperty mock
1 parent 3e37d40 commit 22b951e

File tree

3 files changed

+123
-10
lines changed

3 files changed

+123
-10
lines changed

GestureDetectorMock.tsx

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import React from 'react';
2+
import {TouchableOpacity} from 'react-native';
3+
4+
type Props = {
5+
gesture: any;
6+
children: any;
7+
};
8+
9+
export class GestureDetectorMock extends React.Component<Props> {
10+
render() {
11+
switch (this.props.gesture.type) {
12+
case 'tap':
13+
return (
14+
<TouchableOpacity
15+
onPress={() => {
16+
this.props.gesture._handlers.onTouchesDown();
17+
this.props.gesture._handlers.onEnd();
18+
this.props.gesture._handlers.onFinalize();
19+
}}
20+
>
21+
{this.props.children}
22+
</TouchableOpacity>
23+
);
24+
case 'pan':
25+
return (
26+
<TouchableOpacity
27+
onPress={() => {
28+
this.props.gesture._handlers.onStart({
29+
absoluteX: 0,
30+
absoluteY: 0,
31+
translationX: 0,
32+
translationY: 0,
33+
velocityX: 0,
34+
velocityY: 0,
35+
x: 0,
36+
y: 0
37+
});
38+
this.props.gesture._handlers.onUpdate({
39+
absoluteX: 0,
40+
absoluteY: 0,
41+
translationX: 0,
42+
translationY: 0,
43+
velocityX: 0,
44+
velocityY: 0,
45+
x: 0,
46+
y: 0
47+
});
48+
this.props.gesture._handlers.onEnd({
49+
absoluteX: 0,
50+
absoluteY: 0,
51+
translationX: 0,
52+
translationY: 0,
53+
velocityX: 0,
54+
velocityY: 0,
55+
x: 0,
56+
y: 0
57+
});
58+
}}
59+
>
60+
{this.props.children}
61+
</TouchableOpacity>
62+
);
63+
default:
64+
throw new Error(`Unhandled gesture of type: ${this.props.gesture.type}`);
65+
}
66+
}
67+
}

jest-setup.js

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,21 @@
11
import {NativeModules, AccessibilityInfo, Animated} from 'react-native';
2+
// ========= Mock Object.defineProperty to always allow overriding =========
3+
const originalDefineProperty = Object.defineProperty;
4+
Object.defineProperty = (obj, prop, desc) => {
5+
try {
6+
return originalDefineProperty(obj, prop, {...desc, configurable: true});
7+
} catch (e) {
8+
return originalDefineProperty(obj, prop, desc);
9+
}
10+
};
11+
Object.defineProperties = (obj, props) => {
12+
Object.keys(props).forEach(key => {
13+
Object.defineProperty(obj, key, props[key]);
14+
});
15+
return obj;
16+
};
17+
// =========================================================================
18+
219
global._UILIB_TESTING = true;
320

421
NativeModules.StatusBarManager = {getHeight: jest.fn()};
@@ -21,6 +38,26 @@ jest.mock('react-native-gesture-handler',
2138
() => {
2239
jest.requireActual('react-native-gesture-handler/jestSetup');
2340
const GestureHandler = jest.requireActual('react-native-gesture-handler');
41+
GestureHandler.Gesture.Tap = () => {
42+
const TapMock = {
43+
_handlers: {}
44+
};
45+
46+
const getDefaultMockedHandler = handlerName => handler => {
47+
if (typeof handler === 'function') {
48+
TapMock._handlers[handlerName] = handler;
49+
}
50+
return TapMock;
51+
};
52+
53+
TapMock.type = 'tap';
54+
TapMock.maxDuration = getDefaultMockedHandler('maxDuration');
55+
TapMock.onEnd = getDefaultMockedHandler('onEnd');
56+
TapMock.onFinalize = getDefaultMockedHandler('onFinalize');
57+
TapMock.onTouchesDown = getDefaultMockedHandler('onTouchesDown');
58+
return TapMock;
59+
};
60+
2461
GestureHandler.Gesture.Pan = () => {
2562
const PanMock = {
2663
_handlers: {}
@@ -33,13 +70,22 @@ jest.mock('react-native-gesture-handler',
3370
return PanMock;
3471
};
3572

73+
PanMock.type = 'pan';
3674
PanMock.onStart = getDefaultMockedHandler('onStart');
3775
PanMock.onUpdate = getDefaultMockedHandler('onUpdate');
3876
PanMock.onEnd = getDefaultMockedHandler('onEnd');
39-
PanMock.prepare = jest.fn();
77+
PanMock.initialize = jest.fn();
78+
PanMock.toGestureArray = jest.fn(() => {
79+
return [PanMock];
80+
});
4081
return PanMock;
4182
};
4283

84+
try {
85+
Object.defineProperty(GestureHandler, 'GestureDetector', {
86+
value: require('./GestureDetectorMock').GestureDetectorMock
87+
});
88+
} catch {}
4389
return GestureHandler;
4490
},
4591
{virtual: true});

src/incubator/Dialog/__tests__/index.spec.tsx

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React, {useCallback, useEffect, useState} from 'react';
22
import Button from '../../../components/button';
33
import View from '../../../components/view';
44
import Dialog from '../index';
5-
import {/* ButtonDriver, */ComponentDriver} from '../../../testkit';
5+
import {ButtonDriver, ComponentDriver} from '../../../testkit';
66

77
const onDismiss = () => {};
88

@@ -49,13 +49,13 @@ describe('Incubator.Dialog', () => {
4949
const component = _TestCase({onDismiss});
5050
const dialogDriver = new ComponentDriver({component, testID: 'dialog'});
5151
expect(await dialogDriver.exists()).toBeFalsy();
52-
// const openButtonDriver = new ButtonDriver({component, testID: 'openButton'});
53-
// await openButtonDriver.press();
54-
// expect(await dialogDriver.exists()).toBeTruthy();
55-
// expect(onDismiss).toHaveBeenCalledTimes(0);
56-
// const closeButtonDriver = new ButtonDriver({component, testID: 'closeButton'});
57-
// await closeButtonDriver.press();
58-
// expect(await dialogDriver.exists()).toBeFalsy();
59-
// expect(onDismiss).toHaveBeenCalledTimes(1);
52+
const openButtonDriver = new ButtonDriver({component, testID: 'openButton'});
53+
await openButtonDriver.press();
54+
expect(await dialogDriver.exists()).toBeTruthy();
55+
expect(onDismiss).toHaveBeenCalledTimes(0);
56+
const closeButtonDriver = new ButtonDriver({component, testID: 'closeButton'});
57+
await closeButtonDriver.press();
58+
expect(await dialogDriver.exists()).toBeFalsy();
59+
expect(onDismiss).toHaveBeenCalledTimes(1);
6060
});
6161
});

0 commit comments

Comments
 (0)