tedi
Version:
Express wrappper written in typescript with dependency injection capabilities
152 lines (151 loc) • 5.12 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const request = require("supertest-as-promised");
const express = require("express");
describe("Express app", () => {
let userRouter;
let infoRouter;
let app;
let controller;
beforeEach(() => {
userRouter = express.Router();
infoRouter = express.Router();
app = express();
controller = {
fn: (req, res, next) => {
res.status(200).send("ok");
},
};
let controllerWrapper = (req, res, next) => {
controller.fn(req, res, next);
};
infoRouter.route("/").get(controllerWrapper);
userRouter.route("/").get(controllerWrapper);
userRouter.use("/info", infoRouter);
app.use("/user", userRouter);
});
describe("when error handlers are chained in the app", () => {
let response;
beforeEach((done) => {
app
.use("/user/info", (err, req, res, next) => {
err.$handlers.push("info error handler");
next(err);
})
.use("/user", (err, req, res, next) => {
err.$handlers.push("user error handler");
next(err);
})
.use((err, req, res, next) => {
err.$handlers.push("app error handler");
res.status(500).send(err.$handlers);
});
spyOn(controller, "fn").and.callFake((req, res, next) => {
next({ $handlers: [] });
});
request(app)
.get("/user/info")
.expect(500)
.then((res) => {
response = res;
done();
})
.catch((error) => done.fail(error));
});
it("should have transversed all the error handlers", () => {
expect(JSON.parse(response.text)).toEqual([
"info error handler",
"user error handler",
"app error handler",
]);
});
});
describe("when error handlers are setted in the routers", () => {
let response;
let infoFlag = false;
let userFlag = false;
let rootFlag = false;
beforeEach((done) => {
infoRouter.use((err, req, res, next) => {
infoFlag = true;
next(err);
});
userRouter.use((err, req, res, next) => {
userFlag = true;
next(err);
});
app.use((err, req, res, next) => {
rootFlag = true;
res.status(500).send(err.$handlers);
});
spyOn(controller, "fn").and.callFake((req, res, next) => {
next(new Error("Custom"));
});
request(app)
.get("/user/info")
.expect(500)
.then((res) => {
response = res;
done();
})
.catch((error) => done.fail(error));
});
it("should have transversed all the error handlers", () => {
expect(rootFlag).toBeTruthy();
expect(userFlag).toBeTruthy();
expect(infoFlag).toBeTruthy();
});
});
describe("when filters are setted in the routers", () => {
let response;
let infoFlag = false;
let userFlag = false;
let rootFlag = false;
beforeEach((done) => {
userRouter = express.Router();
infoRouter = express.Router();
app = express();
controller = {
fn: (req, res, next) => {
res.status(200).send("ok");
},
};
let controllerWrapper = (req, res, next) => {
controller.fn(req, res, next);
};
infoRouter.route("/").get(controllerWrapper);
userRouter.use((req, res, next) => {
userFlag = true;
next();
});
userRouter.route("/").get(controllerWrapper);
userRouter.use("/info", infoRouter);
app.use((req, res, next) => {
rootFlag = true;
next();
});
app.use("/user", userRouter);
infoRouter.use((req, res, next) => {
infoFlag = true;
next();
});
spyOn(controller, "fn").and.callFake((req, res, next) => {
res.status(200).send("OK");
});
request(app)
.get("/user/info")
.expect(200)
.then((res) => {
response = res;
done();
})
.catch((error) => done.fail(error));
});
it("should have called root filter", () => {
expect(rootFlag).toBeTruthy();
});
it("should have called user filter", () => {
expect(userFlag).toBeTruthy();
});
});
});