2015-07-17 15:09:00 +03:00
|
|
|
/**
|
|
|
|
* @copyright 2015 Vincent Petry <pvince81@owncloud.com>
|
2021-03-31 13:15:40 +03:00
|
|
|
*
|
|
|
|
* @author Arthur Schiwon <blizzz@arthur-schiwon.de>
|
|
|
|
* @author Daniel Calviño Sánchez <danxuliu@gmail.com>
|
|
|
|
* @author Michael Jobst <mjobst+github@tecratech.de>
|
|
|
|
* @author Morris Jobke <hey@morrisjobke.de>
|
|
|
|
* @author Raghu Nayyar <hey@raghunayyar.com>
|
|
|
|
* @author Vincent Petry <vincent@nextcloud.com>
|
|
|
|
*
|
|
|
|
* @license GNU AGPL version 3 or any later version
|
|
|
|
*
|
|
|
|
* This program is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU Affero General Public License as
|
|
|
|
* published by the Free Software Foundation, either version 3 of the
|
|
|
|
* License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program 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 program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*
|
|
|
|
*/
|
2015-07-17 15:09:00 +03:00
|
|
|
|
|
|
|
describe('OCA.Files.MainFileInfoDetailView tests', function() {
|
2015-09-03 09:24:50 +03:00
|
|
|
var view, tooltipStub, fileActions, fileList, testFileInfo;
|
2015-07-17 15:09:00 +03:00
|
|
|
|
|
|
|
beforeEach(function() {
|
2015-08-10 12:23:39 +03:00
|
|
|
tooltipStub = sinon.stub($.fn, 'tooltip');
|
2015-08-12 18:30:20 +03:00
|
|
|
fileActions = new OCA.Files.FileActions();
|
|
|
|
fileList = new OCA.Files.FileList($('<table></table>'), {
|
|
|
|
fileActions: fileActions
|
|
|
|
});
|
|
|
|
view = new OCA.Files.MainFileInfoDetailView({
|
|
|
|
fileList: fileList,
|
|
|
|
fileActions: fileActions
|
|
|
|
});
|
|
|
|
testFileInfo = new OCA.Files.FileInfoModel({
|
|
|
|
id: 5,
|
|
|
|
name: 'One.txt',
|
|
|
|
mimetype: 'text/plain',
|
|
|
|
permissions: 31,
|
|
|
|
path: '/subdir',
|
|
|
|
size: 123456789,
|
2015-09-03 09:24:50 +03:00
|
|
|
etag: 'abcdefg',
|
2015-08-12 18:30:20 +03:00
|
|
|
mtime: Date.UTC(2015, 6, 17, 1, 2, 0, 0)
|
|
|
|
});
|
2015-07-17 15:09:00 +03:00
|
|
|
});
|
|
|
|
afterEach(function() {
|
2015-08-12 18:30:20 +03:00
|
|
|
view.remove();
|
2015-07-17 15:09:00 +03:00
|
|
|
view = undefined;
|
2015-08-10 12:23:39 +03:00
|
|
|
tooltipStub.restore();
|
2015-07-22 21:15:12 +03:00
|
|
|
|
2015-07-17 15:09:00 +03:00
|
|
|
});
|
|
|
|
describe('rendering', function() {
|
|
|
|
it('displays basic info', function() {
|
2015-08-06 18:24:45 +03:00
|
|
|
var clock = sinon.useFakeTimers(Date.UTC(2015, 6, 17, 1, 2, 0, 3));
|
2015-08-07 02:22:39 +03:00
|
|
|
var dateExpected = OC.Util.formatDate(Date(Date.UTC(2015, 6, 17, 1, 2, 0, 0)));
|
2015-07-17 15:09:00 +03:00
|
|
|
view.setFileInfo(testFileInfo);
|
2015-08-31 01:14:07 +03:00
|
|
|
expect(view.$el.find('.fileName h3').text()).toEqual('One.txt');
|
|
|
|
expect(view.$el.find('.fileName h3').attr('title')).toEqual('One.txt');
|
2015-07-17 15:09:00 +03:00
|
|
|
expect(view.$el.find('.size').text()).toEqual('117.7 MB');
|
|
|
|
expect(view.$el.find('.size').attr('title')).toEqual('123456789 bytes');
|
2015-10-02 11:16:21 +03:00
|
|
|
expect(view.$el.find('.date').text()).toEqual('seconds ago');
|
2015-08-07 02:22:39 +03:00
|
|
|
expect(view.$el.find('.date').attr('title')).toEqual(dateExpected);
|
2015-07-17 15:09:00 +03:00
|
|
|
clock.restore();
|
|
|
|
});
|
2016-05-06 14:04:59 +03:00
|
|
|
it('displays permalink', function() {
|
|
|
|
view.setFileInfo(testFileInfo);
|
|
|
|
expect(view.$el.find('.permalink').attr('href'))
|
|
|
|
.toEqual(OC.getProtocol() + '://' + OC.getHost() + OC.generateUrl('/f/5'));
|
|
|
|
});
|
2015-07-17 15:09:00 +03:00
|
|
|
it('displays favorite icon', function() {
|
2018-01-05 21:06:06 +03:00
|
|
|
fileActions.registerAction({
|
|
|
|
name: 'Favorite',
|
|
|
|
mime: 'all',
|
|
|
|
permissions: OC.PERMISSION_NONE
|
|
|
|
});
|
|
|
|
|
2015-08-12 18:30:20 +03:00
|
|
|
testFileInfo.set('tags', [OC.TAG_FAVORITE]);
|
|
|
|
view.setFileInfo(testFileInfo);
|
2016-11-21 16:40:34 +03:00
|
|
|
expect(view.$el.find('.action-favorite > span').hasClass('icon-starred')).toEqual(true);
|
|
|
|
expect(view.$el.find('.action-favorite > span').hasClass('icon-star')).toEqual(false);
|
2015-07-17 15:09:00 +03:00
|
|
|
|
2015-08-12 18:30:20 +03:00
|
|
|
testFileInfo.set('tags', []);
|
|
|
|
view.setFileInfo(testFileInfo);
|
2016-11-21 16:40:34 +03:00
|
|
|
expect(view.$el.find('.action-favorite > span').hasClass('icon-starred')).toEqual(false);
|
|
|
|
expect(view.$el.find('.action-favorite > span').hasClass('icon-star')).toEqual(true);
|
2015-07-17 15:09:00 +03:00
|
|
|
});
|
2018-01-05 21:06:06 +03:00
|
|
|
it('does not display favorite icon if favorite action is not available', function() {
|
|
|
|
testFileInfo.set('tags', [OC.TAG_FAVORITE]);
|
|
|
|
view.setFileInfo(testFileInfo);
|
|
|
|
expect(view.$el.find('.action-favorite').length).toEqual(0);
|
|
|
|
|
|
|
|
testFileInfo.set('tags', []);
|
|
|
|
view.setFileInfo(testFileInfo);
|
|
|
|
expect(view.$el.find('.action-favorite').length).toEqual(0);
|
|
|
|
});
|
2015-07-17 15:09:00 +03:00
|
|
|
it('displays mime icon', function() {
|
2015-07-22 21:15:12 +03:00
|
|
|
// File
|
2015-09-03 09:24:50 +03:00
|
|
|
var lazyLoadPreviewStub = sinon.stub(fileList, 'lazyLoadPreview');
|
2015-08-12 18:30:20 +03:00
|
|
|
testFileInfo.set('mimetype', 'text/calendar');
|
|
|
|
view.setFileInfo(testFileInfo);
|
2015-07-22 21:15:12 +03:00
|
|
|
|
2015-09-03 09:24:50 +03:00
|
|
|
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);
|
2015-07-22 21:15:12 +03:00
|
|
|
expect(view.$el.find('.thumbnail').css('background-image'))
|
|
|
|
.toContain('filetypes/text-calendar.svg');
|
|
|
|
|
|
|
|
// Folder
|
2015-08-12 18:30:20 +03:00
|
|
|
testFileInfo.set('mimetype', 'httpd/unix-directory');
|
|
|
|
view.setFileInfo(testFileInfo);
|
2015-07-22 21:15:12 +03:00
|
|
|
|
|
|
|
expect(view.$el.find('.thumbnail').css('background-image'))
|
|
|
|
.toContain('filetypes/folder.svg');
|
2015-09-03 09:24:50 +03:00
|
|
|
|
|
|
|
lazyLoadPreviewStub.restore();
|
2015-07-17 15:09:00 +03:00
|
|
|
});
|
2015-10-28 19:43:36 +03:00
|
|
|
it('uses icon from model if present in model', function() {
|
|
|
|
var lazyLoadPreviewStub = sinon.stub(fileList, 'lazyLoadPreview');
|
|
|
|
testFileInfo.set('mimetype', 'httpd/unix-directory');
|
|
|
|
testFileInfo.set('icon', OC.MimeType.getIconUrl('dir-external'));
|
|
|
|
view.setFileInfo(testFileInfo);
|
|
|
|
|
|
|
|
expect(lazyLoadPreviewStub.notCalled).toEqual(true);
|
|
|
|
|
|
|
|
expect(view.$el.find('.thumbnail').hasClass('icon-loading')).toEqual(false);
|
|
|
|
expect(view.$el.find('.thumbnail').css('background-image'))
|
|
|
|
.toContain('filetypes/folder-external.svg');
|
|
|
|
|
|
|
|
lazyLoadPreviewStub.restore();
|
|
|
|
});
|
2015-07-17 15:09:00 +03:00
|
|
|
it('displays thumbnail', function() {
|
2015-09-03 09:24:50 +03:00
|
|
|
var lazyLoadPreviewStub = sinon.stub(fileList, 'lazyLoadPreview');
|
|
|
|
|
|
|
|
testFileInfo.set('mimetype', 'text/plain');
|
2015-08-12 18:30:20 +03:00
|
|
|
view.setFileInfo(testFileInfo);
|
2015-07-22 21:15:12 +03:00
|
|
|
|
2015-09-03 09:24:50 +03:00
|
|
|
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');
|
2015-07-22 21:15:12 +03:00
|
|
|
|
2015-09-03 09:24:50 +03:00
|
|
|
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-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);
|
2015-07-22 21:15:12 +03:00
|
|
|
|
2015-09-03 09:24:50 +03:00
|
|
|
lazyLoadPreviewStub.restore();
|
2015-07-17 15:09:00 +03:00
|
|
|
});
|
2015-08-25 12:29:35 +03:00
|
|
|
it('does not show size if no size available', function() {
|
|
|
|
testFileInfo.unset('size');
|
|
|
|
view.setFileInfo(testFileInfo);
|
|
|
|
|
|
|
|
expect(view.$el.find('.size').length).toEqual(0);
|
|
|
|
});
|
|
|
|
it('renders displayName instead of name if available', function() {
|
|
|
|
testFileInfo.set('displayName', 'hello.txt');
|
|
|
|
view.setFileInfo(testFileInfo);
|
|
|
|
|
2015-08-31 01:14:07 +03:00
|
|
|
expect(view.$el.find('.fileName h3').text()).toEqual('hello.txt');
|
|
|
|
expect(view.$el.find('.fileName h3').attr('title')).toEqual('hello.txt');
|
2015-08-25 12:29:35 +03:00
|
|
|
});
|
2015-08-12 18:30:20 +03:00
|
|
|
it('rerenders when changes are made on the model', function() {
|
2018-01-05 21:06:06 +03:00
|
|
|
// Show the "Favorite" icon
|
|
|
|
fileActions.registerAction({
|
|
|
|
name: 'Favorite',
|
|
|
|
mime: 'all',
|
|
|
|
permissions: OC.PERMISSION_NONE
|
|
|
|
});
|
|
|
|
|
2015-08-12 18:30:20 +03:00
|
|
|
view.setFileInfo(testFileInfo);
|
|
|
|
|
|
|
|
testFileInfo.set('tags', [OC.TAG_FAVORITE]);
|
|
|
|
|
2016-11-21 16:40:34 +03:00
|
|
|
expect(view.$el.find('.action-favorite > span').hasClass('icon-starred')).toEqual(true);
|
|
|
|
expect(view.$el.find('.action-favorite > span').hasClass('icon-star')).toEqual(false);
|
2015-08-12 18:30:20 +03:00
|
|
|
|
|
|
|
testFileInfo.set('tags', []);
|
|
|
|
|
2016-11-21 16:40:34 +03:00
|
|
|
expect(view.$el.find('.action-favorite > span').hasClass('icon-starred')).toEqual(false);
|
|
|
|
expect(view.$el.find('.action-favorite > span').hasClass('icon-star')).toEqual(true);
|
2015-08-12 18:30:20 +03:00
|
|
|
});
|
|
|
|
it('unbinds change listener from model', function() {
|
2018-01-05 21:06:06 +03:00
|
|
|
// Show the "Favorite" icon
|
|
|
|
fileActions.registerAction({
|
|
|
|
name: 'Favorite',
|
|
|
|
mime: 'all',
|
|
|
|
permissions: OC.PERMISSION_NONE
|
|
|
|
});
|
|
|
|
|
2015-08-12 18:30:20 +03:00
|
|
|
view.setFileInfo(testFileInfo);
|
|
|
|
view.setFileInfo(new OCA.Files.FileInfoModel({
|
|
|
|
id: 999,
|
|
|
|
name: 'test.txt',
|
|
|
|
path: '/'
|
|
|
|
}));
|
|
|
|
|
|
|
|
// set value on old model
|
|
|
|
testFileInfo.set('tags', [OC.TAG_FAVORITE]);
|
|
|
|
|
|
|
|
// no change
|
2016-11-21 16:40:34 +03:00
|
|
|
expect(view.$el.find('.action-favorite > span').hasClass('icon-starred')).toEqual(false);
|
|
|
|
expect(view.$el.find('.action-favorite > span').hasClass('icon-star')).toEqual(true);
|
2015-08-12 18:30:20 +03:00
|
|
|
});
|
|
|
|
});
|
|
|
|
describe('events', function() {
|
|
|
|
it('triggers default action when clicking on the thumbnail', function() {
|
|
|
|
var actionHandler = sinon.stub();
|
|
|
|
|
|
|
|
fileActions.registerAction({
|
|
|
|
name: 'Something',
|
|
|
|
mime: 'all',
|
|
|
|
permissions: OC.PERMISSION_READ,
|
|
|
|
actionHandler: actionHandler
|
|
|
|
});
|
|
|
|
fileActions.setDefault('text/plain', 'Something');
|
|
|
|
|
|
|
|
view.setFileInfo(testFileInfo);
|
|
|
|
|
|
|
|
view.$el.find('.thumbnail').click();
|
|
|
|
|
|
|
|
expect(actionHandler.calledOnce).toEqual(true);
|
|
|
|
expect(actionHandler.getCall(0).args[0]).toEqual('One.txt');
|
|
|
|
expect(actionHandler.getCall(0).args[1].fileList).toEqual(fileList);
|
|
|
|
expect(actionHandler.getCall(0).args[1].fileActions).toEqual(fileActions);
|
|
|
|
expect(actionHandler.getCall(0).args[1].fileInfoModel).toEqual(testFileInfo);
|
|
|
|
});
|
|
|
|
it('triggers "Favorite" action when clicking on the star', function() {
|
|
|
|
var actionHandler = sinon.stub();
|
|
|
|
|
|
|
|
fileActions.registerAction({
|
|
|
|
name: 'Favorite',
|
|
|
|
mime: 'all',
|
|
|
|
permissions: OC.PERMISSION_READ,
|
|
|
|
actionHandler: actionHandler
|
|
|
|
});
|
|
|
|
|
|
|
|
view.setFileInfo(testFileInfo);
|
|
|
|
|
|
|
|
view.$el.find('.action-favorite').click();
|
|
|
|
|
|
|
|
expect(actionHandler.calledOnce).toEqual(true);
|
|
|
|
expect(actionHandler.getCall(0).args[0]).toEqual('One.txt');
|
|
|
|
expect(actionHandler.getCall(0).args[1].fileList).toEqual(fileList);
|
|
|
|
expect(actionHandler.getCall(0).args[1].fileActions).toEqual(fileActions);
|
|
|
|
expect(actionHandler.getCall(0).args[1].fileInfoModel).toEqual(testFileInfo);
|
|
|
|
});
|
2015-07-17 15:09:00 +03:00
|
|
|
});
|
|
|
|
});
|