From 93ed7746095eb8d62743e312eb6bd898d5795b72 Mon Sep 17 00:00:00 2001 From: Sebastian Seedorf Date: Fri, 20 Nov 2020 08:42:41 +0100 Subject: [PATCH] Added backend tests and npm test to Dockerfile --- Dockerfile | 3 + package-lock.json | 146 +++++++++++++++++++++++++++++++++ package.json | 8 +- public/js-source/test/index.ts | 2 + src/routes/api/user.ts | 2 +- test/routes/healthcheck.ts | 18 ++++ 6 files changed, 176 insertions(+), 3 deletions(-) create mode 100644 test/routes/healthcheck.ts diff --git a/Dockerfile b/Dockerfile index 9d0bbb1..5690c8f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -31,6 +31,9 @@ RUN apk del .npm-install-virt USER appuser ENV NODE_ENV production +# test +RUN npm test + # cleanup USER root RUN rm -r ./src ./public/js-source ./bio-proxy-configuration-for-docker && \ diff --git a/package-lock.json b/package-lock.json index 598439c..eaac6cb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -612,6 +612,12 @@ "@types/node": "*" } }, + "@types/cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", + "dev": true + }, "@types/express": { "version": "4.17.9", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.9.tgz", @@ -647,6 +653,17 @@ "integrity": "sha512-2aoSC4UUbHDj2uCsCxcG/vRMXey/m17bC7UwitVm5hn22nI8O8Y9iDpA76Orc+DWkQ4zZrOKEshCqR/jSuXAHA==", "dev": true }, + "@types/jsdom": { + "version": "16.2.5", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-16.2.5.tgz", + "integrity": "sha512-k/ZaTXtReAjwWu0clU0KLS53dyqZnA8mm+jwKFeFrvufXgICp+VNbskETFxKKAguv0pkaEKTax5MaRmvalM+TA==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/parse5": "*", + "@types/tough-cookie": "*" + } + }, "@types/json-schema": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", @@ -693,6 +710,12 @@ "@types/node-sass": "*" } }, + "@types/parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", + "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==", + "dev": true + }, "@types/proper-url-join": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@types/proper-url-join/-/proper-url-join-2.0.0.tgz", @@ -719,6 +742,12 @@ "@types/node": "*" } }, + "@types/rewire": { + "version": "2.5.28", + "resolved": "https://registry.npmjs.org/@types/rewire/-/rewire-2.5.28.tgz", + "integrity": "sha512-uD0j/AQOa5le7afuK+u+woi8jNKF1vf3DN0H7LCJhft/lNNibUr7VcAesdgtWfEKveZol3ZG1CJqwx2Bhrnl8w==", + "dev": true + }, "@types/serve-static": { "version": "1.13.8", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.8.tgz", @@ -728,6 +757,31 @@ "@types/node": "*" } }, + "@types/superagent": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.10.tgz", + "integrity": "sha512-xAgkb2CMWUMCyVc/3+7iQfOEBE75NvuZeezvmixbUw3nmENf2tCnQkW5yQLTYqvXUQ+R6EXxdqKKbal2zM5V/g==", + "dev": true, + "requires": { + "@types/cookiejar": "*", + "@types/node": "*" + } + }, + "@types/supertest": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.10.tgz", + "integrity": "sha512-Xt8TbEyZTnD5Xulw95GLMOkmjGICrOQyJ2jqgkSjAUR3mm7pAIzSR0NFBaMcwlzVvlpCjNwbATcWWwjNiZiFrQ==", + "dev": true, + "requires": { + "@types/superagent": "*" + } + }, + "@types/tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A==", + "dev": true + }, "@typescript-eslint/eslint-plugin": { "version": "4.8.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.8.1.tgz", @@ -1523,6 +1577,11 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -1693,6 +1752,11 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" + }, "core-js": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.7.0.tgz", @@ -2719,6 +2783,11 @@ "mime-types": "^2.1.12" } }, + "formidable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", + "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==" + }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", @@ -6173,6 +6242,83 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, + "superagent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", + "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", + "requires": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.2", + "debug": "^4.1.1", + "fast-safe-stringify": "^2.0.7", + "form-data": "^3.0.0", + "formidable": "^1.2.2", + "methods": "^1.1.2", + "mime": "^2.4.6", + "qs": "^6.9.4", + "readable-stream": "^3.6.0", + "semver": "^7.3.2" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "form-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", + "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "qs": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", + "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==" + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" + } + } + }, + "supertest": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.0.1.tgz", + "integrity": "sha512-8yDNdm+bbAN/jeDdXsRipbq9qMpVF7wRsbwLgsANHqdjPsCoecmlTuqEcLQMGpmojFBhxayZ0ckXmLXYq7e+0g==", + "requires": { + "methods": "1.1.2", + "superagent": "6.1.0" + } + }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", diff --git a/package.json b/package.json index f44eb60..68c70da 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "debug-client": "tsc-watch --project ./public/js-source", "debug-server": "tsc-watch --project . --onSuccess \"node --enable-source-maps --use-openssl-ca --unhandled-rejections=strict ./out/index\"", "debug": "concurrently npm:debug-*", - "test": "nyc mocha -r ts-node/register ./public/js-source/test/**/*.ts", + "test": "nyc mocha -r ts-node/register ./public/js-source/test/**/*.ts ./test/**/*.ts", "build": "tsc", "production": "node --use-openssl-ca --unhandled-rejections=strict ./out/index", "install-debug": "npm install && npm run build", @@ -25,16 +25,20 @@ "node-sass-middleware": "0.11.0", "pkg-express-utils": "git+https://git.biotronik.int/scm/coe-bs-website/node-pkg-express-utils.git", "pug": "^3.0.0", - "role-acl": "^4.5.4" + "role-acl": "^4.5.4", + "supertest": "^6.0.1" }, "devDependencies": { "@types/chai": "^4.2.14", "@types/compression": "^1.7.0", "@types/express": "^4.17.8", "@types/http-errors": "^1.8.0", + "@types/jsdom": "^16.2.5", "@types/mocha": "^8.0.4", "@types/node": "^14.14.7", "@types/node-sass-middleware": "0.0.31", + "@types/rewire": "^2.5.28", + "@types/supertest": "^2.0.10", "@typescript-eslint/eslint-plugin": "^4.7.0", "@typescript-eslint/parser": "^4.7.0", "chai": "^4.2.0", diff --git a/public/js-source/test/index.ts b/public/js-source/test/index.ts index 36107f6..005beea 100644 --- a/public/js-source/test/index.ts +++ b/public/js-source/test/index.ts @@ -21,6 +21,8 @@ describe('frontend:index', () => { {url: 'http://localhost'}, ); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore // noinspection JSConstantReassignment global.window = dom.window; // noinspection JSConstantReassignment diff --git a/src/routes/api/user.ts b/src/routes/api/user.ts index 7e15f67..bef4b0f 100644 --- a/src/routes/api/user.ts +++ b/src/routes/api/user.ts @@ -3,7 +3,7 @@ import {PermManager} from 'pkg-express-utils'; const userRouter = express.Router(); -/* GET users listing. */ +/* GET user info. */ userRouter.get('/', PermManager.getRouter('userinfo', {action: 'read'}), async (req, res) => { res.json(await req.getUserInfo() || {}); }); diff --git a/test/routes/healthcheck.ts b/test/routes/healthcheck.ts new file mode 100644 index 0000000..148330c --- /dev/null +++ b/test/routes/healthcheck.ts @@ -0,0 +1,18 @@ +import healthRouter from '../../src/routes/healthcheck'; +import * as request from 'supertest'; +import * as express from 'express'; + +describe('backend:routes/healthcheck', () => { + it('should return 200', (done) => { + const app = express(); + app.use(healthRouter); + request(app) + .get("/") + .set('Accept', 'application/json') + .expect(200) + .end((err, res) => { + if (err) throw err; + done(); + }); + }); +});