import React, { Component } from 'react'; import { StyleSheet, View } from 'react-native'; import renderer from 'react-test-renderer'; import { withNavigation } from 'react-navigation'; import createStackNavigator from '../createStackNavigator'; import createAppContainer, { _TESTING_ONLY_reset_container_count, // @ts-ignore } from '../../../../native/src/createAppContainer'; import { StackNavigationProp } from '../../vendor/types'; const NavigationTestUtils = { resetInternalState: _TESTING_ONLY_reset_container_count, }; const styles = StyleSheet.create({ header: { opacity: 0.5, }, }); class HomeScreen extends Component { static navigationOptions = ({ navigation, }: { navigation: StackNavigationProp; }) => ({ title: `Welcome ${ navigation.state.params ? navigation.state.params.user : 'anonymous' }`, gestureEnabled: true, headerStyle: [{ backgroundColor: 'red' }, styles.header], }); render() { return null; } } const routeConfig = { Home: { screen: HomeScreen, }, }; describe('StackNavigator', () => { beforeEach(() => { NavigationTestUtils.resetInternalState(); }); it('renders successfully', () => { const MyStackNavigator = createStackNavigator(routeConfig); const App = createAppContainer(MyStackNavigator); const rendered = renderer.create().toJSON(); expect(rendered).toMatchSnapshot(); }); it('applies correct values when headerRight is present', () => { const MyStackNavigator = createStackNavigator({ Home: { screen: HomeScreen, navigationOptions: { headerRight: () => , }, }, }); const App = createAppContainer(MyStackNavigator); const rendered = renderer.create().toJSON(); expect(rendered).toMatchSnapshot(); }); it('passes navigation to headerRight when wrapped in withNavigation', () => { const spy = jest.fn(); class TestComponent extends React.Component<{ onPress: (navigation: StackNavigationProp) => undefined; navigation: StackNavigationProp; }> { render() { return {this.props.onPress(this.props.navigation)}; } } const TestComponentWithNavigation = withNavigation(TestComponent); class A extends React.Component { static navigationOptions = { headerRight: () => , }; render() { return ; } } const Nav = createStackNavigator({ A: { screen: A } }); const App = createAppContainer(Nav); renderer.create(); expect(spy).toBeCalledWith( expect.objectContaining({ navigate: expect.any(Function), addListener: expect.any(Function), }) ); }); });