Skip to content

Commit ea77e20

Browse files
committed
[FEATURE] Add test runner middleware
Static resources are copied over from OpenUI5.
1 parent b910a67 commit ea77e20

File tree

10 files changed

+1151
-1
lines changed

10 files changed

+1151
-1
lines changed

.eslintignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# /node_modules/* and /bower_components/* ignored by default
22

3+
# Ignore test runner static resources
4+
lib/middleware/testRunner/
5+
36
# Exclude coverage folder
47
coverage/
58

lib/middleware/MiddlewareManager.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ class MiddlewareManager {
121121
mountPath: "/discovery"
122122
});
123123
await this.addMiddleware("serveResources");
124+
await this.addMiddleware("testRunner");
124125
await this.addMiddleware("serveThemes");
125126
await this.addMiddleware("versionInfo", {
126127
mountPath: "/resources/sap-ui-version.json",

lib/middleware/middlewareRepository.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const middlewares = {
88
versionInfo: "./versionInfo",
99
connectUi5Proxy: "./connectUi5Proxy",
1010
serveThemes: "./serveThemes",
11+
testRunner: "./testRunner",
1112
nonReadRequests: "./nonReadRequests"
1213
};
1314

lib/middleware/testRunner.js

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
const {promisify} = require("util");
2+
const fs = require("graceful-fs");
3+
const readFile = promisify(fs.readFile);
4+
const path = require("path");
5+
const mime = require("mime-types");
6+
const log = require("@ui5/logger").getLogger("server:middleware:testRunner");
7+
8+
const testRunnerResourceRegEx = /\/test-resources\/sap\/ui\/qunit\/(testrunner\.(html|css)|TestRunner.js)$/;
9+
const resourceCache = {};
10+
11+
function serveResource(res, resourcePath, resourceContent) {
12+
const type = mime.lookup(resourcePath) || "application/octet-stream";
13+
const charset = mime.charset(type);
14+
const contentType = type + (charset ? "; charset=" + charset : "");
15+
16+
// resources served by this middleware do not change often
17+
res.setHeader("Cache-Control", "public, max-age=1800");
18+
19+
res.setHeader("Content-Type", contentType);
20+
res.end(resourceContent);
21+
}
22+
23+
/**
24+
* Creates and returns the middleware to serve a resource index.
25+
*
26+
* @module @ui5/server/middleware/testRunner
27+
* @param {object} parameters Parameters
28+
* @param {object} parameters.resources Contains the resource reader or collection to access project related files
29+
* @returns {Function} Returns a server middleware closure.
30+
*/
31+
function createMiddleware({resources}) {
32+
return async function(req, res, next) {
33+
try {
34+
const pathname = req.path; // TODO: Other middlewares use the parseurl module here but I don't get why
35+
const parts = testRunnerResourceRegEx.exec(pathname);
36+
const resourceName = parts && parts[1];
37+
38+
if (resourceName) { // either "testrunner.html", "testrunner.css" or "TestRunner.js" (case sensitive!)
39+
log.verbose(`Serving ${pathname}`);
40+
let pResource;
41+
if (!resourceCache[pathname]) {
42+
pResource = readFile(path.join(__dirname, "testRunner", resourceName), {encoding: "utf8"});
43+
resourceCache[pathname] = pResource;
44+
} else {
45+
pResource = resourceCache[pathname];
46+
}
47+
48+
const resourceContent = await pResource;
49+
serveResource(res, pathname, resourceContent);
50+
} else {
51+
next();
52+
}
53+
} catch (err) {
54+
next(err);
55+
}
56+
};
57+
}
58+
59+
module.exports = createMiddleware;

0 commit comments

Comments
 (0)