Skip to content

Commit

Permalink
MiddlewareManager: Add additional tests
Browse files Browse the repository at this point in the history
  • Loading branch information
RandomByte committed Jul 2, 2019
1 parent 56de4ef commit 89b7b91
Show file tree
Hide file tree
Showing 2 changed files with 188 additions and 19 deletions.
32 changes: 14 additions & 18 deletions lib/middleware/MiddlewareManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,40 +33,26 @@ class MiddlewareManager {
wrapperCallback, mountPath = "/",
beforeMiddleware, afterMiddleware
} = {}) {
let newMiddlewareName = middlewareName;
if (this.middleware[newMiddlewareName]) {
// Middleware is already known
// => add a suffix to allow for multiple configurations of the same middleware
let suffixCounter = 0;
while (this.middleware[newMiddlewareName]) {
suffixCounter++; // Start at 1
newMiddlewareName = `${middlewareName}--${suffixCounter}`;
}
}

let middlewareCallback = middlewareRepository.getMiddleware(middlewareName);
if (wrapperCallback) {
middlewareCallback = wrapperCallback(middlewareCallback);
}
if (this.middleware[middlewareName]) {
if (this.middleware[middlewareName] || this.middlewareExecutionOrder.includes(middlewareName)) {
throw new Error(`Failed to add duplicate middleware ${middlewareName}`);
}
if (this.middlewareExecutionOrder.includes(middlewareName)) {
throw new Error(`Server: Failed to add duplicate middleware ${middlewareName}`);
}

if (beforeMiddleware || afterMiddleware) {
const refMiddlewareName = beforeMiddleware || afterMiddleware;
let refMiddlewareIdx = this.middlewareExecutionOrder.indexOf(refMiddlewareName);
if (refMiddlewareIdx === -1) {
throw new Error(`Could not find middleware ${refMiddlewareName}, referenced by custom ` +
`middleware ${newMiddlewareName}`);
`middleware ${middlewareName}`);
}
if (afterMiddleware) {
// Insert after index of referenced middleware
refMiddlewareIdx++;
}
this.middlewareExecutionOrder.splice(refMiddlewareIdx, 0, newMiddlewareName);
this.middlewareExecutionOrder.splice(refMiddlewareIdx, 0, middlewareName);
} else {
this.middlewareExecutionOrder.push(middlewareName);
}
Expand Down Expand Up @@ -168,7 +154,17 @@ class MiddlewareManager {
`defines neither a "beforeMiddleware" nor an "afterMiddleware" parameter. One must be defined.`);
}

await this.addMiddleware(middlewareDef.name, {
let newMiddlewareName = middlewareDef.name;
if (this.middleware[newMiddlewareName]) {
// Middleware is already known
// => add a suffix to allow for multiple configurations of the same middleware
let suffixCounter = 0;
while (this.middleware[newMiddlewareName]) {
suffixCounter++; // Start at 1
newMiddlewareName = `${middlewareDef.name}--${suffixCounter}`;
}
}
await this.addMiddleware(newMiddlewareName, {
wrapperCallback: (middleware) => {
return ({resources}) => {
const options = {
Expand Down
175 changes: 174 additions & 1 deletion test/lib/server/middleware/MiddlewareManager.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
const test = require("ava");
const sinon = require("sinon");
const MiddlewareManager = require("../../../../lib/middleware/MiddlewareManager");
const middlewareRepository = require("../../../../lib/middleware/middlewareRepository");

test("Missing parameters", async (t) => {
const err = t.throws(() => {
Expand Down Expand Up @@ -31,7 +32,7 @@ test("applyMiddleware", async (t) => {
tree: {},
resources: {
all: "I",
rootProject: "like",
rootProject: "love",
dependencies: "ponies"
}
});
Expand All @@ -56,3 +57,175 @@ test("applyMiddleware", async (t) => {
t.deepEqual(appUseStub.getCall(0).args[0], "/myMountPath", "app.use got called with correct mount path parameter");
t.deepEqual(appUseStub.getCall(0).args[1], "myMiddleware", "app.use got called with correct middleware parameter");
});

test("addMiddleware: Add already added middleware", async (t) => {
const middlewareManager = new MiddlewareManager({
tree: {},
resources: {
all: "I",
rootProject: "like",
dependencies: "ponies"
}
});

await middlewareManager.addMiddleware("serveIndex");
const err = await t.throwsAsync(() => {
return middlewareManager.addMiddleware("serveIndex");
});
t.deepEqual(err.message, "Failed to add duplicate middleware serveIndex", "Rejected with correct error message");
});

test("addMiddleware: Add middleware", async (t) => {
const middlewareManager = new MiddlewareManager({
tree: {},
resources: {
all: "I",
rootProject: "like",
dependencies: "ponies"
}
});

await middlewareManager.addMiddleware("compression"); // Add some middleware

await middlewareManager.addMiddleware("serveIndex"); // Add middleware to test for
t.truthy(middlewareManager.middleware["serveIndex"], "Middleware got added to internal map");
t.truthy(middlewareManager.middleware["serveIndex"].middleware, "Middleware module is given");
t.deepEqual(middlewareManager.middleware["serveIndex"].mountPath, "/", "Correct default mount path set");

t.deepEqual(middlewareManager.middlewareExecutionOrder.length, 2,
"Two middleware got added to middleware execution order");
t.deepEqual(middlewareManager.middlewareExecutionOrder[1], "serveIndex",
"Last added middleware was added to the end of middleware execution order array");
});

test("addMiddleware: Add middleware with beforeMiddleware and mountPath parameter", async (t) => {
const middlewareManager = new MiddlewareManager({
tree: {},
resources: {
all: "I",
rootProject: "like",
dependencies: "ponies"
}
});

await middlewareManager.addMiddleware("compression"); // Add some middleware

await middlewareManager.addMiddleware("serveIndex", { // Add middleware to test for
beforeMiddleware: "compression",
mountPath: "/pony"
});
t.truthy(middlewareManager.middleware["serveIndex"], "Middleware got added to internal map");
t.truthy(middlewareManager.middleware["serveIndex"].middleware, "Middleware module is given");
t.deepEqual(middlewareManager.middleware["serveIndex"].mountPath, "/pony", "Correct mount path set");

t.deepEqual(middlewareManager.middlewareExecutionOrder.length, 2,
"Two middleware got added to middleware execution order");
t.deepEqual(middlewareManager.middlewareExecutionOrder[0], "serveIndex",
"Middleware was inserted at correct position of middleware execution order array");
});

test("addMiddleware: Add middleware with afterMiddleware parameter", async (t) => {
const middlewareManager = new MiddlewareManager({
tree: {},
resources: {
all: "I",
rootProject: "like",
dependencies: "ponies"
}
});

await middlewareManager.addMiddleware("compression"); // Add some middleware
await middlewareManager.addMiddleware("cors"); // Add some middleware

await middlewareManager.addMiddleware("serveIndex", { // Add middleware to test for
afterMiddleware: "compression"
});
t.truthy(middlewareManager.middleware["serveIndex"], "Middleware got added to internal map");
t.truthy(middlewareManager.middleware["serveIndex"].middleware, "Middleware module is given");
t.deepEqual(middlewareManager.middleware["serveIndex"].mountPath, "/", "Correct default mount path set");

t.deepEqual(middlewareManager.middlewareExecutionOrder.length, 3,
"Three middleware got added to middleware execution order");
t.deepEqual(middlewareManager.middlewareExecutionOrder[1], "serveIndex",
"Middleware was inserted at correct position of middleware execution order array");
});

test("addMiddleware: Add middleware with invalid afterMiddleware parameter", async (t) => {
const middlewareManager = new MiddlewareManager({
tree: {},
resources: {
all: "I",
rootProject: "like",
dependencies: "ponies"
}
});

await middlewareManager.addMiddleware("compression"); // Add some middleware

const err = await t.throwsAsync(() => {
return middlewareManager.addMiddleware("serveIndex", { // Add middleware to test for
afterMiddleware: "πŸ¦†"
});
});
t.deepEqual(err.message, "Could not find middleware πŸ¦†, referenced by custom middleware serveIndex");

t.falsy(middlewareManager.middleware["serveIndex"], "Middleware did not get added to internal map");
t.deepEqual(middlewareManager.middlewareExecutionOrder.length, 1,
"No new middleware got added to middleware execution order array");
});

test("addMiddleware: Add middleware with rapperCallback parameter", async (t) => {
const middlewareManager = new MiddlewareManager({
tree: {},
resources: {
all: "I",
rootProject: "like",
dependencies: "ponies"
}
});
const serveIndexModule = middlewareRepository.getMiddleware("serveIndex");

const moduleStub = sinon.stub().returns("πŸ…");
const wrapperCallbackStub = sinon.stub().returns(moduleStub);
await middlewareManager.addMiddleware("serveIndex", { // Add middleware to test for
wrapperCallback: wrapperCallbackStub
});
t.deepEqual(wrapperCallbackStub.callCount, 1, "Wrapper callback got called once");
t.is(wrapperCallbackStub.getCall(0).args[0], serveIndexModule, "Wrapper callback got called with correct module");
t.deepEqual(moduleStub.callCount, 1, "Wrapper callback got called once");
t.deepEqual(moduleStub.getCall(0).args[0].resources, {
all: "I",
rootProject: "like",
dependencies: "ponies"
}, "Wrapper callback got called with correct arguments");

t.truthy(middlewareManager.middleware["serveIndex"], "Middleware got added to internal map");
t.deepEqual(middlewareManager.middleware["serveIndex"].middleware, "πŸ…",
"Middleware module is given");
t.deepEqual(middlewareManager.middleware["serveIndex"].mountPath, "/", "Correct default mount path set");

t.deepEqual(middlewareManager.middlewareExecutionOrder.length, 1,
"One middleware got added to middleware execution order");
t.deepEqual(middlewareManager.middlewareExecutionOrder[0], "serveIndex",
"Middleware was inserted at correct position of middleware execution order array");
});

test("addMiddleware: Add middleware with async wrapperCallback", async (t) => {
const middlewareManager = new MiddlewareManager({
tree: {},
resources: {
all: "I",
rootProject: "like",
dependencies: "ponies"
}
});
const moduleStub = sinon.stub().resolves("πŸ…");
const wrapperCallbackStub = sinon.stub().returns(moduleStub);
await middlewareManager.addMiddleware("serveIndex", { // Add middleware to test for
wrapperCallback: wrapperCallbackStub
});

t.truthy(middlewareManager.middleware["serveIndex"], "Middleware got added to internal map");
t.deepEqual(middlewareManager.middleware["serveIndex"].middleware, "πŸ…",
"Middleware module is given");
});

0 comments on commit 89b7b91

Please sign in to comment.