-
Notifications
You must be signed in to change notification settings - Fork 285
Expand file tree
/
Copy patherrors.test.ts
More file actions
139 lines (112 loc) · 3.79 KB
/
errors.test.ts
File metadata and controls
139 lines (112 loc) · 3.79 KB
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
import { AxiosError, type AxiosResponse } from 'axios';
import { EVENTS } from '../../../shared/events';
import type { Link } from '../../types';
import type { GitHubRESTError } from '../../typesGitHub';
import { Errors } from '../errors';
import { determineFailureType } from './errors';
describe('renderer/utils/api/errors.ts', () => {
it('network error', async () => {
const mockError: Partial<AxiosError<GitHubRESTError>> = {
code: AxiosError.ERR_NETWORK,
};
const result = determineFailureType(
mockError as AxiosError<GitHubRESTError>,
);
expect(result).toBe(Errors.NETWORK);
});
describe('bad request errors', () => {
it('bad credentials', async () => {
const mockError: Partial<AxiosError<GitHubRESTError>> = {
code: AxiosError.ERR_BAD_REQUEST,
status: 401,
response: createMockResponse(401, 'Bad credentials'),
};
const result = determineFailureType(
mockError as AxiosError<GitHubRESTError>,
);
expect(result).toBe(Errors.BAD_CREDENTIALS);
});
it('missing scopes', async () => {
const mockError: Partial<AxiosError<GitHubRESTError>> = {
code: AxiosError.ERR_BAD_REQUEST,
status: 403,
response: createMockResponse(403, "Missing the 'notifications' scope"),
};
const result = determineFailureType(
mockError as AxiosError<GitHubRESTError>,
);
expect(result).toBe(Errors.MISSING_SCOPES);
});
it('rate limited - primary', async () => {
const mockError: Partial<AxiosError<GitHubRESTError>> = {
code: AxiosError.ERR_BAD_REQUEST,
status: 403,
response: createMockResponse(403, 'API rate limit exceeded'),
};
const result = determineFailureType(
mockError as AxiosError<GitHubRESTError>,
);
expect(result).toBe(Errors.RATE_LIMITED);
});
it('rate limited - secondary', async () => {
const mockError: Partial<AxiosError<GitHubRESTError>> = {
code: AxiosError.ERR_BAD_REQUEST,
status: 403,
response: createMockResponse(
403,
'You have exceeded a secondary rate limit',
),
};
const result = determineFailureType(
mockError as AxiosError<GitHubRESTError>,
);
expect(result).toBe(Errors.RATE_LIMITED);
});
it('unhandled bad request error', async () => {
const mockError: Partial<AxiosError<GitHubRESTError>> = {
code: AxiosError.ERR_BAD_REQUEST,
status: 400,
response: createMockResponse(403, 'Oops! Something went wrong.'),
};
const result = determineFailureType(
mockError as AxiosError<GitHubRESTError>,
);
expect(result).toBe(Errors.UNKNOWN);
});
});
it('bad credentials - safe storage', async () => {
const mockError: Partial<AxiosError<GitHubRESTError>> = {
message: `Error invoking remote method '${EVENTS.SAFE_STORAGE_DECRYPT}': Error: Error while decrypting the ciphertext provided to safeStorage.decryptString. Ciphertext does not appear to be encrypted.`,
};
const result = determineFailureType(
mockError as AxiosError<GitHubRESTError>,
);
expect(result).toBe(Errors.BAD_CREDENTIALS);
});
it('unknown error', async () => {
const mockError: Partial<AxiosError<GitHubRESTError>> = {
code: 'anything',
};
const result = determineFailureType(
mockError as AxiosError<GitHubRESTError>,
);
expect(result).toBe(Errors.UNKNOWN);
});
});
function createMockResponse(
status: number,
message: string,
): AxiosResponse<GitHubRESTError> {
return {
data: {
message,
documentation_url: 'https://some-url.com' as Link,
},
status,
statusText: 'Some status text',
headers: {},
config: {
headers: undefined,
},
};
}