box-chrome-sdk
Version:
A Chrome App SDK for the Box V2 API
111 lines (104 loc) • 4.69 kB
JavaScript
/* jshint expr:true */
describe.only('box.sdk', function() {
var mocks, observer, xhr, server, module, injector;
var boxSdk, authUrl;
var chromeStorage, chrome;
var authCode = 'authorization_code';
var clientId = 'i3p-----------------------------',
clientSecret = 'uII-----------------------------';
beforeEach(function() {
mocks = sinon.sandbox.create();
server = mocks.useFakeServer();
xhr = window.XMLHttpRequest;
observer = mocks.spy();
angular.module('box.conf')
.constant('clientSecret', clientSecret)
.constant('clientId', clientId);
mocks.stub(window, 'FormData', function() {
var datas = [];
this.append = function(name, value, filename) {
datas.push({
name: name,
value: value
});
if (filename) { datas[datas.length - 1].filename = filename; }
};
this.toString = function() {
return datas.map(function(data) {
return data.name + '=' + data.value + (data.filename ? ';' + data.filename : '');
}).join('&');
};
});
if (!window.chrome.runtime) {
window.chrome.runtime = {};
}
module = angular.module('box.sdk.test', ['box.sdk', 'box.http', 'box.objects', 'rx.http', 'box.auth', 'chrome']);
module.run(['boxHttp', 'chrome', 'redirectUri', function(_boxHttp_, _chrome_, redirectUri) {
var stubStorage = {local: {get: angular.noop, set: angular.noop, remove: angular.noop}};
chrome = _chrome_;
if (!angular.isDefined(chrome.storage)) { chrome.storage = stubStorage; }
var local = chrome.storage.local;
var cache = {};
mocks.stub(local, 'get', function(name, callback) {
var hash = {};
if(cache.hasOwnProperty(name)) { hash[name] = cache[name]; }
callback(hash);
});
mocks.stub(local, 'set', function(items, callback) {
angular.extend(cache, items);
callback(true);
});
mocks.stub(local, 'remove', function(name, callback) {
delete cache[name];
callback(true);
});
var chromeIdentity = chrome.identity || {launchWebAuthFlow: angular.noop};
mocks.stub(chromeIdentity, 'launchWebAuthFlow');
chromeIdentity.launchWebAuthFlow.yields(redirectUri + '?code=' + authCode);
}]);
injector = angular.injector(['ng', 'box.sdk.test', 'box.sdk', 'box.http', 'box.objects', 'rx.http', 'box.auth', 'chrome']);
boxSdk = injector.get('boxSdk');
authUrl = injector.get('authUrl');
chromeStorage = injector.get('chromeStorage');
});
afterEach(function() {
mocks.restore();
});
describe('logout()', function() {
it('should remove stored tokens and revoke the token', function(done) {
var postReturn = [204, {}, ''];
chromeStorage.setLocal({refresh_token: {token: 'refresh_token'}}).subscribe(angular.noop);
server.respondWith('POST', authUrl + '/revoke', postReturn);
server.autoRespond = true;
var request;
var onCreate = xhr.onCreate;
xhr.onCreate = function(_request) {
request = _request;
if (onCreate) { onCreate(_request); }
};
boxSdk.logout()
.do(observer)
.subscribe(
function() {
expect(observer).to.have.been.calledOnce;
expect(observer.firstCall.args[0].data).to.equal(postReturn[2]);
expect(request.url).to.equal(authUrl + '/revoke');
expect(request.method).to.equal('POST');
expect(request.requestBody.toString()).to.include(clientId).and.to.include(clientSecret).and.to.include('refresh_token');
done();
},
function(error) {
assert.fail(error);
done();
},
function() {
done();
}
);
expect(chrome.storage.local.get).to.have.been.calledOnce.and.to.have.been.calledWith('refresh_token');
expect(chrome.storage.local.remove).to.have.been.calledTwice
.and.to.have.been.calledWith('access_token')
.and.to.have.been.calledWith('refresh_token');
});
});
});