From b0fa4ce609c94ea7e0c67e1abdc2301f579d6e92 Mon Sep 17 00:00:00 2001 From: Ritchie Martori Date: Mon, 30 Jun 2014 11:28:16 -0700 Subject: [PATCH 1/2] Add remoting meta to workspace methods --- models.json | 2 +- models/workspace.js | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/models.json b/models.json index d5435815..73b15922 100644 --- a/models.json +++ b/models.json @@ -11,7 +11,7 @@ "properties": { "name": {"id": true, "type": "string"} }, - "public": false, + "public": true, "dataSource": "db" }, "PackageDefinition": { diff --git a/models/workspace.js b/models/workspace.js index fb84e712..9df80050 100644 --- a/models/workspace.js +++ b/models/workspace.js @@ -14,6 +14,7 @@ var ViewDefinition = app.models.ViewDefinition; var TEMPLATE_DIR = path.join(__dirname, '..', 'templates'); var DEFAULT_TEMPLATE = 'api-server'; var debug = require('debug')('workspace'); +var loopback = require('loopback'); /** * Groups related LoopBack applications. @@ -35,6 +36,10 @@ Workspace.getAvailableTemplates = function(cb) { fs.readdir(TEMPLATE_DIR, cb); } +loopback.remoteMethod(Workspace.getAvailableTemplates, { + http: {verb: 'get', path: '/component-templates'} +}); + Workspace.addComponent = function(options, cb) { var template; var templateName = options.template || DEFAULT_TEMPLATE; @@ -149,6 +154,11 @@ Workspace.addComponent = function(options, cb) { async.parallel(steps, cb); } +loopback.remoteMethod(Workspace.addComponent, { + http: {verb: 'post', path: '/component'}, + accepts: {arg: 'options', type: 'object', {http: { source: 'body' }}}] +}); + /** * In the attached `dataSource`, create a set of app definitions and * corresponding workspace entities using the given template. @@ -166,6 +176,15 @@ Workspace.createFromTemplate = function(templateName, name, cb) { }, cb); } +loopback.remoteMethod(Workspace.createFromTemplate, { + http: {verb: 'post', path: '/'}, + accepts: [{ + arg: 'templateName', type: 'string' + }, { + arg: 'name', type: 'string' + }] +}); + /** * @typedef {{name, description,supportedByStrongLoop}} ConnectorMeta */ @@ -183,3 +202,8 @@ var staticConnectorList = require('../available-connectors'); Workspace.listAvailableConnectors = function(cb) { cb(null, staticConnectorList); }; + +loopback.remoteMethod(Workspace.listAvailableConnectors, { + http: {verb: 'get', path: '/connectors'}, + returns: {type: 'array'} +}); From a4b426f58d7fe23d21892795d6536a4dd5bb9c75 Mon Sep 17 00:00:00 2001 From: Ritchie Martori Date: Mon, 30 Jun 2014 14:06:03 -0700 Subject: [PATCH 2/2] Add custom rest method tests --- app.js | 5 +++- models/workspace.js | 6 ++-- package.json | 3 +- test/rest.js | 68 +++++++++++++++++++++++++++++++++++++++++++-- test/support.js | 1 + 5 files changed, 76 insertions(+), 7 deletions(-) diff --git a/app.js b/app.js index fa39dd55..5b683fc2 100644 --- a/app.js +++ b/app.js @@ -1,6 +1,7 @@ var loopback = require('loopback'); var path = require('path'); var app = module.exports = loopback(); +var env = app.get('env'); var boot = require('loopback-boot'); var started = new Date(); @@ -36,7 +37,9 @@ require('./connector'); */ app.use(loopback.favicon()); -app.use(loopback.logger(app.get('env') === 'development' ? 'dev' : 'default')); +if(env !== 'test') { + app.use(loopback.logger(env === 'development' ? 'dev' : 'default')); +} app.use(loopback.cookieParser(app.get('cookieSecret'))); app.use(loopback.token({model: app.models.accessToken})); app.use(loopback.methodOverride()); diff --git a/models/workspace.js b/models/workspace.js index 01e0a350..94d965aa 100644 --- a/models/workspace.js +++ b/models/workspace.js @@ -179,9 +179,9 @@ Workspace.createFromTemplate = function(templateName, name, cb) { loopback.remoteMethod(Workspace.createFromTemplate, { http: {verb: 'post', path: '/'}, accepts: [{ - arg: 'templateName', type: 'string' + arg: 'templateName', type: 'string', http: {source: 'body'} }, { - arg: 'name', type: 'string' + arg: 'name', type: 'string', http: {source: 'body'} }] }); @@ -205,5 +205,5 @@ Workspace.listAvailableConnectors = function(cb) { loopback.remoteMethod(Workspace.listAvailableConnectors, { http: {verb: 'get', path: '/connectors'}, - returns: {type: 'array'} + returns: {arg: 'connectors', type: 'array', root: true} }); diff --git a/package.json b/package.json index 4b36883d..eeb64cfb 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,8 @@ "underscore.string": "~2.3.3", "grunt": "~0.4.5", "grunt-loopback-angular": "~1.1.0", - "ncp": "^0.5.1" + "ncp": "^0.5.1", + "supertest": "~0.13.0" }, "optionalDependencies": { "loopback-explorer": "~1.1.0" diff --git a/test/rest.js b/test/rest.js index 076f4b58..74cd96d5 100644 --- a/test/rest.js +++ b/test/rest.js @@ -1,5 +1,69 @@ +var app = require('../app'); +var request = require('supertest'); + describe('REST API', function () { - describe('POST /workspace/component', function () { - + beforeEach(givenEmptySandbox); + + describe('/workspaces', function () { + describe('POST /workspaces', function () { + beforeEach(function(done) { + request(app) + .post('/api/workspaces') + .set('Content-Type', 'application/json') + .send({ + templateName: 'api-server', + name: 'sandbox' + }) + .end(done); + }); + it('should add a component from a template', function (done) { + app.models.ComponentDefinition.find(function(err, defs) { + var names = toNames(defs); + expect(names).to.contain('rest'); + expect(names).to.contain('.'); + expect(names).to.contain('server'); + done(); + }); + }); + }); + + describe('POST /workspaces/component', function () { + beforeEach(function(done) { + request(app) + .post('/api/workspaces/component') + .set('Content-Type', 'application/json') + .send({ + template: 'rest' + }) + .end(done); + }); + it('should add a component from a template', function (done) { + app.models.ComponentDefinition.find(function(err, defs) { + expect(toNames(defs)).to.contain('rest'); + done(); + }); + }); + }); + describe('POST /workspaces/connectors', function () { + beforeEach(function(done) { + this.req = request(app) + .get('/api/workspaces/connectors') + .set('Accepts', 'application/json') + .end(done); + }); + it('should return a list of connectors', function () { + var connectors = toNames(this.req.res.body); + expect(connectors).to.contain('memory'); + expect(connectors).to.contain('mysql'); + expect(connectors).to.contain('postgresql'); + expect(connectors).to.contain('oracle'); + expect(connectors).to.contain('mssql'); + expect(connectors).to.contain('mongodb'); + expect(connectors).to.contain('soap'); + expect(connectors).to.contain('rest'); + expect(connectors).to.contain('neo4j'); + expect(connectors).to.contain('kafka'); + }); + }); }); }); diff --git a/test/support.js b/test/support.js index 8deba639..66c59c9d 100644 --- a/test/support.js +++ b/test/support.js @@ -3,6 +3,7 @@ var async = require('async'); var fs = require('fs-extra'); var path = require('path'); expect = require('chai').expect; +process.env.NODE_ENV = 'test'; var workspace = require('../app'); var models = workspace.models; var ConfigFile = models.ConfigFile;