/** * ownCloud * * @author Vincent Petry * @copyright 2014 Vincent Petry * * 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 . * */ describe('OC.Upload tests', function() { var $dummyUploader; var testFile; var uploader; var failStub; beforeEach(function() { testFile = { name: 'test.txt', size: 5000, // 5 KB type: 'text/plain', lastModifiedDate: new Date() }; // need a dummy button because file-upload checks on it $('#testArea').append( '' + '' + // 50 MB // TODO: handlebars! '
' + 'New' + '
    ' + '
  • Text file

  • ' + '
' + '
' ); $dummyUploader = $('#file_upload_start'); uploader = new OC.Uploader($dummyUploader); failStub = sinon.stub(); uploader.on('fail', failStub); }); afterEach(function() { $dummyUploader = undefined; failStub = undefined; }); /** * Add file for upload * @param {Array.} files array of file data to simulate upload * @return {Array.} array of uploadinfo or null if add() returned false */ function addFiles(uploader, files) { return _.map(files, function(file) { var jqXHR = {status: 200}; var uploadInfo = { originalFiles: files, files: [file], jqXHR: jqXHR, response: sinon.stub.returns(jqXHR), submit: sinon.stub() }; if (uploader.fileUploadParam.add.call( $dummyUploader[0], {}, uploadInfo )) { return uploadInfo; } return null; }); } describe('Adding files for upload', function() { it('adds file when size is below limits', function() { var result = addFiles(uploader, [testFile]); expect(result[0]).not.toEqual(null); expect(result[0].submit.calledOnce).toEqual(true); }); it('adds file when free space is unknown', function() { var result; $('#free_space').val(-2); result = addFiles(uploader, [testFile]); expect(result[0]).not.toEqual(null); expect(result[0].submit.calledOnce).toEqual(true); expect(failStub.notCalled).toEqual(true); }); it('does not add file if it exceeds free space', function() { var result; $('#free_space').val(1000); result = addFiles(uploader, [testFile]); expect(result[0]).toEqual(null); expect(failStub.calledOnce).toEqual(true); expect(failStub.getCall(0).args[1].textStatus).toEqual('notenoughspace'); expect(failStub.getCall(0).args[1].errorThrown).toEqual( 'Not enough free space, you are uploading 5 KB but only 1000 B is left' ); }); }); describe('Upload conflicts', function() { var conflictDialogStub; var fileList; beforeEach(function() { $('#testArea').append( '
' + '' + '' + '' + '' + '' + '' + '' + '' + '
' + '
' ); fileList = new OCA.Files.FileList($('#tableContainer')); fileList.add({name: 'conflict.txt', mimetype: 'text/plain'}); fileList.add({name: 'conflict2.txt', mimetype: 'text/plain'}); conflictDialogStub = sinon.stub(OC.dialogs, 'fileexists'); uploader = new OC.Uploader($dummyUploader, { fileList: fileList }); var deferred = $.Deferred(); conflictDialogStub.returns(deferred.promise()); deferred.resolve(); }); afterEach(function() { conflictDialogStub.restore(); fileList.destroy(); }); it('does not show conflict dialog when no client side conflict', function() { var result = addFiles(uploader, [{name: 'noconflict.txt'}, {name: 'noconflict2.txt'}]); expect(conflictDialogStub.notCalled).toEqual(true); expect(result[0].submit.calledOnce).toEqual(true); expect(result[1].submit.calledOnce).toEqual(true); }); it('shows conflict dialog when no client side conflict', function() { var result = addFiles(uploader, [ {name: 'conflict.txt'}, {name: 'conflict2.txt'}, {name: 'noconflict.txt'} ]); expect(conflictDialogStub.callCount).toEqual(3); expect(conflictDialogStub.getCall(1).args[0].getFileName()) .toEqual('conflict.txt'); expect(conflictDialogStub.getCall(1).args[1]) .toEqual({ name: 'conflict.txt', mimetype: 'text/plain', directory: '/' }); expect(conflictDialogStub.getCall(1).args[2]).toEqual({ name: 'conflict.txt' }); // yes, the dialog must be called several times... expect(conflictDialogStub.getCall(2).args[0].getFileName()).toEqual('conflict2.txt'); expect(conflictDialogStub.getCall(2).args[1]) .toEqual({ name: 'conflict2.txt', mimetype: 'text/plain', directory: '/' }); expect(conflictDialogStub.getCall(2).args[2]).toEqual({ name: 'conflict2.txt' }); expect(result[0].submit.calledOnce).toEqual(false); expect(result[1].submit.calledOnce).toEqual(false); expect(result[2].submit.calledOnce).toEqual(true); }); it('cancels upload when skipping file in conflict mode', function() { var fileData = {name: 'conflict.txt'}; var uploadData = addFiles(uploader, [ fileData ]); var upload = new OC.FileUpload(uploader, uploadData[0]); var deleteStub = sinon.stub(upload, 'deleteUpload'); uploader.onSkip(upload); expect(deleteStub.calledOnce).toEqual(true); }); it('overwrites file when choosing replace in conflict mode', function() { var fileData = {name: 'conflict.txt'}; var uploadData = addFiles(uploader, [ fileData ]); expect(uploadData[0].submit.notCalled).toEqual(true); var upload = new OC.FileUpload(uploader, uploadData[0]); uploader.onReplace(upload); expect(upload.getConflictMode()).toEqual(OC.FileUpload.CONFLICT_MODE_OVERWRITE); expect(uploadData[0].submit.calledOnce).toEqual(true); }); it('autorenames file when choosing replace in conflict mode', function() { // needed for _.defer call var clock = sinon.useFakeTimers(); var fileData = {name: 'conflict.txt'}; var uploadData = addFiles(uploader, [ fileData ]); expect(uploadData[0].submit.notCalled).toEqual(true); var upload = new OC.FileUpload(uploader, uploadData[0]); var getResponseStatusStub = sinon.stub(upload, 'getResponseStatus'); uploader.onAutorename(upload); expect(upload.getConflictMode()).toEqual(OC.FileUpload.CONFLICT_MODE_AUTORENAME); expect(upload.getFileName()).toEqual('conflict (2).txt'); expect(uploadData[0].submit.calledOnce).toEqual(true); // in case of server-side conflict, tries to rename again getResponseStatusStub.returns(412); uploader.fileUploadParam.fail.call($dummyUploader[0], {}, uploadData[0]); clock.tick(500); expect(upload.getFileName()).toEqual('conflict (3).txt'); expect(uploadData[0].submit.calledTwice).toEqual(true); clock.restore(); }); }); });