Skip to content

Commit 88989bb

Browse files
authored
feat: Add rejectNetworkError to API calls (part four) (#3768)
1 parent 15f9577 commit 88989bb

24 files changed

+450
-521
lines changed

src/services/repo/useRepoComponentsSelect.test.tsx

Lines changed: 21 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ import { setupServer } from 'msw/node'
55
import { MemoryRouter, Route } from 'react-router-dom'
66
import { type MockInstance } from 'vitest'
77

8-
import A from 'ui/A'
9-
108
import { useRepoComponentsSelect } from './useRepoComponentsSelect'
119

1210
const queryClient = new QueryClient({
@@ -45,14 +43,8 @@ const dataReturned = {
4543
__typename: 'Repository',
4644
coverageAnalytics: {
4745
componentsYaml: [
48-
{
49-
name: 'foo',
50-
id: '1',
51-
},
52-
{
53-
name: 'bar',
54-
id: '2',
55-
},
46+
{ name: 'foo', id: '1' },
47+
{ name: 'bar', id: '2' },
5648
],
5749
},
5850
},
@@ -135,18 +127,20 @@ describe('RepoComponentsYamlSelector', () => {
135127
afterAll(() => {
136128
consoleSpy.mockRestore()
137129
})
130+
138131
it('returns an error', async () => {
139132
setup({ isSchemaInvalid: true })
140133
const { result } = renderHook(() => useRepoComponentsSelect(), {
141134
wrapper,
142135
})
143136

144137
await waitFor(() =>
145-
expect(result.current.error).toEqual({
146-
status: 404,
147-
data: {},
148-
dev: 'useRepoComponentsSelect - 404 Error parsing repo components data',
149-
})
138+
expect(result.current.error).toEqual(
139+
expect.objectContaining({
140+
dev: 'useRepoComponentsSelect - Parsing Error',
141+
status: 400,
142+
})
143+
)
150144
)
151145
})
152146
})
@@ -168,11 +162,12 @@ describe('RepoComponentsYamlSelector', () => {
168162
})
169163

170164
await waitFor(() =>
171-
expect(result.current.error).toEqual({
172-
status: 404,
173-
data: {},
174-
dev: 'useRepoComponentsSelect - 404 RepoNotFoundError',
175-
})
165+
expect(result.current.error).toEqual(
166+
expect.objectContaining({
167+
dev: 'useRepoComponentsSelect - Not Found Error',
168+
status: 404,
169+
})
170+
)
176171
)
177172
})
178173
})
@@ -194,25 +189,12 @@ describe('RepoComponentsYamlSelector', () => {
194189
})
195190

196191
await waitFor(() =>
197-
expect(result.current.error).toEqual({
198-
status: 403,
199-
data: {
200-
detail: (
201-
<p>
202-
Activation is required to view this repo, please{' '}
203-
<A
204-
to={{ pageName: 'membersTab' }}
205-
hook="members-page-link"
206-
isExternal={false}
207-
>
208-
click here{' '}
209-
</A>{' '}
210-
to activate your account.
211-
</p>
212-
),
213-
},
214-
dev: 'useRepoComponentsSelect - 403 OwnerNotActivatedError',
215-
})
192+
expect(result.current.error).toEqual(
193+
expect.objectContaining({
194+
dev: 'useRepoComponentsSelect - Owner Not Activated',
195+
status: 403,
196+
})
197+
)
216198
)
217199
})
218200
})

src/services/repo/useRepoComponentsSelect.tsx

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
RepoOwnerNotActivatedErrorSchema,
88
} from 'services/repo'
99
import Api from 'shared/api'
10-
import { type NetworkErrorObject } from 'shared/api/helpers'
10+
import { rejectNetworkError } from 'shared/api/rejectNetworkError'
1111
import A from 'ui/A'
1212

1313
const query = `
@@ -101,26 +101,32 @@ export function useRepoComponentsSelect({
101101
const parsedData = RequestSchema.safeParse(res?.data)
102102

103103
if (!parsedData.success) {
104-
return Promise.reject({
105-
status: 404,
106-
data: {},
107-
dev: 'useRepoComponentsSelect - 404 Error parsing repo components data',
108-
} satisfies NetworkErrorObject)
104+
return rejectNetworkError({
105+
errorName: 'Parsing Error',
106+
errorDetails: {
107+
callingFn: 'useRepoComponentsSelect',
108+
error: parsedData.error,
109+
},
110+
})
109111
}
110112

111113
const data = parsedData.data
112114

113115
if (data?.owner?.repository?.__typename === 'NotFoundError') {
114-
return Promise.reject({
115-
status: 404,
116-
data: {},
117-
dev: 'useRepoComponentsSelect - 404 RepoNotFoundError',
118-
} satisfies NetworkErrorObject)
116+
return rejectNetworkError({
117+
errorName: 'Not Found Error',
118+
errorDetails: {
119+
callingFn: 'useRepoComponentsSelect',
120+
},
121+
})
119122
}
120123

121124
if (data?.owner?.repository?.__typename === 'OwnerNotActivatedError') {
122-
return Promise.reject({
123-
status: 403,
125+
return rejectNetworkError({
126+
errorName: 'Owner Not Activated',
127+
errorDetails: {
128+
callingFn: 'useRepoComponentsSelect',
129+
},
124130
data: {
125131
detail: (
126132
<p>
@@ -136,8 +142,7 @@ export function useRepoComponentsSelect({
136142
</p>
137143
),
138144
},
139-
dev: 'useRepoComponentsSelect - 403 OwnerNotActivatedError',
140-
} satisfies NetworkErrorObject)
145+
})
141146
}
142147

143148
return {

src/services/repo/useRepoConfig.test.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,8 @@ describe('useRepoConfig', () => {
163163
await waitFor(() =>
164164
expect(result.current.error).toEqual(
165165
expect.objectContaining({
166-
status: 404,
166+
dev: 'useRepoConfig - Parsing Error',
167+
status: 400,
167168
})
168169
)
169170
)
@@ -187,11 +188,13 @@ describe('useRepoConfig', () => {
187188
await waitFor(() =>
188189
expect(result.current.error).toEqual(
189190
expect.objectContaining({
191+
dev: 'useRepoConfig - Owner Not Activated',
190192
status: 403,
191193
})
192194
)
193195
)
194196
})
197+
195198
it('can return not found error', async () => {
196199
setup({ isNotFoundError: true })
197200
const { result } = renderHook(
@@ -210,6 +213,7 @@ describe('useRepoConfig', () => {
210213
await waitFor(() =>
211214
expect(result.current.error).toEqual(
212215
expect.objectContaining({
216+
dev: 'useRepoConfig - Not Found Error',
213217
status: 404,
214218
})
215219
)

src/services/repo/useRepoConfig.tsx

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { useQuery, type UseQueryOptions } from '@tanstack/react-query'
22
import { z } from 'zod'
33

44
import Api from 'shared/api'
5-
import { NetworkErrorObject } from 'shared/api/helpers'
5+
import { rejectNetworkError } from 'shared/api/rejectNetworkError'
66
import A from 'ui/A'
77

88
import {
@@ -97,26 +97,32 @@ export const useRepoConfig = ({
9797
const parsedRes = UseRepoConfigSchema.safeParse(res?.data)
9898

9999
if (!parsedRes.success) {
100-
return Promise.reject({
101-
status: 404,
102-
data: {},
103-
dev: 'useRepoConfig - 404 schema parsing failed',
104-
} satisfies NetworkErrorObject)
100+
return rejectNetworkError({
101+
errorName: 'Parsing Error',
102+
errorDetails: {
103+
callingFn: 'useRepoConfig',
104+
error: parsedRes.error,
105+
},
106+
})
105107
}
106108

107109
const data = parsedRes.data
108110

109111
if (data?.owner?.repository?.__typename === 'NotFoundError') {
110-
return Promise.reject({
111-
status: 404,
112-
data: {},
113-
dev: 'useRepoConfig - 404 NotFoundError',
114-
} satisfies NetworkErrorObject)
112+
return rejectNetworkError({
113+
errorName: 'Not Found Error',
114+
errorDetails: {
115+
callingFn: 'useRepoConfig',
116+
},
117+
})
115118
}
116119

117120
if (data?.owner?.repository?.__typename === 'OwnerNotActivatedError') {
118-
return Promise.reject({
119-
status: 403,
121+
return rejectNetworkError({
122+
errorName: 'Owner Not Activated',
123+
errorDetails: {
124+
callingFn: 'useRepoConfig',
125+
},
120126
data: {
121127
detail: (
122128
<p>
@@ -127,8 +133,7 @@ export const useRepoConfig = ({
127133
</p>
128134
),
129135
},
130-
dev: 'useRepoConfig - 403 OwnerNotActivatedError',
131-
} satisfies NetworkErrorObject)
136+
})
132137
}
133138

134139
return res?.data?.owner?.repository?.repositoryConfig ?? {}

src/services/repo/useRepoCoverage.test.tsx

Lines changed: 11 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,7 @@ const mockRepoCoverage = {
1515
head: {
1616
yamlState: 'DEFAULT',
1717
coverageAnalytics: {
18-
totals: {
19-
percentCovered: 70.44,
20-
lineCount: 90,
21-
hitsCount: 80,
22-
},
18+
totals: { percentCovered: 70.44, lineCount: 90, hitsCount: 80 },
2319
},
2420
},
2521
},
@@ -115,9 +111,7 @@ describe('useRepoCoverage', () => {
115111
repo: 'woof',
116112
branch: 'main',
117113
}),
118-
{
119-
wrapper,
120-
}
114+
{ wrapper }
121115
)
122116

123117
await waitFor(() =>
@@ -126,11 +120,7 @@ describe('useRepoCoverage', () => {
126120
head: {
127121
yamlState: 'DEFAULT',
128122
coverageAnalytics: {
129-
totals: {
130-
percentCovered: 70.44,
131-
lineCount: 90,
132-
hitsCount: 80,
133-
},
123+
totals: { percentCovered: 70.44, lineCount: 90, hitsCount: 80 },
134124
},
135125
},
136126
})
@@ -149,9 +139,7 @@ describe('useRepoCoverage', () => {
149139
repo: 'woof',
150140
branch: 'main',
151141
}),
152-
{
153-
wrapper,
154-
}
142+
{ wrapper }
155143
)
156144

157145
await waitFor(() => {
@@ -170,7 +158,7 @@ describe('useRepoCoverage', () => {
170158
consoleSpy.mockRestore()
171159
})
172160

173-
it('rejects with 404', async () => {
161+
it('rejects with 400', async () => {
174162
setup({ badResponse: true })
175163
const { result } = renderHook(
176164
() =>
@@ -188,8 +176,8 @@ describe('useRepoCoverage', () => {
188176
await waitFor(() =>
189177
expect(result.current.error).toEqual(
190178
expect.objectContaining({
191-
status: 404,
192-
dev: 'useRepoCoverage - 404 failed to parse',
179+
dev: 'useRepoCoverage - Parsing Error',
180+
status: 400,
193181
})
194182
)
195183
)
@@ -216,16 +204,14 @@ describe('useRepoCoverage', () => {
216204
repo: 'woof',
217205
branch: 'main',
218206
}),
219-
{
220-
wrapper,
221-
}
207+
{ wrapper }
222208
)
223209

224210
await waitFor(() =>
225211
expect(result.current.error).toEqual(
226212
expect.objectContaining({
213+
dev: 'useRepoCoverage - Not Found Error',
227214
status: 404,
228-
dev: 'useRepoCoverage - 404 NotFoundError',
229215
})
230216
)
231217
)
@@ -252,18 +238,16 @@ describe('useRepoCoverage', () => {
252238
repo: 'woof',
253239
branch: 'main',
254240
}),
255-
{
256-
wrapper,
257-
}
241+
{ wrapper }
258242
)
259243

260244
await waitFor(() => expect(result.current.isError).toBeTruthy())
261245

262246
await waitFor(() =>
263247
expect(result.current.error).toEqual(
264248
expect.objectContaining({
249+
dev: 'useRepoCoverage - Owner Not Activated',
265250
status: 403,
266-
dev: 'useRepoCoverage - 403 OwnerNotActivated Error',
267251
})
268252
)
269253
)

0 commit comments

Comments
 (0)