From 0cd4a2b4ecbaabf9434dfb6ed5f5b0652760103a Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 18 Mar 2016 21:01:21 +0000 Subject: [PATCH] Add api/flow_spec tests Part of #840 --- red/api/flow.js | 2 - test/red/api/flow_spec.js | 255 +++++++++++++++++++++++++++++++++++++- 2 files changed, 249 insertions(+), 8 deletions(-) diff --git a/red/api/flow.js b/red/api/flow.js index 31bc076ac..b86de904b 100644 --- a/red/api/flow.js +++ b/red/api/flow.js @@ -54,7 +54,6 @@ module.exports = { log.audit({event: "flow.update",id:id},req); res.json({id:id}); }).otherwise(function(err) { - console.log(err.stack); log.audit({event: "flow.update",error:err.code||"unexpected_error",message:err.toString()},req); res.status(400).json({error:err.code||"unexpected_error", message:err.toString()}); }) @@ -63,7 +62,6 @@ module.exports = { log.audit({event: "flow.update",id:id,error:"not_found"},req); res.status(404).end(); } else { - console.log(err.stack); log.audit({event: "flow.update",error:err.code||"unexpected_error",message:err.toString()},req); res.status(400).json({error:err.code||"unexpected_error", message:err.toString()}); } diff --git a/test/red/api/flow_spec.js b/test/red/api/flow_spec.js index ead93a27e..3ccd518c8 100644 --- a/test/red/api/flow_spec.js +++ b/test/red/api/flow_spec.js @@ -1,5 +1,5 @@ /** - * Copyright 2014 IBM Corp. + * Copyright 2014, 2016 IBM Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,16 +21,259 @@ var bodyParser = require('body-parser'); var sinon = require('sinon'); var when = require('when'); -var flows = require("../../../red/api/flows"); +var flow = require("../../../red/api/flow"); describe("flow api", function() { var app; - it.skip('add flow'); - it.skip('update flow'); - it.skip('remove flow'); - it.skip('get flow'); + before(function() { + app = express(); + app.use(bodyParser.json()); + app.get("/flow/:id",flow.get); + app.post("/flow",flow.post); + app.put("/flow/:id",flow.put); + app.delete("/flow/:id",flow.delete); + }); + describe("get", function() { + before(function() { + flow.init({ + settings:{}, + nodes: { + getFlow: function(id) { + if (id === '123') { + return {id:'123'} + } else { + return null; + } + } + }, + log:{ audit: sinon.stub() } + }); + }) + it('gets a known flow', function(done) { + request(app) + .get('/flow/123') + .set('Accept', 'application/json') + .expect(200) + .end(function(err,res) { + if (err) { + return done(err); + } + res.body.should.has.a.property('id','123'); + done(); + }); + }) + it('404s an unknown flow', function(done) { + request(app) + .get('/flow/456') + .set('Accept', 'application/json') + .expect(404) + .end(done); + }) + }); + + describe("add", function() { + before(function() { + flow.init({ + settings:{}, + nodes: { + addFlow: function(f) { + if (f.id === "123") { + return when.resolve('123') + } else { + return when.reject(new Error("test error")); + } + } + }, + log:{ audit: sinon.stub() } + }); + }) + it('adds a new flow', function(done) { + request(app) + .post('/flow') + .set('Accept', 'application/json') + .send({id:'123'}) + .expect(200) + .end(function(err,res) { + if (err) { + return done(err); + } + res.body.should.has.a.property('id','123'); + done(); + }); + }) + it('400 an invalid flow', function(done) { + request(app) + .post('/flow') + .set('Accept', 'application/json') + .send({id:'error'}) + .expect(400) + .end(function(err,res) { + if (err) { + return done(err); + } + res.body.should.has.a.property('error','unexpected_error'); + res.body.should.has.a.property('message','Error: test error'); + + done(); + }); + }) + }) + + describe("update", function() { + var nodes; + before(function() { + nodes = { + updateFlow: function(id,f) { + var err; + if (id === "123") { + return when.resolve() + } else if (id === "unknown") { + err = new Error(); + err.code = 404; + throw err; + } else if (id === "unexpected") { + err = new Error(); + err.code = 500; + throw err; + } else { + return when.reject(new Error("test error")); + } + } + }; + flow.init({ + settings:{}, + nodes: nodes, + log:{ audit: sinon.stub() } + }); + }) + + it('updates an existing flow', function(done) { + sinon.spy(nodes,"updateFlow"); + request(app) + .put('/flow/123') + .set('Accept', 'application/json') + .send({id:'123'}) + .expect(200) + .end(function(err,res) { + if (err) { + return done(err); + } + res.body.should.has.a.property('id','123'); + nodes.updateFlow.calledOnce.should.be.true; + nodes.updateFlow.lastCall.args[0].should.eql('123'); + nodes.updateFlow.lastCall.args[1].should.eql({id:'123'}); + nodes.updateFlow.restore(); + done(); + }); + }) + + it('404s on an unknown flow', function(done) { + request(app) + .put('/flow/unknown') + .set('Accept', 'application/json') + .send({id:'123'}) + .expect(404) + .end(done); + }) + + it('400 on async update error', function(done) { + request(app) + .put('/flow/async_error') + .set('Accept', 'application/json') + .send({id:'123'}) + .expect(400) + .end(function(err,res) { + if (err) { + return done(err); + } + res.body.should.has.a.property('error','unexpected_error'); + res.body.should.has.a.property('message','Error: test error'); + done(); + }); + }) + + it('400 on sync update error', function(done) { + request(app) + .put('/flow/unexpected') + .set('Accept', 'application/json') + .send({id:'123'}) + .expect(400) + .end(function(err,res) { + if (err) { + return done(err); + } + res.body.should.has.a.property('error',500); + res.body.should.has.a.property('message','Error'); + done(); + }); + }) + }) + + describe("delete", function() { + var nodes; + before(function() { + nodes = { + removeFlow: function(id) { + var err; + if (id === "123") { + return when.resolve() + } else if (id === "unknown") { + err = new Error(); + err.code = 404; + throw err; + } else if (id === "unexpected") { + err = new Error(); + err.code = 500; + throw err; + } + } + }; + flow.init({ + settings:{}, + nodes: nodes, + log:{ audit: sinon.stub() } + }); + }) + + it('updates an existing flow', function(done) { + sinon.spy(nodes,"removeFlow"); + request(app) + .delete('/flow/123') + .expect(204) + .end(function(err,res) { + if (err) { + return done(err); + } + nodes.removeFlow.calledOnce.should.be.true; + nodes.removeFlow.lastCall.args[0].should.eql('123'); + nodes.removeFlow.restore(); + done(); + }); + }) + + it('404s on an unknown flow', function(done) { + request(app) + .delete('/flow/unknown') + .expect(404) + .end(done); + }) + + it('400 on remove error', function(done) { + request(app) + .delete('/flow/unexpected') + .expect(400) + .end(function(err,res) { + if (err) { + return done(err); + } + res.body.should.has.a.property('error',500); + res.body.should.has.a.property('message','Error'); + done(); + }); + }) + }) });