box-chrome-sdk
Version:
A Chrome App SDK for the Box V2 API
227 lines (212 loc) • 8.74 kB
JavaScript
/*jshint expr: true*/
describe('BoxMetadata', function() {
var metadataResponse = {}, metadata, apiUrl, boxHttp, mocks, observer, BoxMetadata, fileResponse, file;
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', 'chrome.downloads', function($provide) {
provide = $provide;
});
inject(function(_boxHttp_) {
boxHttp = mocks.stub(_boxHttp_);
provide.value('boxHttp', boxHttp);
});
metadataResponse = {
"$id":"c79896a0-a33f-11e3-a5e2-0800200c9a66",
"$type": "properties",
"$parent": "file_552345101",
"client_number": "820183",
"client_name": "Biomedical Corp",
"case_reference": "A83JAA",
"case_type": "Employment Litigation",
"assigned_attorney": "Francis Burke",
"case_status": "in-progress"
};
fileResponse = {
"type": "file",
"id": "5000948880",
"sequence_id": "3",
"etag": "3",
"sha1": "134b65991ed521fcfe4724b7d814ab8ded5185dc",
"name": "tigers.jpeg",
"description": "a picture of tigers",
"size": 629644,
"path_collection": {
"total_count": 2,
"entries": [
{
"type": "folder",
"id": "0",
"sequence_id": null,
"etag": null,
"name": "All Files"
},
{
"type": "folder",
"id": "11446498",
"sequence_id": "1",
"etag": "1",
"name": "Pictures"
}
]
},
"created_at": "2012-12-12T10:55:30-08:00",
"modified_at": "2012-12-12T11:04:26-08:00",
"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/rh935iit6ewrmw0unyul",
"download_url": "https://www.box.com/shared/static/rh935iit6ewrmw0unyul.jpeg",
"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
}
},
"parent": {
"type": "folder",
"id": "11446498",
"sequence_id": "1",
"etag": "1",
"name": "Pictures"
},
"item_status": "active"
};
});
beforeEach(inject(function(_BoxMetadata_, _apiUrl_, _BoxFile_) {
BoxMetadata = _BoxMetadata_;
file = new _BoxFile_(fileResponse);
metadata = new BoxMetadata(file, metadataResponse);
apiUrl = _apiUrl_;
}));
afterEach(function() {
mocks.restore();
});
describe('constructor', function() {
it('should have attributes of the response', function() {
Object.getOwnPropertyNames(metadataResponse)
.forEach(function(name) {
expect(metadata).to.have.property(name, metadataResponse[name]);
});
});
});
describe('url()', function() {
it('should generate its api url', function() {
expect(metadata).to.respondTo('url');
expect(metadata.url()).to.equal(apiUrl + '/files/' + fileResponse.id + '/metadata/' + metadataResponse.$type);
});
});
describe('startUpdate()', function() {
it('should return a MetadataUpdate object that has an empty ops array', function() {
var update = metadata.startUpdate();
expect(update.ops).to.be.empty;
});
});
describe('delete', function() {
beforeEach(function() {
boxHttp.delete.returns(Rx.Observable.return({}));
metadata.delete().subscribe(observer);
});
it('should call http delete', function() {
expect(boxHttp.delete).to.have.been.calledOnce.and.to.have.been.calledWithExactly(metadata.url());
});
it('should return an empty response', function() {
expect(observer).to.have.been.calledOnce.and.to.have.been.calledWithExactly({});
});
});
describe('sendUpdate()', function() {
var update;
beforeEach(function() {
update = {ops: ['hello']};
boxHttp.put.returns(Rx.Observable.return(metadataResponse));
metadata.sendUpdate(update).subscribe(observer);
});
it('should call http put', function() {
expect(boxHttp.put).to.have.been.calledOnce.and.to.have.been.calledWithExactly(
metadata.url(),
{
headers: {'Content-Type': 'application/json-patch+json'}
},
update.ops
);
});
it('should return a new BoxMetadata containing the updated properties', function() {
expect(observer).to.have.been.calledOnce.and.to.have.been.calledWithExactly(metadata);
});
});
describe('MetadataUpdate', function() {
var metadataUpdate, dummyOp;
beforeEach(function() {
metadataUpdate = metadata.startUpdate();
dummyOp = {
op: 'dummy',
path: '/path',
value: 'value'
};
metadataUpdate.ops.push(dummyOp);
});
describe('add()', function() {
it('should add a new op of type add', function() {
var path = '/new/path', value = 'new value';
metadataUpdate.add(path, value);
expect(metadataUpdate.ops).to.have.deep.members([dummyOp, {op: 'add', path: path, value: value}]);
});
});
describe('replace()', function() {
it('should add a new op of type replace', function() {
var path = '/new/path', value = 'new value';
metadataUpdate.replace(path, value);
expect(metadataUpdate.ops).to.have.deep.members([dummyOp, {op: 'replace', path: path, value: value}]);
});
it('should add a new op of type test and one of type replace', function() {
var path = '/new/path', value = 'new value', oldValue = 'old value';
metadataUpdate.replace(path, value, oldValue);
expect(metadataUpdate.ops).to.have.deep.members([dummyOp, {op: 'test', path: path, value: oldValue}, {op: 'replace', path: path, value: value}]);
});
});
describe('remove()', function() {
it('should add a new op of type add', function() {
var path = '/new/path';
metadataUpdate.remove(path);
expect(metadataUpdate.ops).to.have.deep.members([dummyOp, {op: 'remove', path: path}]);
});
it('should add a new op of type test and one of type remove', function() {
var path = '/new/path', oldValue = 'old value';
metadataUpdate.remove(path, oldValue);
expect(metadataUpdate.ops).to.have.deep.members([dummyOp, {op: 'test', path: path, value: oldValue}, {op: 'remove', path: path}]);
});
});
describe('test()', function() {
it('should add a new op of type test', function() {
var path = '/new/path', value = 'new value';
metadataUpdate.test(path, value);
expect(metadataUpdate.ops).to.have.deep.members([dummyOp, {op: 'test', path: path, value: value}]);
});
});
});
});