-
Notifications
You must be signed in to change notification settings - Fork 1
/
App.js
144 lines (111 loc) · 3.63 KB
/
App.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
import React from 'react';
import { Alert } from 'react-native';
import { render } from 'react-native-testing-library';
import App from '../App';
import {
EXPIRED_ACCESS_TOKEN,
INVALID_ACCESS_TOKEN,
INVALID_GRANT,
NETWORK_REQUEST_FAILED,
} from '../constants';
import * as auth from '../actions/auth/auth';
import locale from '../i18n/locales/en-US';
import { rollbar } from '../utils/rollbar.config';
jest.mock('react-native-default-preference', () => ({
get: jest.fn().mockReturnValue(Promise.reject()),
}));
global.window = {};
const logoutResponse = { type: 'logged out' };
auth.logout = jest.fn().mockReturnValue(logoutResponse);
const { youreOffline, connectToInternet } = locale.offline;
const lastTwoArgs = [
[{ text: 'Ok', onPress: expect.anything() }],
{ onDismiss: expect.anything() },
];
beforeEach(() =>
(Alert.alert = jest
.fn()
.mockImplementation((_, __, buttons) => buttons[0].onPress())));
const testUnhandledRejection = response => {
render(<App />);
window.onunhandledrejection({ reason: response });
};
it('shows offline alert if network request failed', () => {
testUnhandledRejection({ apiError: { message: NETWORK_REQUEST_FAILED } });
expect(Alert.alert).toHaveBeenCalledWith(
youreOffline,
connectToInternet,
...lastTwoArgs,
);
});
it('should not show alert for expired access token', () => {
testUnhandledRejection({
apiError: { errors: [{ detail: EXPIRED_ACCESS_TOKEN }] },
});
expect(Alert.alert).not.toHaveBeenCalled();
});
it('should not show alert for invalid access token', () => {
testUnhandledRejection({
apiError: { errors: [{ detail: INVALID_ACCESS_TOKEN }] },
});
expect(Alert.alert).not.toHaveBeenCalled();
});
it('should not show alert for invalid grant', () => {
testUnhandledRejection({ apiError: { error: INVALID_GRANT } });
expect(Alert.alert).not.toHaveBeenCalled();
});
it('should not show alert if not ApiError', () => {
const message = 'some message\nwith break';
testUnhandledRejection({ key: 'test', method: '', message });
expect(Alert.alert).not.toHaveBeenCalled();
});
it('should not show alert if no error message', () => {
const unknownError = { key: 'test', method: '' };
testUnhandledRejection(unknownError);
expect(Alert.alert).not.toHaveBeenCalled();
});
describe('__DEV__ === false', () => {
let dev;
beforeAll(() => {
dev = __DEV__;
__DEV__ = false;
});
afterAll(() => {
__DEV__ = dev;
});
it('Sends Rollbar report for API error', () => {
const apiError = {
apiError: { message: 'Error Text' },
key: 'ADD_NEW_PERSON',
method: 'POST',
endpoint: 'apis/v4/people',
query: { filters: { organization_ids: '1' } },
};
testUnhandledRejection(apiError);
expect(rollbar.error).toHaveBeenCalledWith(
Error(
`API Error: ${apiError.key} ${apiError.method.toUpperCase()} ${
apiError.endpoint
}\n\nQuery Params:\n${JSON.stringify(
apiError.query,
null,
2,
)}\n\nResponse:\n${JSON.stringify(apiError.apiError, null, 2)}`,
),
);
});
it('Sends Rollbar report for JS Error', () => {
const errorName = 'Error Name';
const errorDetails = 'Error Details';
const error = Error(`${errorName}\n${errorDetails}`);
testUnhandledRejection(error);
expect(rollbar.error).toHaveBeenCalledWith(error);
});
it('Sends Rollbar report for unknown error', () => {
const unknownError = { key: 'test', method: '' };
testUnhandledRejection(unknownError);
expect(rollbar.error).toHaveBeenCalledWith(
Error(`Unknown Error:\n${JSON.stringify(unknownError, null, 2)}`),
);
});
});