From eaa0e3f8bdeabdf0a4d360f92273c35cacc2f15f Mon Sep 17 00:00:00 2001 From: "Juan Picado @jotadeveloper" Date: Thu, 25 Jan 2018 21:36:26 +0100 Subject: [PATCH] test(unit): add unit test for ping and whoiam --- package.json | 1 + src/api/debug/index.js | 20 ++++++++++++++ src/api/endpoint/index.js | 2 -- src/api/index.js | 45 ++++--------------------------- src/api/web/middleware.js | 26 ++++++++++++++++++ test/unit/api/api.spec.js | 48 +++++++++++++++++++++++++++++++++ test/unit/partials/config.js | 2 -- yarn.lock | 52 ++++++++++++++++++++++++++++-------- 8 files changed, 141 insertions(+), 55 deletions(-) create mode 100644 src/api/debug/index.js create mode 100644 test/unit/api/api.spec.js diff --git a/package.json b/package.json index 45dfae3f0..b1a70d21c 100644 --- a/package.json +++ b/package.json @@ -121,6 +121,7 @@ "stylelint-config-recommended-scss": "3.0.0", "stylelint-scss": "2.2.0", "stylelint-webpack-plugin": "0.10.1", + "supertest": "^3.0.0", "url-loader": "0.6.2", "webpack": "3.10.0", "webpack-dev-server": "2.11.1", diff --git a/src/api/debug/index.js b/src/api/debug/index.js new file mode 100644 index 000000000..308b8c77d --- /dev/null +++ b/src/api/debug/index.js @@ -0,0 +1,20 @@ +import _ from 'lodash'; + +export default (app, selfPath) => { + // Hook for tests only + app.get('/-/_debug', function(req, res, next) { + const doGarbabeCollector = _.isNil(global.gc) === false; + + if (doGarbabeCollector) { + global.gc(); + } + + next({ + pid: process.pid, + main: process.mainModule.filename, + conf: selfPath, + mem: process.memoryUsage(), + gc: doGarbabeCollector, + }); + }); +}; diff --git a/src/api/endpoint/index.js b/src/api/endpoint/index.js index 0bb08f1e8..e503bb143 100644 --- a/src/api/endpoint/index.js +++ b/src/api/endpoint/index.js @@ -1,5 +1,3 @@ -'use strict'; - const express = require('express'); const bodyParser = require('body-parser'); const Middleware = require('../web/middleware'); diff --git a/src/api/index.js b/src/api/index.js index 9da392318..ffcacff65 100644 --- a/src/api/index.js +++ b/src/api/index.js @@ -5,6 +5,7 @@ import _ from 'lodash'; import cors from 'cors'; import Storage from '../lib/storage'; import {loadPlugin} from '../lib/plugin-loader'; +import hookDebug from './debug'; const Auth = require('../lib/auth'); const Logger = require('../lib/logger'); @@ -24,34 +25,9 @@ module.exports = function(configHash) { app.set('env', process.env.NODE_ENV || 'production'); app.use(cors()); - // Middleware - const error_reporting_middleware = function(req, res, next) { - res.report_error = res.report_error || function(err) { - if (err.status && err.status >= 400 && err.status < 600) { - if (_.isNil(res.headersSent) === false) { - res.status(err.status); - next({error: err.message || 'unknown error'}); - } - } else { - Logger.logger.error( {err: err} - , 'unexpected error: @{!err.message}\n@{err.stack}'); - if (!res.status || !res.send) { - Logger.logger.error('this is an error in express.js, please report this'); - res.destroy(); - } else if (!res.headersSent) { - res.status(500); - next({error: 'internal server error'}); - } else { - // socket should be already closed - } - } - }; - next(); - }; - // Router setup app.use(Middleware.log); - app.use(error_reporting_middleware); + app.use(Middleware.errorReportingMiddleware); app.use(function(req, res, next) { res.setHeader('X-Powered-By', config.user_agent); next(); @@ -66,20 +42,9 @@ module.exports = function(configHash) { // Hook for tests only if (config._debug) { - app.get('/-/_debug', function(req, res, next) { - const do_gc = _.isNil(global.gc) === false; - if (do_gc) { - global.gc(); - } - next({ - pid: process.pid, - main: process.mainModule.filename, - conf: config.self_path, - mem: process.memoryUsage(), - gc: do_gc, - }); - }); + hookDebug(app, config.self_path); } + // register middleware plugins const plugin_params = { config: config, @@ -118,7 +83,7 @@ module.exports = function(configHash) { if (_.isFunction(res.report_error) === false) { // in case of very early error this middleware may not be loaded before error is generated // fixing that - error_reporting_middleware(req, res, _.noop); + Middleware.errorReportingMiddleware(req, res, _.noop); } res.report_error(err); } else { diff --git a/src/api/web/middleware.js b/src/api/web/middleware.js index d503c95e6..1336ea866 100644 --- a/src/api/web/middleware.js +++ b/src/api/web/middleware.js @@ -251,3 +251,29 @@ module.exports.log = function(req, res, next) { }; next(); }; + +// Middleware +module.exports.errorReportingMiddleware = function(req, res, next) { + res.report_error = res.report_error || function(err) { + if (err.status && err.status >= 400 && err.status < 600) { + if (_.isNil(res.headersSent) === false) { + res.status(err.status); + next({error: err.message || 'unknown error'}); + } + } else { + Logger.logger.error( {err: err} + , 'unexpected error: @{!err.message}\n@{err.stack}'); + if (!res.status || !res.send) { + Logger.logger.error('this is an error in express.js, please report this'); + res.destroy(); + } else if (!res.headersSent) { + res.status(500); + next({error: 'internal server error'}); + } else { + // socket should be already closed + } + } + }; + next(); +}; + diff --git a/test/unit/api/api.spec.js b/test/unit/api/api.spec.js new file mode 100644 index 000000000..837903115 --- /dev/null +++ b/test/unit/api/api.spec.js @@ -0,0 +1,48 @@ +import request from 'supertest'; +import configDefault from '../partials/config'; +import Config from '../../../src/lib/config'; +import Storage from '../../../src/lib/storage'; +import Auth from '../../../src/lib/auth'; +import indexAPI from '../../../src/api/index'; + +require('../../../src/lib/logger').setup([]); + +describe('endpoint unit test', () => { + let config; + let storage; + let auth; + let app; + + beforeAll(function() { + config = new Config(configDefault); + storage = new Storage(config); + auth = new Auth(config); + app = indexAPI(config, auth, storage); + }); + + describe('ping unit test', () => { + test('test /-/ping', (done) => { + request(app) + .get('/-/ping') + .expect('Content-Type', /json/) + .expect(200, done) + }); + }); + + describe('whoami unit test', () => { + test('test /-/whoami', (done) => { + request(app) + .get('/-/whoami') + .expect('Content-Type', /json/) + .expect(200, done) + }); + + test('test /whoami', (done) => { + request(app) + .get('/-/whoami') + .expect('Content-Type', /json/) + .expect(200, done) + }); + }); + +}); diff --git a/test/unit/partials/config.js b/test/unit/partials/config.js index d1ce23755..6879df45d 100644 --- a/test/unit/partials/config.js +++ b/test/unit/partials/config.js @@ -1,5 +1,3 @@ -'use strict'; - const config = { storage: __dirname + '/store/test-storage', uplinks: { diff --git a/yarn.lock b/yarn.lock index 9927916fb..78d0a4cf0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1973,7 +1973,7 @@ compare-func@^1.3.1: array-ify "^1.0.0" dot-prop "^3.0.0" -component-emitter@^1.2.1: +component-emitter@^1.2.0, component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" @@ -2188,6 +2188,10 @@ cookie@0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" +cookiejar@^2.1.0: + version "2.1.1" + resolved "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.1.tgz#41ad57b1b555951ec171412a81942b1e8200d34a" + cookies@^0.7.0: version "0.7.1" resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.7.1.tgz#7c8a615f5481c61ab9f16c833731bcb8f663b99b" @@ -3521,6 +3525,14 @@ forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" +form-data@^2.3.1, form-data@~2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + form-data@~2.1.1: version "2.1.4" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" @@ -3529,13 +3541,9 @@ form-data@~2.1.1: combined-stream "^1.0.5" mime-types "^2.1.12" -form-data@~2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.12" +formidable@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz#96b8886f7c3c3508b932d6bd70c4d3a88f35f1a9" forwarded@~0.1.2: version "0.1.2" @@ -5571,7 +5579,7 @@ merge@^1.1.3: version "1.2.0" resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" -methods@~1.1.2: +methods@^1.1.1, methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -6846,7 +6854,7 @@ q@^1.1.2, q@^1.4.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" -qs@6.5.1, qs@~6.5.1: +qs@6.5.1, qs@^6.5.1, qs@~6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" @@ -7089,7 +7097,7 @@ readable-stream@1.0: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.3: +readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" dependencies: @@ -8157,6 +8165,28 @@ sugarss@^1.0.0: dependencies: postcss "^6.0.14" +superagent@^3.0.0: + version "3.8.2" + resolved "https://registry.npmjs.org/superagent/-/superagent-3.8.2.tgz#e4a11b9d047f7d3efeb3bbe536d9ec0021d16403" + dependencies: + component-emitter "^1.2.0" + cookiejar "^2.1.0" + debug "^3.1.0" + extend "^3.0.0" + form-data "^2.3.1" + formidable "^1.1.1" + methods "^1.1.1" + mime "^1.4.1" + qs "^6.5.1" + readable-stream "^2.0.5" + +supertest@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/supertest/-/supertest-3.0.0.tgz#8d4bb68fd1830ee07033b1c5a5a9a4021c965296" + dependencies: + methods "~1.1.2" + superagent "^3.0.0" + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"