Added async command tests

This commit is contained in:
Loren West 2014-12-31 14:25:15 -08:00
parent 34ba1fedc5
commit 1030a50ca3
1 changed files with 82 additions and 6 deletions

View File

@ -21,6 +21,33 @@ function findFinalHandler(path) {
return handlers[handlers.length - 1]; return handlers[handlers.length - 1];
} }
function MockPromise() {
var my = this;
my.resolve = function() {
var args = arguments;
process.nextTick(function() {
my.thenCallback.apply(null, args);
});
return my;
};
my.reject = function() {
var args = arguments;
process.nextTick(function() {
my.errorCallback.apply(null, args);
});
return my;
};
my.then = function(thenCallback) {
my.thenCallback = thenCallback;
return my;
};
my.catch = function(errorCallback) {
my.errorCallback = errorCallback;
return my;
};
my.deferred = my;
}
describe("API routes", function() { describe("API routes", function() {
var routes = [ var routes = [
["GET", "/"], ["GET", "/"],
@ -55,18 +82,40 @@ describe("API commands", function() {
var req, res; var req, res;
beforeEach(function() { beforeEach(function() {
Cylon.commands.ping = function() { return "pong"; }; Cylon.commands.ping = function() { return "pong"; };
Cylon.commands.pingAsync = function() {
var promise = new MockPromise();
return promise.resolve("immediate pong");
};
req = new MockRequest(); req = new MockRequest();
res = new MockResponse(); res = new MockResponse();
res.status = function(statusCode) {
res.statusCode = statusCode;
return res;
};
req.device = { req.device = {
name: "testDevice", name: "testDevice",
commands: { commands: {
announce: function(){return "im here";} announce: function(){return "im here";},
announceAsync: function() {
var promise = new MockPromise();
process.nextTick(function(){
return promise.reject("sorry, sore throat");
});
return promise.deferred;
}
} }
}; };
req.robot = { req.robot = {
name: "fred", name: "fred",
commands: { commands: {
speak: function(){return "ahem";} speak: function(){return "ahem";},
speakAsync: function() {
var promise = new MockPromise();
process.nextTick(function(){
return promise.resolve("see ya in another cycle");
});
return promise.deferred;
}
}, },
devices: { devices: {
testDevice: req.device testDevice: req.device
@ -75,12 +124,13 @@ describe("API commands", function() {
}); });
afterEach(function() { afterEach(function() {
delete Cylon.commands.ping; delete Cylon.commands.ping;
delete Cylon.commands.pingAsync;
}); });
it("returns the list of MCP commands", function() { it("returns the list of MCP commands", function() {
res.json = function(obj){ res.json = function(obj){
expect(obj.commands).to.exist(); expect(obj.commands).to.exist();
expect(obj.commands.length).to.equal(1); expect(obj.commands.length).to.equal(2);
expect(obj.commands[0]).to.equal("ping"); expect(obj.commands[0]).to.equal("ping");
}; };
findFinalHandler("/commands")(req, res); findFinalHandler("/commands")(req, res);
@ -94,11 +144,19 @@ describe("API commands", function() {
findFinalHandler("/commands/ping")(req, res); findFinalHandler("/commands/ping")(req, res);
}); });
it("returns an immediate MCP async command", function() {
req.params = {command:"pingAsync"};
res.json = function(obj){
expect(obj.result).to.equal("immediate pong");
};
findFinalHandler("/commands/pingAsync")(req, res);
});
it("returns the list of robot commands", function() { it("returns the list of robot commands", function() {
req.params = {robot: "fred"}; req.params = {robot: "fred"};
res.json = function(obj){ res.json = function(obj){
expect(obj.commands).to.exist(); expect(obj.commands).to.exist();
expect(obj.commands.length).to.equal(1); expect(obj.commands.length).to.equal(2);
expect(obj.commands[0]).to.equal("speak"); expect(obj.commands[0]).to.equal("speak");
}; };
findFinalHandler("/robots/fred/commands")(req, res); findFinalHandler("/robots/fred/commands")(req, res);
@ -112,11 +170,19 @@ describe("API commands", function() {
findFinalHandler("/robots/fred/commands/speak")(req, res); findFinalHandler("/robots/fred/commands/speak")(req, res);
}); });
it("invokes an asynchronous robot command", function() {
req.params = {robot: "fred", command:"speakAsync"};
res.json = function(obj){
expect(obj.result).to.equal("see ya in another cycle");
};
findFinalHandler("/robots/fred/commands/speakAsync")(req, res);
});
it("returns the list of device commands", function() { it("returns the list of device commands", function() {
req.params = {robot: "fred", device: "testDevice" }; req.params = {robot: "fred", device: "testDevice" };
res.json = function(obj){ res.json = function(obj){
expect(obj.commands).to.exist(); expect(obj.commands).to.exist();
expect(obj.commands.length).to.equal(1); expect(obj.commands.length).to.equal(2);
expect(obj.commands[0]).to.equal("announce"); expect(obj.commands[0]).to.equal("announce");
}; };
var path = "/robots/fred/devices/testDevice/commands"; var path = "/robots/fred/devices/testDevice/commands";
@ -128,7 +194,17 @@ describe("API commands", function() {
res.json = function(obj){ res.json = function(obj){
expect(obj.result).to.equal("im here"); expect(obj.result).to.equal("im here");
}; };
var path = "/robots/fred/devices/testDevice/commands/speak"; var path = "/robots/fred/devices/testDevice/commands/announce";
findFinalHandler(path)(req, res);
});
it("returns correctly for an async device command that errored", function() {
req.params = {robot: "fred", device: "testDevice", command:"announceAsync"};
res.json = function(obj){
expect(obj.error).to.equal("sorry, sore throat");
expect(res.statusCode).to.equal(500);
};
var path = "/robots/fred/devices/testDevice/commands/announceAsync";
findFinalHandler(path)(req, res); findFinalHandler(path)(req, res);
}); });