npm init -y
npx tsc --init
npm install express @types/express zod
"rootDir": "./src",
"outDir": "./dist"
src/index.ts fileimport express from "express";
import { z } from "zod";
export const app = express();
app.use(express.json());
const sumInput = z.object({
a: z.number(),
b: z.number()
})
app.post("/sum", (req, res) => {
const parsedResponse = sumInput.safeParse(req.body)
if (!parsedResponse.success) {
return res.status(411).json({
message: "Incorrect inputs"
})
}
const answer = parsedResponse.data.a + parsedResponse.data.b;
res.json({
answer
})
});
app.get("/sum", (req, res) => {
const parsedResponse = sumInput.safeParse({
a: Number(req.headers["a"]),
b: Number(req.headers["b"])
})
if (!parsedResponse.success) {
return res.status(411).json({
message: "Incorrect inputs"
})
}
const answer = parsedResponse.data.a + parsedResponse.data.b;
res.json({
answer
})
});
๐ก
Weโre not doing an app.listen here. This is because we dont want the app to actually start when the tests are running.
Usually you create a bin.ts file or main.ts file that imports app and actually listens on a port
npm i -D vitest
test/index.test.ts fileimport { expect, test } from 'vitest'
test('true === true', () => {
expect(true).toBe(true)
})
"test": "vitest"

npm i supertest @types/supertest
vitest is highly compatible with the jest apiimport {describe, expect, test, it} from 'vitest';
import request from "supertest";
import { app } from "../index"
describe("POST /sum", () => {
it("should return the sum of two numbers", async () => {
const res = await request(app).post("/sum").send({
a: 1,
b: 2
});
expect(res.statusCode).toBe(200);
expect(res.body.answer).toBe(3);
});
it("should return 411 if no inputs are provided", async () => {
const res = await request(app).post("/sum").send({});
expect(res.statusCode).toBe(411);
expect(res.body.message).toBe("Incorrect inputs");
});
});
describe("GET /sum", () => {
it("should return the sum of two numbers", async () => {
const res = await request(app)
.get("/sum")
.set({
a: "1",
b: "2"
})
.send();
expect(res.statusCode).toBe(200);
expect(res.body.answer).toBe(3);
});
it("should return 411 if no inputs are provided", async () => {
const res = await request(app)
.get("/sum").send();
expect(res.statusCode).toBe(411);
});
});