/core/js/tests/specs/oc-backbone-webdavSpec.js
JavaScript | 390 lines | 327 code | 39 blank | 24 comment | 6 complexity | bf80c2f3cbcc426fd6c26f784d1c592c MD5 | raw file
- /**
- * ownCloud
- *
- * @author Vincent Petry
- * @copyright 2014 Vincent Petry <pvince81@owncloud.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
- *
- * You should have received a copy of the GNU Affero General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
- *
- */
- /* global dav */
- describe('Backbone Webdav extension', function() {
- var davClientRequestStub;
- var davClientPropPatchStub;
- var davClientPropFindStub;
- var deferredRequest;
- beforeEach(function() {
- deferredRequest = $.Deferred();
- davClientRequestStub = sinon.stub(dav.Client.prototype, 'request');
- davClientPropPatchStub = sinon.stub(dav.Client.prototype, 'propPatch');
- davClientPropFindStub = sinon.stub(dav.Client.prototype, 'propFind');
- davClientRequestStub.returns(deferredRequest.promise());
- davClientPropPatchStub.returns(deferredRequest.promise());
- davClientPropFindStub.returns(deferredRequest.promise());
- });
- afterEach(function() {
- davClientRequestStub.restore();
- davClientPropPatchStub.restore();
- davClientPropFindStub.restore();
- });
- describe('collections', function() {
- var TestModel;
- var TestCollection;
- beforeEach(function() {
- TestModel = OC.Backbone.Model.extend({
- sync: OC.Backbone.davSync,
- davProperties: {
- 'firstName': '{http://owncloud.org/ns}first-name',
- 'lastName': '{http://owncloud.org/ns}last-name',
- 'age': '{http://owncloud.org/ns}age',
- 'married': '{http://owncloud.org/ns}married'
- },
- parse: function(data) {
- return {
- id: data.id,
- firstName: data.firstName,
- lastName: data.lastName,
- age: parseInt(data.age, 10),
- married: data.married === 'true' || data.married === true
- };
- }
- });
- TestCollection = OC.Backbone.Collection.extend({
- sync: OC.Backbone.davSync,
- model: TestModel,
- url: 'http://example.com/owncloud/remote.php/test/'
- });
- });
- it('makes a POST request to create model into collection', function() {
- var collection = new TestCollection();
- var model = collection.create({
- firstName: 'Hello',
- lastName: 'World'
- });
- expect(davClientRequestStub.calledOnce).toEqual(true);
- expect(davClientRequestStub.getCall(0).args[0])
- .toEqual('POST');
- expect(davClientRequestStub.getCall(0).args[1])
- .toEqual('http://example.com/owncloud/remote.php/test/');
- expect(davClientRequestStub.getCall(0).args[2]['Content-Type'])
- .toEqual('application/json');
- expect(davClientRequestStub.getCall(0).args[2]['X-Requested-With'])
- .toEqual('XMLHttpRequest');
- expect(davClientRequestStub.getCall(0).args[3])
- .toEqual(JSON.stringify({
- 'firstName': 'Hello',
- 'lastName': 'World'
- }));
- var responseHeaderStub = sinon.stub()
- .withArgs('Content-Location')
- .returns('http://example.com/owncloud/remote.php/test/123');
- deferredRequest.resolve({
- status: 201,
- body: '',
- xhr: {
- getResponseHeader: responseHeaderStub
- }
- });
- expect(model.id).toEqual('123');
- });
- it('uses PROPFIND to retrieve collection', function() {
- var successStub = sinon.stub();
- var errorStub = sinon.stub();
- var collection = new TestCollection();
- collection.fetch({
- success: successStub,
- error: errorStub
- });
- expect(davClientPropFindStub.calledOnce).toEqual(true);
- expect(davClientPropFindStub.getCall(0).args[0])
- .toEqual('http://example.com/owncloud/remote.php/test/');
- expect(davClientPropFindStub.getCall(0).args[1])
- .toEqual([
- '{http://owncloud.org/ns}first-name',
- '{http://owncloud.org/ns}last-name',
- '{http://owncloud.org/ns}age',
- '{http://owncloud.org/ns}married'
- ]);
- expect(davClientPropFindStub.getCall(0).args[2])
- .toEqual(1);
- expect(davClientPropFindStub.getCall(0).args[3]['X-Requested-With'])
- .toEqual('XMLHttpRequest');
- deferredRequest.resolve({
- status: 207,
- body: [
- // root element
- {
- href: 'http://example.org/owncloud/remote.php/test/',
- propStat: []
- },
- // first model
- {
- href: 'http://example.org/owncloud/remote.php/test/123',
- propStat: [{
- status: 'HTTP/1.1 200 OK',
- properties: {
- '{http://owncloud.org/ns}first-name': 'Hello',
- '{http://owncloud.org/ns}last-name': 'World'
- }
- }]
- },
- // second model
- {
- href: 'http://example.org/owncloud/remote.php/test/456',
- propStat: [{
- status: 'HTTP/1.1 200 OK',
- properties: {
- '{http://owncloud.org/ns}first-name': 'Test',
- '{http://owncloud.org/ns}last-name': 'Person'
- }
- }]
- }
- ]
- });
- expect(collection.length).toEqual(2);
- var model = collection.get('123');
- expect(model.id).toEqual('123');
- expect(model.get('firstName')).toEqual('Hello');
- expect(model.get('lastName')).toEqual('World');
- model = collection.get('456');
- expect(model.id).toEqual('456');
- expect(model.get('firstName')).toEqual('Test');
- expect(model.get('lastName')).toEqual('Person');
- expect(successStub.calledOnce).toEqual(true);
- expect(errorStub.notCalled).toEqual(true);
- });
- function testMethodError(doCall) {
- var successStub = sinon.stub();
- var errorStub = sinon.stub();
- doCall(successStub, errorStub);
- deferredRequest.resolve({
- status: 404,
- body: ''
- });
- expect(successStub.notCalled).toEqual(true);
- expect(errorStub.calledOnce).toEqual(true);
- }
- it('calls error handler if error status in PROPFIND response', function() {
- testMethodError(function(success, error) {
- var collection = new TestCollection();
- collection.fetch({
- success: success,
- error: error
- });
- });
- });
- it('calls error handler if error status in POST response', function() {
- testMethodError(function(success, error) {
- var collection = new TestCollection();
- collection.create({
- firstName: 'Hello',
- lastName: 'World'
- }, {
- success: success,
- error: error
- });
- });
- });
- });
- describe('models', function() {
- var TestModel;
- beforeEach(function() {
- TestModel = OC.Backbone.Model.extend({
- sync: OC.Backbone.davSync,
- davProperties: {
- 'firstName': '{http://owncloud.org/ns}first-name',
- 'lastName': '{http://owncloud.org/ns}last-name',
- 'age': '{http://owncloud.org/ns}age', // int
- 'married': '{http://owncloud.org/ns}married', // bool
- },
- url: function() {
- return 'http://example.com/owncloud/remote.php/test/' + this.id;
- },
- parse: function(data) {
- return {
- id: data.id,
- firstName: data.firstName,
- lastName: data.lastName,
- age: parseInt(data.age, 10),
- married: data.married === 'true' || data.married === true
- };
- }
- });
- });
- it('makes a PROPPATCH request to update model', function() {
- var model = new TestModel({
- id: '123',
- firstName: 'Hello',
- lastName: 'World',
- age: 32,
- married: false
- });
- model.save({
- firstName: 'Hey',
- age: 33,
- married: true
- });
- expect(davClientPropPatchStub.calledOnce).toEqual(true);
- expect(davClientPropPatchStub.getCall(0).args[0])
- .toEqual('http://example.com/owncloud/remote.php/test/123');
- expect(davClientPropPatchStub.getCall(0).args[1])
- .toEqual({
- '{http://owncloud.org/ns}first-name': 'Hey',
- '{http://owncloud.org/ns}age': '33',
- '{http://owncloud.org/ns}married': 'true'
- });
- expect(davClientPropPatchStub.getCall(0).args[2]['X-Requested-With'])
- .toEqual('XMLHttpRequest');
- deferredRequest.resolve({
- status: 201,
- body: ''
- });
- expect(model.id).toEqual('123');
- expect(model.get('firstName')).toEqual('Hey');
- expect(model.get('age')).toEqual(33);
- expect(model.get('married')).toEqual(true);
- });
- it('uses PROPFIND to fetch single model', function() {
- var model = new TestModel({
- id: '123'
- });
- model.fetch();
- expect(davClientPropFindStub.calledOnce).toEqual(true);
- expect(davClientPropFindStub.getCall(0).args[0])
- .toEqual('http://example.com/owncloud/remote.php/test/123');
- expect(davClientPropFindStub.getCall(0).args[1])
- .toEqual([
- '{http://owncloud.org/ns}first-name',
- '{http://owncloud.org/ns}last-name',
- '{http://owncloud.org/ns}age',
- '{http://owncloud.org/ns}married'
- ]);
- expect(davClientPropFindStub.getCall(0).args[2])
- .toEqual(0);
- expect(davClientPropFindStub.getCall(0).args[3]['X-Requested-With'])
- .toEqual('XMLHttpRequest');
- deferredRequest.resolve({
- status: 207,
- body: {
- href: 'http://example.org/owncloud/remote.php/test/123',
- propStat: [{
- status: 'HTTP/1.1 200 OK',
- properties: {
- '{http://owncloud.org/ns}first-name': 'Hello',
- '{http://owncloud.org/ns}last-name': 'World',
- '{http://owncloud.org/ns}age': '35',
- '{http://owncloud.org/ns}married': 'true'
- }
- }]
- }
- });
- expect(model.id).toEqual('123');
- expect(model.get('firstName')).toEqual('Hello');
- expect(model.get('lastName')).toEqual('World');
- expect(model.get('age')).toEqual(35);
- expect(model.get('married')).toEqual(true);
- });
- it('makes a DELETE request to destroy model', function() {
- var model = new TestModel({
- id: '123',
- firstName: 'Hello',
- lastName: 'World'
- });
- model.destroy();
- expect(davClientRequestStub.calledOnce).toEqual(true);
- expect(davClientRequestStub.getCall(0).args[0])
- .toEqual('DELETE');
- expect(davClientRequestStub.getCall(0).args[1])
- .toEqual('http://example.com/owncloud/remote.php/test/123');
- expect(davClientRequestStub.getCall(0).args[2]['X-Requested-With'])
- .toEqual('XMLHttpRequest');
- expect(davClientRequestStub.getCall(0).args[3])
- .toBeFalsy();
- deferredRequest.resolve({
- status: 200,
- body: ''
- });
- });
- function testMethodError(doCall) {
- var successStub = sinon.stub();
- var errorStub = sinon.stub();
- doCall(successStub, errorStub);
- deferredRequest.resolve({
- status: 404,
- body: ''
- });
- expect(successStub.notCalled).toEqual(true);
- expect(errorStub.calledOnce).toEqual(true);
- }
- it('calls error handler if error status in PROPFIND response', function() {
- testMethodError(function(success, error) {
- var model = new TestModel();
- model.fetch({
- success: success,
- error: error
- });
- });
- });
- it('calls error handler if error status in PROPPATCH response', function() {
- testMethodError(function(success, error) {
- var model = new TestModel();
- model.save({
- firstName: 'Hey'
- }, {
- success: success,
- error: error
- });
- });
- });
- });
- });