mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
1ed352517a
Summary: This commit more clearly defines the mocks RN sets up and uses paths instead of Haste names to define the mocks. The Jest setup script defined mocks for native modules (Obj-C, Java) and mocks for JS modules in the same data structure. This meant that some non-native modules (that is, JS modules) were in the `mockNativeModules` map -- this commit splits them out and mocks them in typical `jest.mock` fashion. Additionally, the setup script used to mock the modules using the Haste names. As one of the steps toward migrating to standard path-based imports, the setup script now mocks JS modules using paths (native modules don't need a Haste name nor path since they are just entries in `NativeModules`). This gets us closer to being able to remove `hasteImpl`. (Tracking in https://github.com/facebook/react-native/issues/24772.) Also, this commit removes mocks that are not referenced anywhere in the RN and React repositories (grepped for the names and found no entries outside of the Jest setup scripts). ## Changelog [General] [Changed] - Explicitly separate mocked native modules from mocked JS modules Pull Request resolved: https://github.com/facebook/react-native/pull/24809 Differential Revision: D15316882 Pulled By: cpojer fbshipit-source-id: 039e4e320121bea9580196fe0a091b8b1e8b41bf
330 lines
9.4 KiB
JavaScript
330 lines
9.4 KiB
JavaScript
/**
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @format
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
const MockNativeMethods = jest.requireActual('./MockNativeMethods');
|
|
const mockComponent = jest.requireActual('./mockComponent');
|
|
|
|
jest.requireActual('../Libraries/polyfills/Object.es7.js');
|
|
jest.requireActual('../Libraries/polyfills/error-guard');
|
|
|
|
global.__DEV__ = true;
|
|
|
|
global.Promise = jest.requireActual('promise');
|
|
global.regeneratorRuntime = jest.requireActual('regenerator-runtime/runtime');
|
|
|
|
global.requestAnimationFrame = function(callback) {
|
|
return setTimeout(callback, 0);
|
|
};
|
|
global.cancelAnimationFrame = function(id) {
|
|
clearTimeout(id);
|
|
};
|
|
|
|
jest.mock('../Libraries/Core/Devtools/setupDevtools');
|
|
|
|
// there's a __mock__ for it.
|
|
jest.setMock(
|
|
'../Libraries/vendor/core/ErrorUtils',
|
|
require('../Libraries/vendor/core/ErrorUtils'),
|
|
);
|
|
|
|
jest
|
|
.mock('../Libraries/Core/InitializeCore', () => {})
|
|
.mock('../Libraries/ReactNative/UIManager', () => ({
|
|
AndroidViewPager: {
|
|
Commands: {
|
|
setPage: jest.fn(),
|
|
setPageWithoutAnimation: jest.fn(),
|
|
},
|
|
},
|
|
blur: jest.fn(),
|
|
createView: jest.fn(),
|
|
customBubblingEventTypes: {},
|
|
customDirectEventTypes: {},
|
|
dispatchViewManagerCommand: jest.fn(),
|
|
focus: jest.fn(),
|
|
getViewManagerConfig: jest.fn(name => {
|
|
if (name === 'AndroidDrawerLayout') {
|
|
return {
|
|
Constants: {
|
|
DrawerPosition: {
|
|
Left: 10,
|
|
},
|
|
},
|
|
};
|
|
}
|
|
}),
|
|
measure: jest.fn(),
|
|
manageChildren: jest.fn(),
|
|
removeSubviewsFromContainerWithID: jest.fn(),
|
|
replaceExistingNonRootView: jest.fn(),
|
|
setChildren: jest.fn(),
|
|
updateView: jest.fn(),
|
|
AndroidDrawerLayout: {
|
|
Constants: {
|
|
DrawerPosition: {
|
|
Left: 10,
|
|
},
|
|
},
|
|
},
|
|
AndroidTextInput: {
|
|
Commands: {},
|
|
},
|
|
ScrollView: {
|
|
Constants: {},
|
|
},
|
|
View: {
|
|
Constants: {},
|
|
},
|
|
}))
|
|
.mock('../Libraries/Image/Image', () =>
|
|
mockComponent('../Libraries/Image/Image'),
|
|
)
|
|
.mock('../Libraries/Text/Text', () =>
|
|
mockComponent('../Libraries/Text/Text', MockNativeMethods),
|
|
)
|
|
.mock('../Libraries/Components/TextInput/TextInput', () =>
|
|
mockComponent('../Libraries/Components/TextInput/TextInput'),
|
|
)
|
|
.mock('../Libraries/Modal/Modal', () =>
|
|
mockComponent('../Libraries/Modal/Modal'),
|
|
)
|
|
.mock('../Libraries/Components/View/View', () =>
|
|
mockComponent('../Libraries/Components/View/View', MockNativeMethods),
|
|
)
|
|
.mock('../Libraries/Components/AccessibilityInfo/AccessibilityInfo', () => ({
|
|
addEventListener: jest.fn(),
|
|
announceForAccessibility: jest.fn(),
|
|
fetch: jest.fn(),
|
|
isBoldTextEnabled: jest.fn(),
|
|
isGrayscaleEnabled: jest.fn(),
|
|
isInvertColorsEnabled: jest.fn(),
|
|
isReduceMotionEnabled: jest.fn(),
|
|
isReduceTransparencyEnabled: jest.fn(),
|
|
isScreenReaderEnabled: jest.fn(),
|
|
removeEventListener: jest.fn(),
|
|
setAccessibilityFocus: jest.fn(),
|
|
}))
|
|
.mock('../Libraries/Components/RefreshControl/RefreshControl', () =>
|
|
jest.requireActual(
|
|
'../Libraries/Components/RefreshControl/__mocks__/RefreshControlMock',
|
|
),
|
|
)
|
|
.mock('../Libraries/Components/ScrollView/ScrollView', () =>
|
|
jest.requireActual(
|
|
'../Libraries/Components/ScrollView/__mocks__/ScrollViewMock',
|
|
),
|
|
)
|
|
.mock('../Libraries/Components/ActivityIndicator/ActivityIndicator', () =>
|
|
mockComponent(
|
|
'../Libraries/Components/ActivityIndicator/ActivityIndicator',
|
|
),
|
|
)
|
|
.mock('../Libraries/Animated/src/AnimatedImplementation', () => {
|
|
const AnimatedImplementation = jest.requireActual(
|
|
'../Libraries/Animated/src/AnimatedImplementation',
|
|
);
|
|
const oldCreate = AnimatedImplementation.createAnimatedComponent;
|
|
AnimatedImplementation.createAnimatedComponent = function(
|
|
Component,
|
|
defaultProps,
|
|
) {
|
|
const Wrapped = oldCreate(Component, defaultProps);
|
|
Wrapped.__skipSetNativeProps_FOR_TESTS_ONLY = true;
|
|
return Wrapped;
|
|
};
|
|
return AnimatedImplementation;
|
|
})
|
|
.mock('../Libraries/AppState/AppState', () => ({
|
|
addEventListener: jest.fn(),
|
|
removeEventListener: jest.fn(),
|
|
}))
|
|
.mock('../Libraries/Linking/Linking', () => ({
|
|
openURL: jest.fn(),
|
|
canOpenURL: jest.fn(() => Promise.resolve(true)),
|
|
openSettings: jest.fn(),
|
|
addEventListener: jest.fn(),
|
|
getInitialURL: jest.fn(() => Promise.resolve()),
|
|
removeEventListener: jest.fn(),
|
|
sendIntent: jest.fn(),
|
|
}))
|
|
.mock('../Libraries/Renderer/shims/ReactNative', () => {
|
|
const ReactNative = jest.requireActual(
|
|
'../Libraries/Renderer/shims/ReactNative',
|
|
);
|
|
const NativeMethodsMixin =
|
|
ReactNative.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED
|
|
.NativeMethodsMixin;
|
|
|
|
Object.assign(NativeMethodsMixin, MockNativeMethods);
|
|
Object.assign(ReactNative.NativeComponent.prototype, MockNativeMethods);
|
|
|
|
return ReactNative;
|
|
})
|
|
.mock('../Libraries/Components/Touchable/ensureComponentIsNative', () => () =>
|
|
true,
|
|
)
|
|
// Mock modules defined by the native layer (ex: Objective-C, Java)
|
|
.mock('../Libraries/BatchedBridge/NativeModules', () => ({
|
|
AlertManager: {
|
|
alertWithArgs: jest.fn(),
|
|
},
|
|
AsyncLocalStorage: {
|
|
multiGet: jest.fn((keys, callback) =>
|
|
process.nextTick(() => callback(null, [])),
|
|
),
|
|
multiSet: jest.fn((entries, callback) =>
|
|
process.nextTick(() => callback(null)),
|
|
),
|
|
multiRemove: jest.fn((keys, callback) =>
|
|
process.nextTick(() => callback(null)),
|
|
),
|
|
multiMerge: jest.fn((entries, callback) =>
|
|
process.nextTick(() => callback(null)),
|
|
),
|
|
clear: jest.fn(callback => process.nextTick(() => callback(null))),
|
|
getAllKeys: jest.fn(callback =>
|
|
process.nextTick(() => callback(null, [])),
|
|
),
|
|
},
|
|
Clipboard: {
|
|
getString: jest.fn(() => ''),
|
|
setString: jest.fn(),
|
|
},
|
|
DeviceInfo: {
|
|
getConstants() {
|
|
return {
|
|
Dimensions: {
|
|
window: {
|
|
fontScale: 2,
|
|
height: 1334,
|
|
scale: 2,
|
|
width: 750,
|
|
},
|
|
screen: {
|
|
fontScale: 2,
|
|
height: 1334,
|
|
scale: 2,
|
|
width: 750,
|
|
},
|
|
},
|
|
};
|
|
},
|
|
},
|
|
ImageLoader: {
|
|
getSize: jest.fn(url => Promise.resolve({width: 320, height: 240})),
|
|
prefetchImage: jest.fn(),
|
|
},
|
|
ImageViewManager: {
|
|
getSize: jest.fn((uri, success) =>
|
|
process.nextTick(() => success(320, 240)),
|
|
),
|
|
prefetchImage: jest.fn(),
|
|
},
|
|
KeyboardObserver: {
|
|
addListener: jest.fn(),
|
|
removeListeners: jest.fn(),
|
|
},
|
|
Networking: {
|
|
sendRequest: jest.fn(),
|
|
abortRequest: jest.fn(),
|
|
addListener: jest.fn(),
|
|
removeListeners: jest.fn(),
|
|
},
|
|
PlatformConstants: {
|
|
getConstants() {
|
|
return {};
|
|
},
|
|
},
|
|
PushNotificationManager: {
|
|
presentLocalNotification: jest.fn(),
|
|
scheduleLocalNotification: jest.fn(),
|
|
cancelAllLocalNotifications: jest.fn(),
|
|
removeAllDeliveredNotifications: jest.fn(),
|
|
getDeliveredNotifications: jest.fn(callback =>
|
|
process.nextTick(() => []),
|
|
),
|
|
removeDeliveredNotifications: jest.fn(),
|
|
setApplicationIconBadgeNumber: jest.fn(),
|
|
getApplicationIconBadgeNumber: jest.fn(callback =>
|
|
process.nextTick(() => callback(0)),
|
|
),
|
|
cancelLocalNotifications: jest.fn(),
|
|
getScheduledLocalNotifications: jest.fn(callback =>
|
|
process.nextTick(() => callback()),
|
|
),
|
|
requestPermissions: jest.fn(() =>
|
|
Promise.resolve({alert: true, badge: true, sound: true}),
|
|
),
|
|
abandonPermissions: jest.fn(),
|
|
checkPermissions: jest.fn(callback =>
|
|
process.nextTick(() =>
|
|
callback({alert: true, badge: true, sound: true}),
|
|
),
|
|
),
|
|
getInitialNotification: jest.fn(() => Promise.resolve(null)),
|
|
addListener: jest.fn(),
|
|
removeListeners: jest.fn(),
|
|
},
|
|
SourceCode: {
|
|
getConstants() {
|
|
return {
|
|
scriptURL: null,
|
|
};
|
|
},
|
|
},
|
|
StatusBarManager: {
|
|
HEIGHT: 42,
|
|
setColor: jest.fn(),
|
|
setStyle: jest.fn(),
|
|
setHidden: jest.fn(),
|
|
setNetworkActivityIndicatorVisible: jest.fn(),
|
|
setBackgroundColor: jest.fn(),
|
|
setTranslucent: jest.fn(),
|
|
},
|
|
Timing: {
|
|
createTimer: jest.fn(),
|
|
deleteTimer: jest.fn(),
|
|
},
|
|
UIManager: {},
|
|
BlobModule: {
|
|
getConstants: () => ({BLOB_URI_SCHEME: 'content', BLOB_URI_HOST: null}),
|
|
addNetworkingHandler: jest.fn(),
|
|
enableBlobSupport: jest.fn(),
|
|
disableBlobSupport: jest.fn(),
|
|
createFromParts: jest.fn(),
|
|
sendBlob: jest.fn(),
|
|
release: jest.fn(),
|
|
},
|
|
WebSocketModule: {
|
|
connect: jest.fn(),
|
|
send: jest.fn(),
|
|
sendBinary: jest.fn(),
|
|
ping: jest.fn(),
|
|
close: jest.fn(),
|
|
addListener: jest.fn(),
|
|
removeListeners: jest.fn(),
|
|
},
|
|
}))
|
|
.mock('../Libraries/ReactNative/requireNativeComponent', () => {
|
|
const React = require('react');
|
|
|
|
return viewName =>
|
|
class extends React.Component {
|
|
render() {
|
|
return React.createElement(viewName, this.props, this.props.children);
|
|
}
|
|
};
|
|
})
|
|
.mock(
|
|
'../Libraries/Utilities/verifyComponentAttributeEquivalence',
|
|
() => function() {},
|
|
);
|