From cbed66139daf25af33de0abb78e1d08a0548a283 Mon Sep 17 00:00:00 2001 From: Marek Stasikowski and Simon Adcock Date: Tue, 21 Jul 2015 14:06:51 +0100 Subject: [PATCH 1/3] discover option with default module to display all registered endpoints --- lib/arguments/arguments.js | 5 +++++ lib/drakov.js | 14 ++++++++++++++ lib/middleware/discover.js | 21 +++++++++++++++++++++ views/discover.jade | 7 +++++++ views/layout.jade | 6 ++++++ 5 files changed, 53 insertions(+) create mode 100644 lib/middleware/discover.js create mode 100644 views/discover.jade create mode 100644 views/layout.jade diff --git a/lib/arguments/arguments.js b/lib/arguments/arguments.js index 24a587b..01d6dc9 100644 --- a/lib/arguments/arguments.js +++ b/lib/arguments/arguments.js @@ -43,6 +43,11 @@ module.exports = { }, config: { description: 'Load configuration from a Javascript file, must export an object' + }, + discover: { + description: 'List all available endpoints under `/`. If it\'s a module name, it will be required and called to create a middleware function to handle `/`.', + alias: 'D', + default: false } }; diff --git a/lib/drakov.js b/lib/drakov.js index 229e543..5cd05dd 100644 --- a/lib/drakov.js +++ b/lib/drakov.js @@ -26,8 +26,22 @@ exports.run = function(argv, cb) { if (err) { throw err; } + + var discoverabilityModule; + app.use(middlewareFunction); server = setup.startServer(argv, app, cb); + if (argv.discover && typeof argv.discover === 'string') { + discoverabilityModule = require(argv.discover); + } + else { + app.set('views', 'views'); + app.set('view engine', 'jade'); + discoverabilityModule = require('./middleware/discover'); + } + if (argv.discover) { + app.get('/', discoverabilityModule(argv)); + } }); }; diff --git a/lib/middleware/discover.js b/lib/middleware/discover.js new file mode 100644 index 0000000..2feccf1 --- /dev/null +++ b/lib/middleware/discover.js @@ -0,0 +1,21 @@ +var buildRouteMap = require('./route-map'); + +module.exports = function(sourceFiles) { + return function(req, res, next) { + if (res.headersSent) { + next(); + } + else { + buildRouteMap(sourceFiles, function(err, routeMap) { + if (err) { + next(err); + } + else { + res.render('discover', { + routes: Object.keys(routeMap) + }); + } + }); + } + }; +}; diff --git a/views/discover.jade b/views/discover.jade new file mode 100644 index 0000000..828fc32 --- /dev/null +++ b/views/discover.jade @@ -0,0 +1,7 @@ +extends layout +block content + h1= 'Available endpoints' + ul + - routes.forEach(function(route) { + li= route + - }); diff --git a/views/layout.jade b/views/layout.jade new file mode 100644 index 0000000..347da21 --- /dev/null +++ b/views/layout.jade @@ -0,0 +1,6 @@ +doctype html +html + head + title= 'Drakov' + body + block content From 53177d1cfaa56e234acdd6c19434ba3f43538d46 Mon Sep 17 00:00:00 2001 From: Marek Stasikowski and Simon Adcock Date: Tue, 21 Jul 2015 14:45:16 +0100 Subject: [PATCH 2/3] Add discover option tests --- test/api/discover-test.js | 92 +++++++++++++++++++++++++++++++ test/example/md/root-level-api.md | 11 ++++ 2 files changed, 103 insertions(+) create mode 100644 test/api/discover-test.js create mode 100644 test/example/md/root-level-api.md diff --git a/test/api/discover-test.js b/test/api/discover-test.js new file mode 100644 index 0000000..ccba495 --- /dev/null +++ b/test/api/discover-test.js @@ -0,0 +1,92 @@ +var helper = require('../lib'); +var request = helper.getRequest(); + +describe('Discover', function() { + describe('Simple-API', function() { + describe('Discover option true', function() { + before(function(done) { + helper.drakov.run({sourceFiles: 'test/example/md/simple-api.md', discover: true}, done); + }); + + after(function(done) { + helper.drakov.stop(done); + }); + + describe('/', function() { + describe('GET', function() { + it('should get discover page', function(done) { + request.get('/') + .expect(200) + .expect('Content-type', 'text/html; charset=utf-8') + .end(helper.endCb(done)); + }); + }); + }); + }); + describe('Discover option not specified', function() { + before(function(done) { + helper.drakov.run({sourceFiles: 'test/example/md/simple-api.md'}, done); + }); + + after(function(done) { + helper.drakov.stop(done); + }); + + describe('/', function() { + describe('GET', function() { + it('should get 404', function(done) { + request.get('/') + .expect(404) + .end(helper.endCb(done)); + }); + }); + }); + }); + }); + + describe('Root-Level-API', function() { + describe('Discover option not specified', function() { + before(function(done) { + helper.drakov.run({sourceFiles: 'test/example/md/root-level-api.md'}, done); + }); + + after(function(done) { + helper.drakov.stop(done); + }); + + describe('/', function() { + describe('GET', function() { + it('should get root level request rather than discover page', function(done) { + request.get('/') + .expect(200) + .expect('Content-type', 'application/json;charset=UTF-8') + .expect({Slash: 'http://images5.fanpop.com/image/photos/31200000/Slash-slash-31278382-1707-2560.jpg'}) + .end(helper.endCb(done)); + }); + }); + }); + }); + + describe('Discover option true', function() { + before(function(done) { + helper.drakov.run({sourceFiles: 'test/example/md/root-level-api.md', discover: true}, done); + }); + + after(function(done) { + helper.drakov.stop(done); + }); + + describe('/', function() { + describe('GET', function() { + it('should get root level request rather than discover page', function(done) { + request.get('/') + .expect(200) + .expect('Content-type', 'application/json;charset=UTF-8') + .expect({Slash: 'http://images5.fanpop.com/image/photos/31200000/Slash-slash-31278382-1707-2560.jpg'}) + .end(helper.endCb(done)); + }); + }); + }); + }); + }); +}); diff --git a/test/example/md/root-level-api.md b/test/example/md/root-level-api.md new file mode 100644 index 0000000..a9ec762 --- /dev/null +++ b/test/example/md/root-level-api.md @@ -0,0 +1,11 @@ + +## Slash [/] + +### Retrieve Slash [GET] + ++ Response 200 (application/json;charset=UTF-8) + + + Body + { + "Slash": "http://images5.fanpop.com/image/photos/31200000/Slash-slash-31278382-1707-2560.jpg" + } From b16dcc4506b447125d56c035d61779076ce64414 Mon Sep 17 00:00:00 2001 From: Marek Stasikowski and Simon Adcock Date: Tue, 21 Jul 2015 15:20:34 +0100 Subject: [PATCH 3/3] add Jade to dependencies --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 9847d5d..30b72cf 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "colors": "^1.1.0", "express": "^4.12.3", "glob": "^5.0.5", + "jade": "^1.11.0", "lodash": "^3.8.0", "optimist": "0.6.1", "path-to-regexp": "^1.0.3",