mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
41cbccd98d
Summary: I'm kicking this off to see what's the extent of failures we're going to get if we try to bump to React 18 inside RN OSS. This sync includes the following changes: - **[34aa5cfe0](https://github.com/facebook/react/commit/34aa5cfe0 )**: Update local package.jsons for 18 //<Andrew Clark>// - **[e7d0053e6](https://github.com/facebook/react/commit/e7d0053e6 )**: [fizz] Fix validateIterable call ([#24166](https://github.com/facebook/react/pull/24166)) //<salazarm>// - **[6b85823b3](https://github.com/facebook/react/commit/6b85823b3 )**: Clean up Selective Hydration / Event Replay flag ([#24156](https://github.com/facebook/react/pull/24156)) //<salazarm>// Changelog: [General][Changed] - React Native sync for revisions 1159ff6...34aa5cf jest_e2e[run_all_tests] Reviewed By: cortinico Differential Revision: D35504622 fbshipit-source-id: ad0f6b42b6e03d78cd5d6ba51ce5a5730d25b167
183 lines
5.5 KiB
JavaScript
183 lines
5.5 KiB
JavaScript
/**
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @emails oncall+react_native
|
|
* @format
|
|
* @flow-strict
|
|
*/
|
|
|
|
const React = require('react');
|
|
const ReactTestRenderer = require('react-test-renderer');
|
|
const TextInput = require('../TextInput');
|
|
const ReactNative = require('../../../Renderer/shims/ReactNative');
|
|
|
|
const {
|
|
enter,
|
|
expectRendersMatchingSnapshot,
|
|
} = require('../../../Utilities/ReactNativeTestTools');
|
|
|
|
jest.unmock('../TextInput');
|
|
|
|
describe('TextInput tests', () => {
|
|
let input;
|
|
let inputRef;
|
|
let onChangeListener;
|
|
let onChangeTextListener;
|
|
const initialValue = 'initialValue';
|
|
beforeEach(() => {
|
|
inputRef = React.createRef(null);
|
|
onChangeListener = jest.fn();
|
|
onChangeTextListener = jest.fn();
|
|
function TextInputWrapper() {
|
|
const [state, setState] = React.useState({text: initialValue});
|
|
|
|
return (
|
|
<TextInput
|
|
ref={inputRef}
|
|
value={state.text}
|
|
onChangeText={text => {
|
|
onChangeTextListener(text);
|
|
setState({text});
|
|
}}
|
|
onChange={event => {
|
|
onChangeListener(event);
|
|
}}
|
|
/>
|
|
);
|
|
}
|
|
const renderTree = ReactTestRenderer.create(<TextInputWrapper />);
|
|
input = renderTree.root.findByType(TextInput);
|
|
});
|
|
it('has expected instance functions', () => {
|
|
expect(inputRef.current.isFocused).toBeInstanceOf(Function); // Would have prevented S168585
|
|
expect(inputRef.current.clear).toBeInstanceOf(Function);
|
|
expect(inputRef.current.focus).toBeInstanceOf(jest.fn().constructor);
|
|
expect(inputRef.current.blur).toBeInstanceOf(jest.fn().constructor);
|
|
expect(inputRef.current.setNativeProps).toBeInstanceOf(
|
|
jest.fn().constructor,
|
|
);
|
|
expect(inputRef.current.measure).toBeInstanceOf(jest.fn().constructor);
|
|
expect(inputRef.current.measureInWindow).toBeInstanceOf(
|
|
jest.fn().constructor,
|
|
);
|
|
expect(inputRef.current.measureLayout).toBeInstanceOf(
|
|
jest.fn().constructor,
|
|
);
|
|
});
|
|
it('calls onChange callbacks', () => {
|
|
expect(input.props.value).toBe(initialValue);
|
|
const message = 'This is a test message';
|
|
ReactTestRenderer.act(() => {
|
|
enter(input, message);
|
|
});
|
|
expect(input.props.value).toBe(message);
|
|
expect(onChangeTextListener).toHaveBeenCalledWith(message);
|
|
expect(onChangeListener).toHaveBeenCalledWith({
|
|
nativeEvent: {text: message},
|
|
});
|
|
});
|
|
|
|
function createTextInput(extraProps) {
|
|
const textInputRef = React.createRef(null);
|
|
ReactTestRenderer.create(
|
|
<TextInput ref={textInputRef} value="value1" {...extraProps} />,
|
|
);
|
|
return textInputRef;
|
|
}
|
|
|
|
it('focus() should not do anything if the TextInput is not editable', () => {
|
|
const textInputRef = createTextInput({editable: false});
|
|
// currentProps is the property actually containing props at runtime
|
|
textInputRef.current.currentProps = textInputRef.current.props;
|
|
expect(textInputRef.current.isFocused()).toBe(false);
|
|
|
|
TextInput.State.focusTextInput(textInputRef.current);
|
|
expect(textInputRef.current.isFocused()).toBe(false);
|
|
});
|
|
|
|
it('should have support for being focused and blurred', () => {
|
|
const textInputRef = createTextInput();
|
|
|
|
expect(textInputRef.current.isFocused()).toBe(false);
|
|
ReactNative.findNodeHandle = jest.fn().mockImplementation(ref => {
|
|
if (ref == null) {
|
|
return null;
|
|
}
|
|
|
|
if (
|
|
ref === textInputRef.current ||
|
|
ref === textInputRef.current.getNativeRef()
|
|
) {
|
|
return 1;
|
|
}
|
|
|
|
return 2;
|
|
});
|
|
|
|
TextInput.State.focusTextInput(textInputRef.current);
|
|
expect(textInputRef.current.isFocused()).toBe(true);
|
|
expect(TextInput.State.currentlyFocusedInput()).toBe(textInputRef.current);
|
|
|
|
TextInput.State.blurTextInput(textInputRef.current);
|
|
expect(textInputRef.current.isFocused()).toBe(false);
|
|
expect(TextInput.State.currentlyFocusedInput()).toBe(null);
|
|
});
|
|
|
|
it('should unfocus when other TextInput is focused', () => {
|
|
const textInputRe1 = React.createRef(null);
|
|
const textInputRe2 = React.createRef(null);
|
|
|
|
ReactTestRenderer.create(
|
|
<>
|
|
<TextInput ref={textInputRe1} value="value1" />
|
|
<TextInput ref={textInputRe2} value="value2" />
|
|
</>,
|
|
);
|
|
ReactNative.findNodeHandle = jest.fn().mockImplementation(ref => {
|
|
if (
|
|
ref === textInputRe1.current ||
|
|
ref === textInputRe1.current.getNativeRef()
|
|
) {
|
|
return 1;
|
|
}
|
|
|
|
if (
|
|
ref === textInputRe2.current ||
|
|
ref === textInputRe2.current.getNativeRef()
|
|
) {
|
|
return 2;
|
|
}
|
|
|
|
return 3;
|
|
});
|
|
|
|
expect(textInputRe1.current.isFocused()).toBe(false);
|
|
expect(textInputRe2.current.isFocused()).toBe(false);
|
|
|
|
TextInput.State.focusTextInput(textInputRe1.current);
|
|
|
|
expect(textInputRe1.current.isFocused()).toBe(true);
|
|
expect(textInputRe2.current.isFocused()).toBe(false);
|
|
expect(TextInput.State.currentlyFocusedInput()).toBe(textInputRe1.current);
|
|
|
|
TextInput.State.focusTextInput(textInputRe2.current);
|
|
|
|
expect(textInputRe1.current.isFocused()).toBe(false);
|
|
expect(textInputRe2.current.isFocused()).toBe(true);
|
|
expect(TextInput.State.currentlyFocusedInput()).toBe(textInputRe2.current);
|
|
});
|
|
|
|
it('should render as expected', () => {
|
|
expectRendersMatchingSnapshot(
|
|
'TextInput',
|
|
() => <TextInput />,
|
|
() => {
|
|
jest.dontMock('../TextInput');
|
|
},
|
|
);
|
|
});
|
|
});
|