/**
* SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
describe('OCA.Files.MainFileInfoDetailView tests', function() {
var view, tooltipStub, fileActions, fileList, testFileInfo;
beforeEach(function() {
tooltipStub = sinon.stub($.fn, 'tooltip');
fileActions = new OCA.Files.FileActions();
fileList = new OCA.Files.FileList($('
'), {
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,
etag: 'abcdefg',
mtime: Date.UTC(2015, 6, 17, 1, 2, 0, 0)
});
});
afterEach(function() {
view.remove();
view = undefined;
tooltipStub.restore();
});
describe('rendering', function() {
it('displays basic info', function() {
var clock = sinon.useFakeTimers(Date.UTC(2015, 6, 17, 1, 2, 0, 3));
var dateExpected = OC.Util.formatDate(Date(Date.UTC(2015, 6, 17, 1, 2, 0, 0)));
view.setFileInfo(testFileInfo);
expect(view.$el.find('.fileName h3').text()).toEqual('One.txt');
expect(view.$el.find('.fileName h3').attr('title')).toEqual('One.txt');
expect(view.$el.find('.size').text()).toEqual('117.7 MB');
expect(view.$el.find('.size').attr('title')).toEqual('123456789 bytes');
expect(view.$el.find('.date').text()).toEqual('seconds ago');
expect(view.$el.find('.date').attr('title')).toEqual(dateExpected);
clock.restore();
});
it('displays permalink', function() {
view.setFileInfo(testFileInfo);
expect(view.$el.find('.permalink').attr('href'))
.toEqual(OC.getProtocol() + '://' + OC.getHost() + OC.generateUrl('/f/5'));
});
it('displays favorite icon', function() {
fileActions.registerAction({
name: 'Favorite',
mime: 'all',
permissions: OC.PERMISSION_NONE
});
testFileInfo.set('tags', [OC.TAG_FAVORITE]);
view.setFileInfo(testFileInfo);
expect(view.$el.find('.action-favorite > span').hasClass('icon-starred')).toEqual(true);
expect(view.$el.find('.action-favorite > span').hasClass('icon-star')).toEqual(false);
testFileInfo.set('tags', []);
view.setFileInfo(testFileInfo);
expect(view.$el.find('.action-favorite > span').hasClass('icon-starred')).toEqual(false);
expect(view.$el.find('.action-favorite > span').hasClass('icon-star')).toEqual(true);
});
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);
});
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');
// Folder
testFileInfo.set('mimetype', 'httpd/unix-directory');
view.setFileInfo(testFileInfo);
expect(view.$el.find('.thumbnail').css('background-image'))
.toContain('filetypes/folder.svg');
lazyLoadPreviewStub.restore();
});
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();
});
it('displays thumbnail', function() {
var lazyLoadPreviewStub = sinon.stub(fileList, 'lazyLoadPreview');
testFileInfo.set('mimetype', 'text/plain');
view.setFileInfo(testFileInfo);
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');
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);
lazyLoadPreviewStub.restore();
});
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);
expect(view.$el.find('.fileName h3').text()).toEqual('hello.txt');
expect(view.$el.find('.fileName h3').attr('title')).toEqual('hello.txt');
});
it('rerenders when changes are made on the model', function() {
// Show the "Favorite" icon
fileActions.registerAction({
name: 'Favorite',
mime: 'all',
permissions: OC.PERMISSION_NONE
});
view.setFileInfo(testFileInfo);
testFileInfo.set('tags', [OC.TAG_FAVORITE]);
expect(view.$el.find('.action-favorite > span').hasClass('icon-starred')).toEqual(true);
expect(view.$el.find('.action-favorite > span').hasClass('icon-star')).toEqual(false);
testFileInfo.set('tags', []);
expect(view.$el.find('.action-favorite > span').hasClass('icon-starred')).toEqual(false);
expect(view.$el.find('.action-favorite > span').hasClass('icon-star')).toEqual(true);
});
it('unbinds change listener from model', function() {
// Show the "Favorite" icon
fileActions.registerAction({
name: 'Favorite',
mime: 'all',
permissions: OC.PERMISSION_NONE
});
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
expect(view.$el.find('.action-favorite > span').hasClass('icon-starred')).toEqual(false);
expect(view.$el.find('.action-favorite > span').hasClass('icon-star')).toEqual(true);
});
});
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);
});
});
});