twiliojs-api
Version:
Module to invoke twilio.com services
327 lines (237 loc) • 9.45 kB
JavaScript
var assert = require("assert");
var Util = require("../lib/util.js");
var nock = require('nock');
var settings = null;
describe("lib.util", function ( ) {
beforeEach ( function ( done ) {
settings = {
accountSid: "abc",
accountToken: "def",
apiEndpoint: "https://api.twilio.com"
};
nock.cleanAll();
done();
})
describe("hook", function ( ) {
it("Should throw if no target argument", function ( done ) {
try {
var util = new Util({});
util.hook();
throw new Error ("Had to be thrown")
} catch ( e ) {
assert.ok(e);
assert.ok(e instanceof Error);
assert.ok(e.message.indexOf("'target'") > -1);
done();
}
} );
it("Should throw if no methods argument", function ( done ) {
try {
var util = new Util({});
util.hook({});
throw new Error ("Had to be thrown");
} catch ( e ) {
assert.ok(e);
assert.ok(e instanceof Error);
assert.ok(e.message.indexOf("'methods") > -1);
done();
}
});
it ("Should add all methods", function ( done ) {
var target = {},
methods = { group: {
foo: { path: "/" },
bar: { path: "/" }
} };
var util = new Util({});
util.hook(target, methods);
assert.ok(typeof target["foo"] === 'function');
assert.ok(typeof target["bar"] === 'function');
done();
});
it("Should set GET as default HTTP method", function ( done ) {
settings.apiEndpoint = "http://contoso";
var server = nock("http://contoso")
.get("/guid.json")
.reply(200, true);
var target = {};
var methods = { group: { foo: { path: "/guid" } } };
var util = new Util(settings)
util.hook(target, methods);
assert.ok(typeof target["foo"] === 'function');
target["foo"]({ auth: 'xyz' }, function(err, result) {
assert.ok(!err);
assert.ok(result);
done();
})
});
it ("Should set the HTTP method", function ( done ) {
settings.apiEndpoint = "http://contoso";
var server = nock("http://contoso")
.post("/guid.json")
.reply(200, true);
var target = {};
var methods = { group: { foo: { method: "POST", path: "/guid" } } };
var util = new Util(settings)
util.hook(target, methods);
assert.ok(typeof target["foo"] === 'function');
target["foo"]({ auth: 'xyz' }, function(err, result){
assert.ok(!err);
assert.ok(result);
done();
})
});
it ("Should set the path", function ( done ) {
settings.apiEndpoint = "http://contoso";
var server = nock("http://contoso")
.get("/alfa/beta.json")
.reply(200, true);
var target = {};
var methods = { group: { foo: { path: "/alfa/beta" } } };
var util = new Util(settings)
util.hook(target, methods);
assert.ok(typeof target["foo"] === 'function');
target["foo"]({ auth: 'xyz' }, function(err, result){
assert.ok(!err);
assert.ok(result);
done();
});
});
});
describe("invoking methods", function ( ) {
var methods = { group: { foo: { path: "/" } } };
beforeEach (function (done) {
settings.apiEndpoint = "http://api.contoso";
done();
});
it ("Should fail on missing required argument", function ( done ) {
var target = {};
var methods = { group: { foo: { path: "/{requiredArg}" } } };
var util = new Util(settings);
util.hook(target, methods);
assert.ok(typeof target["foo"] === 'function');
target["foo"]({auth:1}, function(err, result){
assert.ok(err);
assert.ok(err instanceof Error);
assert.ok(err.message.indexOf("requiredArg") > -1);
done();
})
});
it ("Should process required argument", function ( done ) {
var server = nock("http://api.contoso")
.get("/bar.json")
.reply(200, true);
var target = {};
var methods = { group: { foo: { path: "/{requiredArg}" } } };
var util = new Util(settings);
util.hook(target, methods);
assert.ok(typeof target["foo"] === 'function');
target["foo"]({ requiredArg: "bar"}, function(err, result){
assert.ok(!err);
assert.ok(result);
done();
})
});
it ("Should send body", function ( done ) {
var server = nock("http://api.contoso")
.get("/guid.json", {bar:1})
.reply(200, "");
var target = {};
var methods = { group: { foo: { path: "/guid" } } };
var util = new Util(settings);
util.hook(target, methods);
assert.ok(typeof target["foo"] === 'function');
target["foo"]( { bar: 1 }, function(err, result){
assert.ok(!err);
assert.ok(result);
done();
})
});
it.skip("Should send optional params as querystring", function ( done ) {
var server = nock("http://api.contoso")
.get("/guid.json?bar=1&baz=2")
.reply(200, true);
var target = {};
var methods = { group: { foo: { path: "/guid" } } };
var util = new Util(settings);
util.hook(target, methods);
assert.ok(typeof target["foo"] === 'function');
target["foo"]({ params: { bar: 1, baz: 2 } }, function(err, result){
assert.ok(!err);
assert.ok(result);
done();
})
});
} );
describe("validateParams", function () {
it ("Should throw if no data argument", function ( done ) {
try {
var util = new Util(settings);
util.validateParams();
throw new Error ("Had to be thrown")
} catch ( e ) {
assert.ok(e);
assert.ok(e instanceof Error);
assert.ok(e.message.indexOf("'data'") > -1);
done();
}
} );
it ("Should throw if no params argument.", function ( done ) {
try {
var util = new Util(settings);
util.validateParams({});
throw new Error ("Had to be thrown")
} catch ( e ) {
assert.ok(e);
assert.ok(e instanceof Error);
assert.ok(e.message.indexOf("'params'") > -1);
done();
}
} );
it ("Should not fail on empty array of params.", function ( done ) {
var util = new Util(settings);
var err = util.validateParams({}, []);
assert.ok(!err);
done();
});
it ("Should not return an error if all params are present.", function ( done ) {
var util = new Util(settings);
var err = util.validateParams({ x:1, y: 1, z: 1}, [ "x", "z"]);
assert.ok(!err);
done();
});
it ("Should return an error on first param that is not present.", function ( done ) {
var util = new Util(settings);
var err = util.validateParams({ x:1, z: 1}, [ "x", "y", "z"]);
assert.ok ( err );
assert.ok ( err instanceof Error );
assert.ok ( err.message.indexOf ( "'y'" ) > -1 );
done();
});
} );
describe("buildResponse", function () {
it ("Should include status code.", function ( done ) {
var util = new Util(settings);
var res = util.buildResponse({ statusCode: 200 });
assert.ok(res);
assert.equal(200, res.statusCode);
done();
} );
it ("Should include headers", function ( done ) {
var util = new Util(settings);
var res = util.buildResponse({ headers: {foo: "bar" } });
assert.ok(res);
assert.ok(res.headers);
assert.equal('bar', res.headers.foo);
done();
} );
it ("Should include parsed body", function ( done ) {
var util = new Util(settings);
var res = util.buildResponse( { body : '{ "foo": "bar"}' });
assert.ok(res);
assert.ok(res.body);
assert.equal('bar', res.body.foo);
done();
});
});
});