Skip to content

Commit 957519c

Browse files
committed
[INTERNAL] Refactor middlewareRepository to include specVersion
Pass new middlewareUtil instance to custom middleware defining spec version 2.0 or higher
1 parent af7f9ad commit 957519c

File tree

4 files changed

+131
-37
lines changed

4 files changed

+131
-37
lines changed

lib/middleware/MiddlewareManager.js

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,12 @@ class MiddlewareManager {
3636
wrapperCallback, mountPath = "/",
3737
beforeMiddleware, afterMiddleware
3838
} = {}) {
39-
let middlewareCallback = middlewareRepository.getMiddleware(configuredMiddlewareName);
39+
const middlewareInfo = middlewareRepository.getMiddleware(configuredMiddlewareName);
40+
let middlewareCallback;
4041
if (wrapperCallback) {
41-
middlewareCallback = wrapperCallback(middlewareCallback);
42+
middlewareCallback = wrapperCallback(middlewareInfo);
43+
} else {
44+
middlewareCallback = middlewareInfo.middleware;
4245
}
4346

4447
let middlewareName = configuredMiddlewareName;
@@ -82,7 +85,7 @@ class MiddlewareManager {
8285

8386
async addStandardMiddleware() {
8487
await this.addMiddleware("csp", {
85-
wrapperCallback: (cspModule) => {
88+
wrapperCallback: ({middleware: cspModule}) => {
8689
const oCspConfig = {
8790
allowDynamicPolicySelection: true,
8891
allowDynamicPolicyDefinition: true,
@@ -130,7 +133,7 @@ class MiddlewareManager {
130133
await this.addMiddleware("serveThemes");
131134
await this.addMiddleware("versionInfo", {
132135
mountPath: "/resources/sap-ui-version.json",
133-
wrapperCallback: (versionInfoModule) => {
136+
wrapperCallback: ({middleware: versionInfoModule}) => {
134137
return ({resources, middlewareUtil}) => {
135138
return versionInfoModule({
136139
resources,
@@ -147,7 +150,7 @@ class MiddlewareManager {
147150
// as it will reject them with a 405 (Method not allowed) instead of 404 like our old tooling
148151
await this.addMiddleware("nonReadRequests");
149152
await this.addMiddleware("serveIndex", {
150-
wrapperCallback: (middleware) => {
153+
wrapperCallback: ({middleware: middleware}) => {
151154
return ({resources, middlewareUtil}) => middleware({
152155
resources,
153156
middlewareUtil,
@@ -182,15 +185,17 @@ class MiddlewareManager {
182185
}
183186

184187
await this.addMiddleware(middlewareDef.name, {
185-
wrapperCallback: (middleware) => {
188+
wrapperCallback: ({middleware: middleware, specVersion}) => {
186189
return ({resources, middlewareUtil}) => {
187190
const options = {
188191
configuration: middlewareDef.configuration
189192
};
190-
// TODO: Pass "middlewareUtil" only to custom middleware with specVersion >=2.0
191-
// Requires middleware-/task-repository enhancement
192-
// Use middlewareUtil.getInterface(specVersion)
193-
return middleware({resources, options});
193+
const params = {resources, options};
194+
if (specVersion === "2.0") {
195+
// Supply interface to MiddlewareUtil instance starting with specVersion 2.0
196+
params.middlewareUtil = middlewareUtil.getInterface(specVersion);
197+
}
198+
return middleware(params);
194199
};
195200
},
196201
mountPath: middlewareDef.mountPath,

lib/middleware/middlewareRepository.js

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,37 @@
11
const middlewares = {
2-
compression: "compression",
3-
cors: "cors",
4-
csp: "./csp",
5-
serveResources: "./serveResources",
6-
serveIndex: "./serveIndex",
7-
discovery: "./discovery",
8-
versionInfo: "./versionInfo",
9-
connectUi5Proxy: "./connectUi5Proxy",
10-
serveThemes: "./serveThemes",
11-
testRunner: "./testRunner",
12-
nonReadRequests: "./nonReadRequests"
2+
compression: {path: "compression"},
3+
cors: {path: "cors"},
4+
csp: {path: "./csp"},
5+
serveResources: {path: "./serveResources"},
6+
serveIndex: {path: "./serveIndex"},
7+
discovery: {path: "./discovery"},
8+
versionInfo: {path: "./versionInfo"},
9+
connectUi5Proxy: {path: "./connectUi5Proxy"},
10+
serveThemes: {path: "./serveThemes"},
11+
testRunner: {path: "./testRunner"},
12+
nonReadRequests: {path: "./nonReadRequests"}
1313
};
1414

1515
function getMiddleware(middlewareName) {
16-
const middlewarePath = middlewares[middlewareName];
16+
const middlewareInfo = middlewares[middlewareName];
1717

18-
if (!middlewarePath) {
18+
if (!middlewareInfo) {
1919
throw new Error(`middlewareRepository: Unknown Middleware ${middlewareName}`);
2020
}
21-
return require(middlewarePath);
21+
return {
22+
middleware: require(middlewareInfo.path),
23+
specVersion: middlewareInfo.specVersion
24+
};
2225
}
2326

24-
function addMiddleware(name, middlewarePath) {
27+
function addMiddleware({name, specVersion, middlewarePath}) {
2528
if (middlewares[name]) {
26-
throw new Error(`middlewareRepository: Middleware ${name} already registered`);
29+
throw new Error(`middlewareRepository: A middleware with the name ${name} has already been registered`);
2730
}
28-
middlewares[name] = middlewarePath;
31+
middlewares[name] = {
32+
path: middlewarePath,
33+
specVersion
34+
};
2935
}
3036

3137
module.exports = {

test/lib/server/middleware/MiddlewareManager.js

Lines changed: 73 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -222,15 +222,16 @@ test("addMiddleware: Add middleware with rapperCallback parameter", async (t) =>
222222
dependencies: "ponies"
223223
}
224224
});
225-
const serveIndexModule = middlewareRepository.getMiddleware("serveIndex");
225+
const serveIndexMiddlewareInfo = middlewareRepository.getMiddleware("serveIndex");
226226

227227
const moduleStub = sinon.stub().returns("🍅");
228228
const wrapperCallbackStub = sinon.stub().returns(moduleStub);
229229
await middlewareManager.addMiddleware("serveIndex", { // Add middleware to test for
230230
wrapperCallback: wrapperCallbackStub
231231
});
232232
t.deepEqual(wrapperCallbackStub.callCount, 1, "Wrapper callback got called once");
233-
t.is(wrapperCallbackStub.getCall(0).args[0], serveIndexModule, "Wrapper callback got called with correct module");
233+
t.deepEqual(wrapperCallbackStub.getCall(0).args[0], serveIndexMiddlewareInfo,
234+
"Wrapper callback got called with correct module");
234235
t.deepEqual(moduleStub.callCount, 1, "Wrapper callback got called once");
235236
t.deepEqual(moduleStub.getCall(0).args[0].resources, {
236237
all: "I",
@@ -514,11 +515,20 @@ test("addCustomMiddleware: wrapperCallback", async (t) => {
514515

515516
const wrapperCallback = addMiddlewareStub.getCall(0).args[1].wrapperCallback;
516517
const middlewareModuleStub = sinon.stub().returns("ok");
517-
const middlewareWrapper = wrapperCallback(middlewareModuleStub);
518+
const middlewareModuleInfo = {
519+
middleware: middlewareModuleStub,
520+
specVersion: "1.1"
521+
};
522+
const middlewareWrapper = wrapperCallback(middlewareModuleInfo);
523+
const middlewareUtil = {
524+
getInterface: sinon.stub().returns("interfacedMiddlewareUtil")
525+
};
518526
const res = middlewareWrapper({
519-
resources: "resources"
527+
resources: "resources",
528+
middlewareUtil
520529
});
521530
t.deepEqual(res, "ok", "Wrapper callback returned expected value");
531+
t.is(middlewareUtil.getInterface.callCount, 0, "middlewareUtil.getInterface has not been called");
522532
t.deepEqual(middlewareModuleStub.callCount, 1, "Middleware module got called once");
523533
t.deepEqual(middlewareModuleStub.getCall(0).args[0], {
524534
resources: "resources",
@@ -529,3 +539,62 @@ test("addCustomMiddleware: wrapperCallback", async (t) => {
529539
}
530540
}, "Middleware module got called with correct arguments");
531541
});
542+
543+
test("addCustomMiddleware: wrapperCallback provides middlewareUtil to custom middleware", async (t) => {
544+
const project = {
545+
metadata: {
546+
name: "my project"
547+
},
548+
server: {
549+
customMiddleware: [{
550+
name: "my custom middleware A",
551+
beforeMiddleware: "cors",
552+
configuration: {
553+
"🦊": "🐰"
554+
}
555+
}]
556+
}
557+
};
558+
const middlewareManager = new MiddlewareManager({
559+
tree: project,
560+
resources: {
561+
all: "I",
562+
rootProject: "like",
563+
dependencies: "ponies"
564+
}
565+
});
566+
const addMiddlewareStub = sinon.stub(middlewareManager, "addMiddleware").resolves();
567+
await middlewareManager.addCustomMiddleware();
568+
569+
t.deepEqual(addMiddlewareStub.callCount, 1, "addMiddleware was called once");
570+
571+
const wrapperCallback = addMiddlewareStub.getCall(0).args[1].wrapperCallback;
572+
const middlewareModuleStub = sinon.stub().returns("ok");
573+
const middlewareModuleInfo = {
574+
middleware: middlewareModuleStub,
575+
specVersion: "2.0"
576+
};
577+
const middlewareWrapper = wrapperCallback(middlewareModuleInfo);
578+
const middlewareUtil = {
579+
getInterface: sinon.stub().returns("interfacedMiddlewareUtil")
580+
};
581+
const res = middlewareWrapper({
582+
resources: "resources",
583+
middlewareUtil
584+
});
585+
586+
t.deepEqual(res, "ok", "Wrapper callback returned expected value");
587+
t.is(middlewareUtil.getInterface.callCount, 1, "middlewareUtil.getInterface got called once");
588+
t.deepEqual(middlewareUtil.getInterface.getCall(0).args[0], "2.0",
589+
"middlewareUtil.getInterface got called correct arguments");
590+
t.deepEqual(middlewareModuleStub.callCount, 1, "Middleware module got called once");
591+
t.deepEqual(middlewareModuleStub.getCall(0).args[0], {
592+
resources: "resources",
593+
options: {
594+
configuration: {
595+
"🦊": "🐰"
596+
}
597+
},
598+
middlewareUtil: "interfacedMiddlewareUtil"
599+
}, "Middleware module got called with correct arguments");
600+
});
Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
const test = require("ava");
2+
const path = require("path");
23
const middlewareRepository = require("../../../../lib/middleware/middlewareRepository");
34

45
test("getMiddleware", async (t) => {
56
const cspModule = require("../../../../lib/middleware/csp");
67
const res = middlewareRepository.getMiddleware("csp");
7-
t.is(res, cspModule, "Returned correct middleware module");
8+
t.deepEqual(res, {
9+
middleware: cspModule,
10+
specVersion: undefined
11+
}, "Returned correct middleware module");
812
});
913

1014
test("getMiddleware: Unknown middleware", async (t) => {
@@ -16,17 +20,27 @@ test("getMiddleware: Unknown middleware", async (t) => {
1620
});
1721

1822
test("addMiddleware", async (t) => {
19-
const cspModule = require("../../../../lib/middleware/csp");
20-
middlewareRepository.addMiddleware("🐠", "./csp");
23+
const cspModulePath = path.posix.join(__dirname, "..", "..", "..", "..", "lib", "middleware", "csp");
24+
middlewareRepository.addMiddleware({
25+
name: "🐠",
26+
specVersion: "2.0",
27+
middlewarePath: cspModulePath
28+
});
2129
const res = middlewareRepository.getMiddleware("🐠");
2230

23-
t.is(res, cspModule, "Returned added middleware module");
31+
t.deepEqual(res, {
32+
middleware: require(cspModulePath),
33+
specVersion: "2.0",
34+
}, "Returned correct middleware module");
2435
});
2536

2637
test("addMiddleware: Duplicate middleware", async (t) => {
2738
const err = t.throws(() => {
28-
middlewareRepository.addMiddleware("cors");
39+
middlewareRepository.addMiddleware({
40+
name: "cors"
41+
});
2942
});
30-
t.deepEqual(err.message, "middlewareRepository: Middleware cors already registered",
43+
t.deepEqual(err.message,
44+
"middlewareRepository: A middleware with the name cors has already been registered",
3145
"Threw error with correct message");
3246
});

0 commit comments

Comments
 (0)