Skip to content

Commit fa094b8

Browse files
committed
feat(suite-native): introduce component tests with redux
1 parent 5f31ffb commit fa094b8

File tree

13 files changed

+112
-31
lines changed

13 files changed

+112
-31
lines changed

jest.config.native.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,15 @@ module.exports = {
2424
'\\.(js|jsx|ts|tsx)$': ['babel-jest', babelConfig],
2525
},
2626
transformIgnorePatterns: [
27-
'node_modules/(?!((jest-)?react-native|@react-native(-community)?)|expo(nent)?|@expo(nent)?/.*|@expo-google-fonts/.*|react-navigation|@react-navigation/.*|@sentry/react-native|native-base|react-native-svg)',
27+
'node_modules/(?!((jest-)?react-native|@react-native(-community)?)|expo(nent)?|@expo(nent)?/.*|@expo-google-fonts/.*|react-navigation|@react-navigation/.*|@sentry/react-native|native-base|react-native-svg|@shopify/react-native-skia)',
2828
],
2929
setupFiles: [
3030
'<rootDir>/../../node_modules/@shopify/react-native-skia/jestSetup.js',
3131
'<rootDir>/../../node_modules/react-native-gesture-handler/jestSetup.js',
3232
'<rootDir>/../../suite-native/test-utils/src/atomsMock.js',
3333
'<rootDir>/../../suite-native/test-utils/src/expoMock.js',
34+
'<rootDir>/../../suite-native/firmware/src/jestSetup.js',
35+
'<rootDir>/../../suite-native/connection-status/src/jestSetup.js',
36+
'<rootDir>/../../suite-native/react-native-graph/src/jestSetup.js',
3437
],
3538
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { renderWithStore, waitFor } from '@suite-native/test-utils';
2+
3+
import { AppTabNavigator } from '../AppTabNavigator';
4+
5+
describe('AppTabNavigator', () => {
6+
it('should render 3 buttons', async () => {
7+
const { getByText } = renderWithStore(<AppTabNavigator />);
8+
await waitFor(() => expect(getByText('Home')).toBeDefined());
9+
10+
expect(getByText('Home')).toBeDefined();
11+
expect(getByText('My assets')).toBeDefined();
12+
expect(getByText('Settings')).toBeDefined();
13+
});
14+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import mockRNCNetInfo from '@react-native-community/netinfo/jest/netinfo-mock.js';
2+
3+
jest.mock('@react-native-community/netinfo', () => mockRNCNetInfo);
+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
jest.mock('@suite-native/firmware', () => ({
2+
...jest.requireActual('./nativeFirmwareSlice'),
3+
...jest.requireActual('./hooks/useIsFirmwareUpdateFeatureEnabled'),
4+
UpdateProgressIndicatorDemo: () => null,
5+
FirmwareUpdateInProgressScreen: () => null,
6+
}));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
jest.mock('@suite-native/react-native-graph', () => ({}));

suite-native/test-utils/package.json

+4-1
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,12 @@
1010
"type-check": "yarn g:tsc --build"
1111
},
1212
"dependencies": {
13+
"@react-navigation/native": "6.1.18",
14+
"@reduxjs/toolkit": "1.9.5",
1315
"@testing-library/react-native": "13.0.0",
1416
"@trezor/styles": "workspace:*",
1517
"@trezor/theme": "workspace:*",
16-
"react": "18.2.0"
18+
"react": "18.2.0",
19+
"react-redux": "8.0.7"
1720
}
1821
}

suite-native/test-utils/redux.d.ts

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { AsyncThunkAction } from '@reduxjs/toolkit';
2+
3+
declare module 'redux' {
4+
export interface Dispatch<A extends Action = AnyAction> {
5+
<TThunk extends AsyncThunkAction<any, any, any>>(thunk: TThunk): ReturnType<TThunk>;
6+
7+
<ReturnType = any, State = any, ExtraThunkArg = any>(
8+
thunkAction: ThunkAction<ReturnType, State, ExtraThunkArg, A>,
9+
): ReturnType;
10+
}
11+
}
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,22 @@
11
import { ReactNode } from 'react';
22

3+
import { NavigationContainer } from '@react-navigation/native';
4+
35
import { createRenderer, StylesProvider } from '@trezor/styles';
46
import { prepareNativeTheme } from '@trezor/theme';
57
import { IntlProvider } from '@suite-native/intl';
68

79
type ProviderProps = {
810
children: ReactNode;
911
};
12+
1013
const renderer = createRenderer();
1114
const theme = prepareNativeTheme({ colorVariant: 'standard' });
1215

13-
export const Provider = ({ children }: ProviderProps) => (
16+
export const BasicProvider = ({ children }: ProviderProps) => (
1417
<IntlProvider>
1518
<StylesProvider theme={theme} renderer={renderer}>
16-
{children}
19+
<NavigationContainer>{children}</NavigationContainer>
1720
</StylesProvider>
1821
</IntlProvider>
1922
);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { ReactNode } from 'react';
2+
3+
import { StoreProvider } from '@suite-native/state';
4+
5+
import { BasicProvider } from './BasicProvider';
6+
7+
type ProviderProps = {
8+
children: ReactNode;
9+
};
10+
11+
export const ReduxProvider = ({ children }: ProviderProps) => (
12+
<StoreProvider>
13+
<BasicProvider>{children}</BasicProvider>
14+
</StoreProvider>
15+
);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { ReactElement } from 'react';
2+
3+
import { render, RenderOptions } from '@testing-library/react-native';
4+
5+
export const createRender =
6+
(Provider: NonNullable<RenderOptions['wrapper']>) =>
7+
<T,>(
8+
element: ReactElement<T>,
9+
{ wrapper: WrapperComponent, ...options }: RenderOptions = {},
10+
) => {
11+
const wrapperWithProvider = WrapperComponent
12+
? ({ children }: { children: ReactElement }) => (
13+
<Provider>
14+
<WrapperComponent>{children}</WrapperComponent>
15+
</Provider>
16+
)
17+
: Provider;
18+
19+
return render(element, {
20+
wrapper: wrapperWithProvider,
21+
...options,
22+
});
23+
};

suite-native/test-utils/src/expoMock.js

+2
Original file line numberDiff line numberDiff line change
@@ -401,3 +401,5 @@ jest.mock('expo-constants', () => {
401401

402402
return Constants;
403403
});
404+
405+
jest.mock('redux-devtools-expo-dev-plugin', () => () => next => next);

suite-native/test-utils/src/index.tsx

+7-27
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,6 @@
1-
import { ReactElement } from 'react';
2-
3-
import { render as origRender } from '@testing-library/react-native';
4-
5-
import { Provider } from './Provider';
6-
7-
type Parameters<TParams> = TParams extends (...args: infer TParamsInferred) => any
8-
? TParamsInferred
9-
: never;
10-
11-
export const render = (
12-
element: ReactElement,
13-
{ wrapper: WrapperComponent, ...options }: Parameters<typeof origRender>[1] = {},
14-
): ReturnType<typeof origRender> => {
15-
const wrapperWithProvider = WrapperComponent
16-
? ({ children }: { children: ReactElement }) => (
17-
<Provider>
18-
<WrapperComponent>{children}</WrapperComponent>
19-
</Provider>
20-
)
21-
: Provider;
22-
23-
return origRender(element, {
24-
wrapper: wrapperWithProvider,
25-
...options,
26-
});
27-
};
1+
import { createRender } from './createRender';
2+
import { BasicProvider } from './BasicProvider';
3+
import { ReduxProvider } from './ReduxProvider';
284

295
export {
306
act,
@@ -35,3 +11,7 @@ export {
3511
waitFor,
3612
waitForElementToBeRemoved,
3713
} from '@testing-library/react-native';
14+
15+
export const render = createRender(BasicProvider);
16+
17+
export const renderWithStore = createRender(ReduxProvider);

yarn.lock

+17
Original file line numberDiff line numberDiff line change
@@ -10946,6 +10946,20 @@ __metadata:
1094610946
languageName: unknown
1094710947
linkType: soft
1094810948

10949+
"@suite-native/module-trading@workspace:suite-native/module-trading":
10950+
version: 0.0.0-use.local
10951+
resolution: "@suite-native/module-trading@workspace:suite-native/module-trading"
10952+
dependencies:
10953+
"@react-navigation/native-stack": "npm:6.11.0"
10954+
"@reduxjs/toolkit": "npm:1.9.5"
10955+
"@suite-native/navigation": "workspace:*"
10956+
"@trezor/styles": "workspace:*"
10957+
react: "npm:18.2.0"
10958+
react-native: "npm:0.76.1"
10959+
react-native-reanimated: "npm:^3.16.7"
10960+
languageName: unknown
10961+
linkType: soft
10962+
1094910963
"@suite-native/navigation@workspace:*, @suite-native/navigation@workspace:suite-native/navigation":
1095010964
version: 0.0.0-use.local
1095110965
resolution: "@suite-native/navigation@workspace:suite-native/navigation"
@@ -11171,10 +11185,13 @@ __metadata:
1117111185
version: 0.0.0-use.local
1117211186
resolution: "@suite-native/test-utils@workspace:suite-native/test-utils"
1117311187
dependencies:
11188+
"@react-navigation/native": "npm:6.1.18"
11189+
"@reduxjs/toolkit": "npm:1.9.5"
1117411190
"@testing-library/react-native": "npm:13.0.0"
1117511191
"@trezor/styles": "workspace:*"
1117611192
"@trezor/theme": "workspace:*"
1117711193
react: "npm:18.2.0"
11194+
react-redux: "npm:8.0.7"
1117811195
languageName: unknown
1117911196
linkType: soft
1118011197

0 commit comments

Comments
 (0)