Skip to content

Commit 238fa7f

Browse files
committed
✅ Add unit tests for handleError utility function
1 parent 6476d9c commit 238fa7f

File tree

4 files changed

+228
-5
lines changed

4 files changed

+228
-5
lines changed

__tests__/handleError.test.ts

Lines changed: 207 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,207 @@
1+
import { handleError } from "../src/errorHandler";
2+
import {
3+
AxiosError,
4+
AxiosRequestHeaders,
5+
AxiosResponse,
6+
InternalAxiosRequestConfig,
7+
} from "axios";
8+
9+
describe("handleError utility function", () => {
10+
const mockAxiosError = (codeToTest: number): AxiosError => {
11+
const response: AxiosResponse = {
12+
status: codeToTest,
13+
statusText: "Request failed",
14+
data: {},
15+
headers: {},
16+
config: {} as InternalAxiosRequestConfig,
17+
request: {},
18+
};
19+
const error = new AxiosError("Request failed", "ERR", {
20+
url: "http://example.com",
21+
method: "get",
22+
headers: { "Content-Type": "application/json" } as AxiosRequestHeaders,
23+
});
24+
error.response = response;
25+
return error;
26+
};
27+
28+
const errorMessages = {
29+
400: "Bad Request",
30+
403: "Forbidden",
31+
404: "Not Found",
32+
};
33+
34+
describe("When errorMessages is a string and errorCodeToCheck is undefined", () => {
35+
it("returns custom message for AxiosError with status < 500", () => {
36+
const error = mockAxiosError(400);
37+
const result = handleError(error, "Custom error message");
38+
expect(result).toBe("Custom error message");
39+
});
40+
41+
it("returns default server error message for AxiosError with status >= 500", () => {
42+
const error = mockAxiosError(500);
43+
const result = handleError(error, "Custom error message");
44+
expect(result).toBe("A server error occurred. Please try again later.");
45+
});
46+
47+
it("returns error message for generic Error", () => {
48+
const error = new Error("Generic error");
49+
const result = handleError(error, "Custom error message");
50+
expect(result).toBe("Generic error");
51+
});
52+
53+
it("returns default unknown error message for unknown error", () => {
54+
const error = {} as any;
55+
const result = handleError(error, "Custom error message");
56+
expect(result).toBe("An unknown error occurred.");
57+
});
58+
});
59+
60+
describe("When errorMessages is a string and errorCodeToCheck is a number", () => {
61+
it("returns custom message for AxiosError with matching code", () => {
62+
const error = mockAxiosError(400);
63+
const result = handleError(error, "Custom error message", 400);
64+
expect(result).toBe("Custom error message");
65+
});
66+
67+
it("returns default client error message for AxiosError with non-matching code", () => {
68+
const error = mockAxiosError(403);
69+
const result = handleError(error, "Custom error message", 400);
70+
expect(result).toBe("An unknown error occurred.");
71+
});
72+
73+
it("returns default server error message for AxiosError with status >= 500", () => {
74+
const error = mockAxiosError(500);
75+
const result = handleError(error, "Custom error message", 400);
76+
expect(result).toBe("A server error occurred. Please try again later.");
77+
});
78+
79+
it("returns error message for generic Error", () => {
80+
const error = new Error("Generic error");
81+
const result = handleError(error, "Custom error message", 400);
82+
expect(result).toBe("Generic error");
83+
});
84+
85+
it("returns default unknown error message for unknown error", () => {
86+
const error = {} as any;
87+
const result = handleError(error, "Custom error message", 400);
88+
expect(result).toBe("An unknown error occurred.");
89+
});
90+
});
91+
92+
describe("When errorMessages is an object", () => {
93+
it("returns corresponding message for AxiosError with matching code", () => {
94+
const error = mockAxiosError(400);
95+
const result = handleError(error, errorMessages);
96+
expect(result).toBe("Bad Request");
97+
});
98+
99+
it("returns default client error message for AxiosError with non-matching code", () => {
100+
const error = mockAxiosError(418);
101+
const result = handleError(error, errorMessages);
102+
expect(result).toBe("An unknown error occurred.");
103+
});
104+
105+
it("returns default server error message for AxiosError with status >= 500", () => {
106+
const error = mockAxiosError(500);
107+
const result = handleError(error, errorMessages);
108+
expect(result).toBe("A server error occurred. Please try again later.");
109+
});
110+
111+
it("returns error message for generic Error", () => {
112+
const error = new Error("Generic error");
113+
const result = handleError(error, errorMessages);
114+
expect(result).toBe("Generic error");
115+
});
116+
117+
it("returns default unknown error message for unknown error", () => {
118+
const error = {} as any;
119+
const result = handleError(error, errorMessages);
120+
expect(result).toBe("An unknown error occurred.");
121+
});
122+
});
123+
124+
describe("When serverErrorMessage is customized", () => {
125+
it("returns custom server error message for AxiosError with status >= 500", () => {
126+
const error = mockAxiosError(500);
127+
const result = handleError(
128+
error,
129+
"Custom error message",
130+
400,
131+
"Custom server error message"
132+
);
133+
expect(result).toBe("Custom server error message");
134+
});
135+
136+
it("returns default client error message for AxiosError with status < 500", () => {
137+
const error = mockAxiosError(401);
138+
const result = handleError(
139+
error,
140+
"Custom error message",
141+
400,
142+
"Custom server error message"
143+
);
144+
expect(result).toBe("An unknown error occurred.");
145+
});
146+
147+
it("returns error message for generic Error", () => {
148+
const error = new Error("Generic error");
149+
const result = handleError(
150+
error,
151+
"Custom error message",
152+
400,
153+
"Custom server error message"
154+
);
155+
expect(result).toBe("Generic error");
156+
});
157+
158+
it("returns default unknown error message for unknown error", () => {
159+
const error = {} as any;
160+
const result = handleError(
161+
error,
162+
"Custom error message",
163+
400,
164+
"Custom server error message"
165+
);
166+
expect(result).toBe("An unknown error occurred.");
167+
});
168+
});
169+
170+
describe("When unknownServerMessage is customized", () => {
171+
it("returns custom unknown error message for AxiosError", () => {
172+
const error = mockAxiosError(401);
173+
const result = handleError(
174+
error,
175+
"Custom error message",
176+
400,
177+
undefined,
178+
"Custom unknown error message"
179+
);
180+
expect(result).toBe("Custom unknown error message");
181+
});
182+
183+
it("returns error message for generic Error", () => {
184+
const error = new Error("Generic error");
185+
const result = handleError(
186+
error,
187+
"Custom error message",
188+
400,
189+
undefined,
190+
"Custom unknown error message"
191+
);
192+
expect(result).toBe("Generic error");
193+
});
194+
195+
it("returns custom unknown error message for unknown error", () => {
196+
const error = {} as any;
197+
const result = handleError(
198+
error,
199+
"Custom error message",
200+
400,
201+
undefined,
202+
"Custom unknown error message"
203+
);
204+
expect(result).toBe("Custom unknown error message");
205+
});
206+
});
207+
});

jest.config.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
module.exports = {
2+
preset: "ts-jest",
3+
testEnvironment: "node",
4+
};

package.json

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
{
22
"name": "axios-error-handler-ts",
3-
"version": "1.1.0",
3+
"version": "1.2.1",
44
"description": "A simple helper to handle errors in Axios requests with customizable messages.",
55
"main": "src/errorHandler.ts",
66
"types": "src/errorHandler.ts",
7+
"repository": {
8+
"type": "git",
9+
"url": "git+https://github.com/Jszigeti/axios-error-handler.git"
10+
},
711
"scripts": {
8-
"build": "tsc"
12+
"build": "tsc",
13+
"test": "jest"
914
},
1015
"keywords": [
1116
"axios",
@@ -20,6 +25,13 @@
2025
"axios": "^1.7.9"
2126
},
2227
"devDependencies": {
28+
"@types/jest": "^29.5.14",
29+
"jest": "^29.7.0",
30+
"ts-jest": "^29.2.5",
2331
"typescript": "^5.7.2"
24-
}
32+
},
33+
"bugs": {
34+
"url": "https://github.com/Jszigeti/axios-error-handler/issues"
35+
},
36+
"homepage": "https://github.com/Jszigeti/axios-error-handler#readme"
2537
}

src/errorHandler.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,14 @@ export const handleError = (
2626
const codesToCheck: number[] = errorCodeToCheck
2727
? [errorCodeToCheck]
2828
: Object.keys(errorMessages).map(Number);
29-
if (codesToCheck.includes(error.response.status)) {
29+
if (codesToCheck.includes(error.response.status))
3030
if (
3131
typeof errorMessages === "object" &&
3232
errorMessages[error.response.status]
3333
)
3434
return errorMessages[error.response.status];
3535
else if (typeof errorMessages === "string") return errorMessages;
36-
} else if (error.response.status >= 500) return serverErrorMessage;
36+
if (error.response.status >= 500) return serverErrorMessage;
3737
return unknownErrorMessage;
3838
} else if (error instanceof Error) return error.message;
3939
return unknownErrorMessage;

0 commit comments

Comments
 (0)