import supertest from "supertest"; import { app } from "../src/app"; import { connectDB, dropDB, dropCollections } from "../src/utils/test_mongodb"; const request = supertest(app); export const getJWT = async () => { try { const resReg: any = await request.post("/api/v1/auth/signup").send({ email: "test@example.local", password: "admin1234", username: "Test Test", }); const resLog: any = await request.post("/api/auth/login").send({ email: "test@example.local", password: "admin1234", }); if (resLog.statusCode != 200) throw "error while logging in"; const body = JSON.parse(resLog.text); return Promise.resolve(body.data.jwt); } catch (err: any) { console.log(err); return err; } }; /** * * @returns JWT cookie */ export async function login(): Promise { const res = await request.post("/api/v1/auth/signin").send({ email: "thisistest@host.local", password: "Admin1234", }); return res.headers["set-cookie"]; } export async function signup(): Promise { const res = await request.post("/api/v1/auth/signup").send({ email: "thisistest@host.local", password: "Admin1234", username: "Test Test", }); if (res.statusCode == 201) return true; return false; } describe("POST /api/v1/auth/signup", () => { describe("should drop validation error", () => { it("should drop 400 (empty request))", async () => { const res: any = await request.post("/api/v1/auth/signup").send({}); expect(res.statusCode).toBe(400); }); it("should drop 400 (email))", async () => { const res: any = await request.post("/api/v1/auth/signup").send({ email: "", username: "User Admin", password: "Admin1234", }); console.log(res); const body = JSON.parse(res.text); expect(res.statusCode).toBe(400); expect(body.data.path).toBe("email"); }); it("should drop 400 (username))", async () => { const res: any = await request.post("/api/v1/auth/signup").send({ email: "admin@localhost.local", username: "", password: "Admin1234", }); const body = JSON.parse(res.text); expect(res.statusCode).toBe(400); expect(body.data.path).toBe("username"); }); it("should drop 400 (password))", async () => { const res: any = await request.post("/api/v1/auth/signup").send({ email: "admin@localhost.local", username: "User Admin", password: "", }); const body = JSON.parse(res.text); expect(res.statusCode).toBe(400); expect(body.data.path).toBe("password"); }); it("should drop 400 (password - min 8 chars", async () => { const res = await request.post("/api/v1/auth/signup").send({ email: "admin@localhost.local", username: "User Admin", password: "Admin12", }); const body = JSON.parse(res.text); expect(res.statusCode).toBe(400); expect(body.data.path).toBe("password"); }); it("should drop 400 (password - min 1 number", async () => { const res = await request.post("/api/v1/auth/signup").send({ email: "admin@localhost.local", username: "User Admin", password: "Adminadmin", }); const body = JSON.parse(res.text); expect(res.statusCode).toBe(400); expect(body.data.path).toBe("password"); }); it("should drop 400 (password - min 1 uppercase", async () => { const res = await request.post("/api/v1/auth/signup").send({ email: "admin@localhost.local", username: "User Admin", password: "admin1234", }); const body = JSON.parse(res.text); expect(res.statusCode).toBe(400); expect(body.data.path).toBe("password"); }); }); test("should register an user", async () => { const res: any = await request.post("/api/v1/auth/signup").send({ email: "thisistest@host.local", password: "Admin1234", username: "Test Test", }); expect(res.statusCode).toBe(201); }); }); describe("POST /api/v1/auth/signin", () => { const url = "/api/v1/auth/signin"; describe("should drop an validation error", () => { it("should drop 400 (empty)", async () => { const res = await request.post(url).send(); expect(res.statusCode).toBe(400); }); it("should drop 400 (email)", async () => { const res = await request.post(url).send({ password: "Admin1234", }); const body = JSON.parse(res.text); expect(res.statusCode).toBe(400); expect(body.data.path).toBe("email"); }); it("should drop 400 (password)", async () => { const res = await request.post(url).send({ email: "thisistest@host.local", }); const body = JSON.parse(res.text); expect(res.statusCode).toBe(400); expect(body.data.path).toBe("password"); }); }); test("should drop 401", async () => { const res = await request.post(url).send({ email: "thisistest@host.local", password: "Test12365465132", }); expect(res.statusCode).toBe(401); expect(res.header["set-cookie"][0]).toContain("jwt=; Max-Age=0"); expect(res.header["set-cookie"][1]).toContain("auth=false"); }); test("should login an user", async () => { const res: any = await request.post(url).send({ email: "thisistest@host.local", password: "Admin1234", }); expect(res.statusCode).toBe(200); expect(res.header["set-cookie"][0]).toContain("jwt="); expect(res.header["set-cookie"][1]).toContain("auth=true"); }); }); describe("POST /api/v1/auth/logout", () => { const url = "/api/v1/auth/logout"; test("should drop 401 error", async () => { const res = await request.post(url).send({}); expect(res.statusCode).toBe(401); }); test("should logout an user", async () => { const jwt = await login(); const res = await request.post(url).set("Cookie", jwt).send(); expect(res.statusCode).toBe(200); expect(res.header["set-cookie"][0]).toContain("jwt=; Max-Age=0"); expect(res.header["set-cookie"][1]).toContain("auth=false"); }); }); describe("GET /api/v1/auth/status", () => { const url = "/api/v1/auth/status"; test("should return login status 401", async () => { const res = await request.get(url).send(); expect(res.statusCode).toBe(401); }); test("should return login status 200", async () => { const jwt = await login(); const res = await request.get(url).set("Cookie", jwt).send(); expect(res.statusCode).toBe(200); expect(res.body.data.username).toBe("Test Test"); expect(res.body.data.email).toBe("thisistest@host.local"); expect(res.body.data.password).toBeUndefined(); }); });