diff --git a/apps/files/js/fileinfomodel.js b/apps/files/js/fileinfomodel.js index 1c850239cd..22b1ca9ff0 100644 --- a/apps/files/js/fileinfomodel.js +++ b/apps/files/js/fileinfomodel.js @@ -31,16 +31,15 @@ */ var FileInfoModel = OC.Backbone.Model.extend({ + defaults: { + mimetype: 'application/octet-stream', + path: '' + }, + initialize: function(data) { if (!_.isUndefined(data.id)) { data.id = parseInt(data.id, 10); } - - // TODO: normalize path - data.path = data.path || ''; - data.name = data.name; - - data.mimetype = data.mimetype || 'application/octet-stream'; }, /** @@ -58,7 +57,7 @@ * @return {boolean} true if this is an image, false otherwise */ isImage: function() { - return this.get('mimetype').substr(0, 6) === 'image/'; + return this.has('mimetype') ? this.get('mimetype').substr(0, 6) === 'image/' : false; }, /** diff --git a/apps/files/tests/js/mainfileinfodetailviewSpec.js b/apps/files/tests/js/mainfileinfodetailviewSpec.js index 3d78312c86..2b9e2b23f9 100644 --- a/apps/files/tests/js/mainfileinfodetailviewSpec.js +++ b/apps/files/tests/js/mainfileinfodetailviewSpec.js @@ -20,11 +20,10 @@ */ describe('OCA.Files.MainFileInfoDetailView tests', function() { - var view, tooltipStub, fileListMock, fileActions, fileList, testFileInfo; + var view, tooltipStub, fileActions, fileList, testFileInfo; beforeEach(function() { tooltipStub = sinon.stub($.fn, 'tooltip'); - fileListMock = sinon.mock(OCA.Files.FileList.prototype); fileActions = new OCA.Files.FileActions(); fileList = new OCA.Files.FileList($('
'), { fileActions: fileActions @@ -40,6 +39,7 @@ describe('OCA.Files.MainFileInfoDetailView tests', function() { permissions: 31, path: '/subdir', size: 123456789, + etag: 'abcdefg', mtime: Date.UTC(2015, 6, 17, 1, 2, 0, 0) }); }); @@ -47,7 +47,6 @@ describe('OCA.Files.MainFileInfoDetailView tests', function() { view.remove(); view = undefined; tooltipStub.restore(); - fileListMock.restore(); }); describe('rendering', function() { @@ -76,9 +75,31 @@ describe('OCA.Files.MainFileInfoDetailView tests', function() { }); it('displays mime icon', function() { // File + var lazyLoadPreviewStub = sinon.stub(fileList, 'lazyLoadPreview'); testFileInfo.set('mimetype', 'text/calendar'); view.setFileInfo(testFileInfo); + expect(lazyLoadPreviewStub.calledOnce).toEqual(true); + var previewArgs = lazyLoadPreviewStub.getCall(0).args; + expect(previewArgs[0].mime).toEqual('text/calendar'); + expect(previewArgs[0].path).toEqual('/subdir/One.txt'); + expect(previewArgs[0].etag).toEqual('abcdefg'); + + expect(view.$el.find('.thumbnail').hasClass('icon-loading')).toEqual(true); + + // returns mime icon first without img parameter + previewArgs[0].callback( + OC.imagePath('core', 'filetypes/text-calendar.svg') + ); + + // still loading + expect(view.$el.find('.thumbnail').hasClass('icon-loading')).toEqual(true); + + // preview loading failed, no prview + previewArgs[0].error(); + + // loading stopped, the mimetype icon gets displayed + expect(view.$el.find('.thumbnail').hasClass('icon-loading')).toEqual(false); expect(view.$el.find('.thumbnail').css('background-image')) .toContain('filetypes/text-calendar.svg'); @@ -88,17 +109,46 @@ describe('OCA.Files.MainFileInfoDetailView tests', function() { expect(view.$el.find('.thumbnail').css('background-image')) .toContain('filetypes/folder.svg'); + + lazyLoadPreviewStub.restore(); }); it('displays thumbnail', function() { - testFileInfo.set('mimetype', 'test/plain'); + var lazyLoadPreviewStub = sinon.stub(fileList, 'lazyLoadPreview'); + + testFileInfo.set('mimetype', 'text/plain'); view.setFileInfo(testFileInfo); - var expectation = fileListMock.expects('lazyLoadPreview'); - expectation.once(); + expect(lazyLoadPreviewStub.calledOnce).toEqual(true); + var previewArgs = lazyLoadPreviewStub.getCall(0).args; + expect(previewArgs[0].mime).toEqual('text/plain'); + expect(previewArgs[0].path).toEqual('/subdir/One.txt'); + expect(previewArgs[0].etag).toEqual('abcdefg'); - view.setFileInfo(testFileInfo); + expect(view.$el.find('.thumbnail').hasClass('icon-loading')).toEqual(true); - fileListMock.verify(); + // returns mime icon first without img parameter + previewArgs[0].callback( + OC.imagePath('core', 'filetypes/text-plain.svg') + ); + + // still loading + expect(view.$el.find('.thumbnail').hasClass('icon-loading')).toEqual(true); + + // return an actual (simulated) image + previewArgs[0].callback( + 'testimage', { + width: 100, + height: 200 + } + ); + + // loading stopped, image got displayed + expect(view.$el.find('.thumbnail').css('background-image')) + .toContain('testimage'); + + expect(view.$el.find('.thumbnail').hasClass('icon-loading')).toEqual(false); + + lazyLoadPreviewStub.restore(); }); it('does not show size if no size available', function() { testFileInfo.unset('size');