UNPKG

jsdoc-rest-api

Version:

A utility that generates a rest api from your JsDoc annotations.

114 lines (92 loc) 3.33 kB
"use stict"; const { assert } = require("chai"); const { attachExpressAppEndpoints } = require("../index"); const testHelper = require("./TestHelper").instance(); describe("#attachExpressAppEndpoints()", function() { it( "should attach express middlewares for GET, POST, PUT, and DELETE endpoints from api endpoints generated from the provided source using jsdoc.", testHelper.testWithStubs(async () => { const expressApp = { get: testHelper.spy(), post: testHelper.spy(), put: testHelper.spy(), delete: testHelper.spy() }; const fakeReq = { params: { id: "prop_id_a" }, body: {} }; const fakeRes = { status: () => fakeRes, send: () => {} }; const fakeNext = testHelper.spy(err => { console.error(err.stack); }); const getControllerInstance = testHelper.spy( ({ controller, controllerFileName, req, res }) => { assert.isTrue( controllerFileName === "ArticleApiController.js" || controllerFileName === "DiscussionApiController.js" ); assert(controller); assert.deepEqual( controller, require(`../examples/generateRoutesMap/server/api/${controllerFileName}`) ); assert.deepEqual(req, fakeReq); assert.deepEqual(res, fakeRes); try { return new controller(); } catch (err) { return controller; } } ); attachExpressAppEndpoints({ source: "examples/generateRoutesMap/server/api/**/*Controller.js", app: expressApp, getControllerInstance }); assert.deepEqual( testHelper.mapSpyCallsArgs(expressApp.get, args => { assert.equal(args.length, 2); assert.isFunction(args[1]); assert.equal(args[1].length, 3); return [args[0], true]; }), [ ["/api/i/article/:id", true], ["/api/i/discussion/:id", true], ["/api/i/discussion/:id/v2", true] ] ); const lastGetCallArgsCb = expressApp.get.lastCall.args[1]; const lastPostCallArgsCb = expressApp.post.lastCall.args[1]; const lastPutCallArgsCb = expressApp.put.lastCall.args[1]; const lastDeleteCallArgsCb = expressApp.delete.lastCall.args[1]; lastGetCallArgsCb(fakeReq, fakeRes, fakeNext); lastPostCallArgsCb(fakeReq, fakeRes, fakeNext); lastPutCallArgsCb(fakeReq, fakeRes, fakeNext); lastDeleteCallArgsCb(fakeReq, fakeRes, fakeNext); await testHelper.delayedPromise(1000); assert.equal(getControllerInstance.callCount, 4); assert.equal(fakeNext.callCount, 0); // -- Now make one of the controllers throw an error // to test that the next middleware is called testHelper .stub(getControllerInstance.lastCall.args[0].controller.discussionDbDriver, "updateById") .callsFake(() => { throw new Error("Forced error"); }); lastGetCallArgsCb(fakeReq, fakeRes, fakeNext); lastPostCallArgsCb(fakeReq, fakeRes, fakeNext); lastPutCallArgsCb(fakeReq, fakeRes, fakeNext); lastDeleteCallArgsCb(fakeReq, fakeRes, fakeNext); await testHelper.delayedPromise(1000); assert.equal(getControllerInstance.callCount, 8); assert.equal(fakeNext.callCount, 1); // This is expected because the controller's field that is being accessed is undefined assert.deepEqual( testHelper.mapSpyCallsArgs(fakeNext, args => { return args[0].message; }), ["Forced error"] ); }) ); });