80 lines
2.3 KiB
TypeScript
80 lines
2.3 KiB
TypeScript
import { describe, expect, it, jest } from "@jest/globals";
|
|
import type { NextFunction, Request, Response } from "express";
|
|
import { isAllowed } from "../../../src/api/middleware/isAllowed.ts";
|
|
import { AppError } from "../../../src/utils/AppError.ts";
|
|
|
|
describe("isAllowed middleware", () => {
|
|
it("calls next() without error when user has an allowed role", () => {
|
|
const middleware = isAllowed(["admin", "superadmin"]);
|
|
const req = {
|
|
user: {
|
|
id: "user-1",
|
|
teamId: "team-1",
|
|
email: "admin@example.com",
|
|
role: ["admin"],
|
|
},
|
|
} as unknown as Request;
|
|
const res = {} as Response;
|
|
const next = jest.fn() as unknown as NextFunction;
|
|
|
|
middleware(req, res, next);
|
|
|
|
expect(next).toHaveBeenCalledWith();
|
|
});
|
|
|
|
it("calls next(error) with 403 when user does not have an allowed role", () => {
|
|
const middleware = isAllowed(["admin", "superadmin"]);
|
|
const req = {
|
|
user: {
|
|
id: "user-2",
|
|
teamId: "team-1",
|
|
email: "user@example.com",
|
|
role: ["user"],
|
|
},
|
|
} as unknown as Request;
|
|
const res = {} as Response;
|
|
const next = jest.fn() as unknown as NextFunction;
|
|
|
|
middleware(req, res, next);
|
|
|
|
expect(next).toHaveBeenCalledTimes(1);
|
|
const error = (next as unknown as jest.Mock).mock.calls[0][0] as AppError;
|
|
expect(error).toBeInstanceOf(AppError);
|
|
expect(error.status).toBe(403);
|
|
expect(error.message).toBe("Unauthorized");
|
|
});
|
|
|
|
it("calls next(error) with 403 when req.user is undefined", () => {
|
|
const middleware = isAllowed(["admin", "superadmin"]);
|
|
const req = {} as Request;
|
|
const res = {} as Response;
|
|
const next = jest.fn() as unknown as NextFunction;
|
|
|
|
middleware(req, res, next);
|
|
|
|
expect(next).toHaveBeenCalledTimes(1);
|
|
const error = (next as unknown as jest.Mock).mock.calls[0][0] as AppError;
|
|
expect(error).toBeInstanceOf(AppError);
|
|
expect(error.status).toBe(403);
|
|
expect(error.message).toBe("Unauthorized");
|
|
});
|
|
|
|
it("calls next() when user has multiple roles and at least one matches", () => {
|
|
const middleware = isAllowed(["admin", "superadmin"]);
|
|
const req = {
|
|
user: {
|
|
id: "user-3",
|
|
teamId: "team-1",
|
|
email: "multi@example.com",
|
|
role: ["user", "admin"],
|
|
},
|
|
} as unknown as Request;
|
|
const res = {} as Response;
|
|
const next = jest.fn() as unknown as NextFunction;
|
|
|
|
middleware(req, res, next);
|
|
|
|
expect(next).toHaveBeenCalledWith();
|
|
});
|
|
});
|