UNPKG

box-chrome-sdk

Version:

A Chrome App SDK for the Box V2 API

410 lines (376 loc) 15.3 kB
/*jshint expr: true*/ describe('BoxFolder', function() { var folderResponse = {}, folder, apiUrl, uploadUrl, boxHttp, mocks, observer, BoxCollaboration; beforeEach(function() { var provide; mocks = sinon.sandbox.create(); observer = mocks.spy(); angular.module('box.conf') .constant('clientSecret', 'uII-----------------------------') .constant('clientId', 'i3p-----------------------------'); module('box.objects', 'box.http', 'box.auth', function($provide) { provide = $provide; }); inject(function(_boxHttp_, crypto) { boxHttp = mocks.stub(_boxHttp_); provide.value('boxHttp', boxHttp); mocks.stub(crypto, 'digest', function() { return Rx.Observable.return([255, 255]); }); provide.value('crypto', crypto); }); folderResponse = { "type": "folder", "id": "11446498", "sequence_id": "1", "etag": "1", "name": "Pictures", "created_at": "2012-12-12T10:53:43-08:00", "modified_at": "2012-12-12T11:15:04-08:00", "description": "Some pictures I took", "size": 629644, "path_collection": { "total_count": 1, "entries": [ { "type": "folder", "id": "0", "sequence_id": null, "etag": null, "name": "All Files" } ] }, "created_by": { "type": "user", "id": "17738362", "name": "sean rose", "login": "sean@box.com" }, "modified_by": { "type": "user", "id": "17738362", "name": "sean rose", "login": "sean@box.com" }, "owned_by": { "type": "user", "id": "17738362", "name": "sean rose", "login": "sean@box.com" }, "shared_link": { "url": "https://www.box.com/s/vspke7y05sb214wjokpk", "download_url": "https://www.box.com/shared/static/vspke7y05sb214wjokpk", "vanity_url": null, "is_password_enabled": false, "unshared_at": null, "download_count": 0, "preview_count": 0, "access": "open", "permissions": { "can_download": true, "can_preview": true } }, "folder_upload_email": { "access": "open", "email": "upload.Picture.k13sdz1@u.box.com" }, "parent": { "type": "folder", "id": "0", "sequence_id": null, "etag": null, "name": "All Files" }, "item_status": "active", "item_collection": { "total_count": 1, "entries": [ { "type": "file", "id": "5000948880", "sequence_id": "3", "etag": "3", "sha1": "134b65991ed521fcfe4724b7d814ab8ded5185dc", "name": "tigers.jpeg" } ], "offset": 0, "limit": 100 } }; }); beforeEach(inject(function(BoxFolder, _apiUrl_, _uploadUrl_, _BoxCollaboration_) { folder = new BoxFolder(folderResponse); apiUrl = _apiUrl_; uploadUrl = _uploadUrl_; BoxCollaboration = _BoxCollaboration_; })); afterEach(function() { mocks.restore(); }); describe('constructor', function() { it('should have attributes of the response', function() { Object.getOwnPropertyNames(folderResponse) .forEach(function(name) { expect(folder).to.have.property(name, folderResponse[name]); }); }); }); describe('url()', function() { it('should generate its api url', function() { expect(folder).to.respondTo('url'); expect(folder.url()).to.equal(apiUrl + '/folders/' + folderResponse.id); }); }); describe('getItems()', function() { var fields = 'fields'; it('should make http get request', function() { boxHttp.get.returns(Rx.Observable.return({ total_count: 0, entries: [] })); folder.getItems(fields).subscribe(observer); expect(observer).to.not.have.been.called; expect(boxHttp.get).to.have.been.calledOnce.and.to.have.been.calledWithExactly( apiUrl + '/folders/' + folderResponse.id + '/items', { params: { fields: fields, limit: 20, offset: 0 } } ); }); it('should return a file and a folder', function() { boxHttp.get.returns(Rx.Observable.return({ total_count: 2, entries: [{type: 'file'}, {type: 'folder'}] })); folder.getItems(fields).subscribe(observer); expect(observer).to.have.been.calledTwice; inject(function(BoxFolder, BoxFile) { expect(observer.firstCall.args[0]).to.be.an.instanceOf(BoxFile).and.to.have.property('type', 'file'); expect(observer.secondCall.args[0]).to.be.an.instanceOf(BoxFolder).and.to.have.property('type', 'folder'); }); expect(boxHttp.get).to.have.been.calledOnce.and.to.have.been.calledWithExactly( apiUrl + '/folders/' + folderResponse.id + '/items', { params: { fields: fields, limit: 20, offset: 0 } } ); }); it('should make multiple http get requests for large folders', function() { boxHttp.get .onFirstCall().returns(Rx.Observable.defer(function() {return Rx.Observable.return({ total_count: 24, entries: (new Array(20)).fill(0).map(function(entry, i) { return i % 2 ? {type: 'file'} : {type: 'folder'}; }) }); })) .onSecondCall().returns(Rx.Observable.defer(function() {return Rx.Observable.return({ total_count: 24, entries: (new Array(4)).fill(0).map(function(entry, i) { return i % 2 ? {type: 'file'} : {type: 'folder'}; }) }); })); folder.getItems(fields).subscribe(observer); expect(observer.callCount).to.equal(24); inject(function(BoxFolder, BoxFile) { for (var i = 0; i < 2; i += 2) { expect(observer.getCall(i).args[0]).to.be.an.instanceOf(BoxFolder).and.to.have.property('type', 'folder'); expect(observer.getCall(i + 1).args[0]).to.be.an.instanceOf(BoxFile).and.to.have.property('type', 'file'); } }); expect(boxHttp.get).to.have.been.calledTwice; expect(boxHttp.get.firstCall).to.have.been.calledWithExactly( apiUrl + '/folders/' + folderResponse.id + '/items', { params: { fields: fields, limit: 20, offset: 0 } } ); expect(boxHttp.get.secondCall).to.have.been.calledWithExactly( apiUrl + '/folders/' + folderResponse.id + '/items', { params: { fields: fields, limit: 20, offset: 20 } } ); }); }); describe('createSubfolder()', function() { var subFolderName = 'subfolder'; beforeEach(function() { boxHttp.post.returns(Rx.Observable.return({ type: 'folder', id: '9', name: subFolderName, path_collection: { total_count: 1, entries: [folderResponse] } })); }); it('should call http post', function() { folder.createSubfolder(subFolderName).subscribe(observer); expect(boxHttp.post).to.have.been.calledOnce.and.to.have.been.calledWithExactly( apiUrl + '/folders', null, { name: subFolderName, parent: {id: folderResponse.id} } ); }); it('should return the new folder', function() { folder.createSubfolder(subFolderName).subscribe(observer); expect(observer).to.have.been.calledOnce; var subFolder = observer.args[0][0]; expect(subFolder).to.have.property('name', subFolderName); expect(subFolder).to.have.property('id', '9'); expect(subFolder).to.have.property('type', 'folder'); expect(subFolder).to.have.deep.property('path_collection.entries[0]', folderResponse); inject(function(BoxFolder) { expect(subFolder).to.be.an.instanceOf(BoxFolder); }); }); }); describe('getCollaborations()', function() { it('should call http get', function() { boxHttp.get.returns(Rx.Observable.return({ total_count: 0, entries: [] })); folder.getCollaborations().subscribe(observer); expect(boxHttp.get).to.have.been.calledOnce.and.to.have.been.calledWithExactly( apiUrl + '/folders/' + folderResponse.id + '/collaborations' ); }); it('should not have any observations for no collabs', function() { boxHttp.get.returns(Rx.Observable.return({ total_count: 0, entries: [] })); folder.getCollaborations().subscribe(observer); expect(observer).to.not.have.been.called; }); it('should return the set of collaborations', function() { boxHttp.get.returns(Rx.Observable.return({ total_count: 2, entries: [{type: 'collaboration', id: '1'}, {type: 'collaboration', id: '2'}] })); folder.getCollaborations().subscribe(observer); expect(observer).to.have.been.calledTwice; inject(function(BoxCollaboration) { expect(observer.firstCall.args[0]).to.be.an.instanceOf(BoxCollaboration).and.to.have.property('id', '1'); expect(observer.secondCall.args[0]).to.be.an.instanceOf(BoxCollaboration).and.to.have.property('id', '2'); }); }); }); describe('addCollaboration()', function() { var collaborationResponse, collaborator, role, notify; beforeEach(function() { collaborationResponse = { "type": "collaboration", "id": "791293", "created_by": { "type": "user", "id": "17738362", "name": "sean rose", "login": "sean@box.com" }, "created_at": "2012-12-12T10:54:37-08:00", "modified_at": "2012-12-12T11:30:43-08:00", "expires_at": null, "status": "accepted", "accessible_by": { "type": "user", "id": "18203124", "name": "sean", "login": "sean+test@box.com" }, "role": "editor", "acknowledged_at": "2012-12-12T11:30:43-08:00", "item": { "type": "folder", "id": "11446500", "sequence_id": "0", "etag": "0", "name": "Shared Pictures" } }; collaborationResponse.item.id = folderResponse.id; collaborator = { "type": "user", "id": "18203124", "name": "sean", "login": "sean+test@box.com" }; role = 'editor'; notify = true; boxHttp.post.returns(Rx.Observable.return(collaborationResponse)); folder.addCollaboration(role, collaborator, notify).subscribe(observer); }); it('should call http post', function() { expect(boxHttp.post).to.have.been.calledOnce.and.to.have.been.calledWithExactly( apiUrl + '/collaborations', {notify: notify}, { item: { id: folder.id, type: folder.type }, accessible_by: collaborator, role: role } ); }); it('should return a BoxCollaboration', function() { expect(observer).to.have.been.calledOnce.and.to.have.been.calledWithExactly(new BoxCollaboration(collaborationResponse)); }); }); describe('uploadFileTo()', function() { var filename = 'filename', content = new ArrayBuffer(100); beforeEach(function() { boxHttp.post.returns(Rx.Observable.return({ entries: [{ id: '1', name: filename, type: 'file' }] })); folder.uploadFileTo(filename, content, 'yesterday', 'today').subscribe(observer); }); it('should call http post', function() { expect(boxHttp.post).to.have.been.calledOnce.and.to.have.been.calledWithExactly( uploadUrl + '/files/content', { headers: {'Content-MD5': 'ffff'} }, { filename: [new Blob([content]), filename], parent_id: folderResponse.id, content_created_at: 'yesterday', content_modified_at: 'today' } ); }); it('should return a file object', function() { expect(observer).to.have.been.calledOnce; expect(observer.firstCall.args[0]).to.have.property('id', '1'); expect(observer.firstCall.args[0]).to.have.property('name', filename); expect(observer.firstCall.args[0]).to.have.property('type', 'file'); inject(function(BoxFile) { expect(observer.firstCall.args[0]).to.be.an.instanceOf(BoxFile); }); }); }); });