summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVincent Petry <pvince81@owncloud.com>2015-08-05 12:48:42 +0200
committerVincent Petry <pvince81@owncloud.com>2015-08-10 14:12:34 +0200
commit9454e9043a7b18108f14a00d6ab8afa62fb894af (patch)
tree8458931b8d187f1378baf65058679f7993943011
parentdd4e0a8253d108e8b9cf9444990164d66b3d75f0 (diff)
downloadnextcloud-server-9454e9043a7b18108f14a00d6ab8afa62fb894af.tar.gz
nextcloud-server-9454e9043a7b18108f14a00d6ab8afa62fb894af.zip
Updated unit tests for file actions and actions menu
-rw-r--r--apps/files/js/fileactions.js8
-rw-r--r--apps/files/js/fileactionsmenu.js14
-rw-r--r--apps/files/tests/js/fileactionsSpec.js547
-rw-r--r--apps/files/tests/js/fileactionsmenuSpec.js291
-rw-r--r--apps/files/tests/js/filelistSpec.js79
5 files changed, 620 insertions, 319 deletions
diff --git a/apps/files/js/fileactions.js b/apps/files/js/fileactions.js
index 6b95e3ee6cd..0d9161c6eb4 100644
--- a/apps/files/js/fileactions.js
+++ b/apps/files/js/fileactions.js
@@ -332,10 +332,8 @@
* @param {OCA.Files.FileActionContext} context rendering context
*/
_showMenu: function(fileName, context) {
- var $actionEl = context.$file.find('.action-menu');
-
this._menu = new OCA.Files.FileActionsMenu();
- this._menu.showAt($actionEl, context);
+ this._menu.showAt(context);
},
/**
@@ -433,7 +431,7 @@
nameLinks = parent.children('a.name');
nameLinks.find('.fileactions, .nametext .action').remove();
nameLinks.append('<span class="fileactions" />');
- var defaultAction = this.getDefault(
+ var defaultAction = this.getDefaultFileAction(
this.getCurrentMimeType(),
this.getCurrentType(),
this.getCurrentPermissions()
@@ -449,7 +447,7 @@
if (actionSpec.type === FileActions.TYPE_INLINE) {
self._renderInlineAction(
actionSpec,
- actionSpec.action === defaultAction,
+ defaultAction && actionSpec.name === defaultAction.name,
context
);
}
diff --git a/apps/files/js/fileactionsmenu.js b/apps/files/js/fileactionsmenu.js
index dabf530b177..1795fdeab11 100644
--- a/apps/files/js/fileactionsmenu.js
+++ b/apps/files/js/fileactionsmenu.js
@@ -42,7 +42,7 @@
/**
* @private
*/
- initialize: function(fileActions, fileList) {
+ initialize: function() {
this.$el = $('<div class="fileActionsMenu dropdown hidden menu"></div>');
this._template = Handlebars.compile(TEMPLATE_MENU);
@@ -50,6 +50,10 @@
this.$el.on('afterHide', _.bind(this._onHide, this));
},
+ destroy: function() {
+ this.$el.remove();
+ },
+
/**
* Event handler whenever an action has been clicked within the menu
*
@@ -118,17 +122,15 @@
/**
* Displays the menu under the given element
*
- * @param {Object} $el target element
* @param {OCA.Files.FileActionContext} context context
*/
- showAt: function($el, context) {
+ showAt: function(context) {
this._context = context;
this.render();
this.$el.removeClass('hidden');
- $el.closest('td').append(this.$el);
-
+ context.$file.find('td.filename').append(this.$el);
context.$file.addClass('mouseOver');
OC.showMenu(null, this.$el);
@@ -139,7 +141,7 @@
*/
_onHide: function() {
this._context.$file.removeClass('mouseOver');
- this.$el.remove();
+ this.destroy();
}
};
diff --git a/apps/files/tests/js/fileactionsSpec.js b/apps/files/tests/js/fileactionsSpec.js
index e420ab828af..8c43b917fa9 100644
--- a/apps/files/tests/js/fileactionsSpec.js
+++ b/apps/files/tests/js/fileactionsSpec.js
@@ -20,8 +20,7 @@
*/
describe('OCA.Files.FileActions tests', function() {
- var $filesTable, fileList;
- var FileActions;
+ var fileList, fileActions;
beforeEach(function() {
// init horrible parameters
@@ -29,211 +28,175 @@ describe('OCA.Files.FileActions tests', function() {
$body.append('<input type="hidden" id="dir" value="/subdir"></input>');
$body.append('<input type="hidden" id="permissions" value="31"></input>');
// dummy files table
- $filesTable = $body.append('<table id="filestable"></table>');
- fileList = new OCA.Files.FileList($('#testArea'));
- FileActions = new OCA.Files.FileActions();
- FileActions.registerDefaultActions();
+ fileActions = new OCA.Files.FileActions();
+ fileActions.registerAction({
+ name: 'Testdropdown',
+ displayName: 'Testdropdowndisplay',
+ mime: 'all',
+ permissions: OC.PERMISSION_READ,
+ icon: function () {
+ return OC.imagePath('core', 'actions/download');
+ }
+ });
+
+ fileActions.registerAction({
+ name: 'Testinline',
+ displayName: 'Testinlinedisplay',
+ type: OCA.Files.FileActions.TYPE_INLINE,
+ mime: 'all',
+ permissions: OC.PERMISSION_READ
+ });
+
+ fileActions.registerAction({
+ name: 'Testdefault',
+ displayName: 'Testdefaultdisplay',
+ mime: 'all',
+ permissions: OC.PERMISSION_READ
+ });
+ fileActions.setDefault('all', 'Testdefault');
+ fileList = new OCA.Files.FileList($body, {
+ fileActions: fileActions
+ });
});
afterEach(function() {
- FileActions = null;
+ fileActions = null;
fileList.destroy();
fileList = undefined;
$('#dir, #permissions, #filestable').remove();
});
it('calling clear() clears file actions', function() {
- FileActions.clear();
- expect(FileActions.actions).toEqual({});
- expect(FileActions.defaults).toEqual({});
- expect(FileActions.icons).toEqual({});
- expect(FileActions.currentFile).toBe(null);
- });
- it('calling display() sets file actions', function() {
- var fileData = {
- id: 18,
- type: 'file',
- name: 'testName.txt',
- mimetype: 'text/plain',
- size: '1234',
- etag: 'a01234c',
- mtime: '123456'
- };
-
- // note: FileActions.display() is called implicitly
- var $tr = fileList.add(fileData);
-
- // actions defined after call
- expect($tr.find('.action.action-download').length).toEqual(1);
- expect($tr.find('.action.action-download').attr('data-action')).toEqual('Download');
- expect($tr.find('.nametext .action.action-rename').length).toEqual(1);
- expect($tr.find('.nametext .action.action-rename').attr('data-action')).toEqual('Rename');
- expect($tr.find('.action.delete').length).toEqual(1);
- });
- it('calling display() twice correctly replaces file actions', function() {
- var fileData = {
- id: 18,
- type: 'file',
- name: 'testName.txt',
- mimetype: 'text/plain',
- size: '1234',
- etag: 'a01234c',
- mtime: '123456'
- };
- var $tr = fileList.add(fileData);
-
- FileActions.display($tr.find('td.filename'), true, fileList);
- FileActions.display($tr.find('td.filename'), true, fileList);
-
- // actions defined after cal
- expect($tr.find('.action.action-download').length).toEqual(1);
- expect($tr.find('.nametext .action.action-rename').length).toEqual(1);
- expect($tr.find('.action.delete').length).toEqual(1);
- });
- it('redirects to download URL when clicking download', function() {
- var redirectStub = sinon.stub(OC, 'redirect');
- var fileData = {
- id: 18,
- type: 'file',
- name: 'testName.txt',
- mimetype: 'text/plain',
- size: '1234',
- etag: 'a01234c',
- mtime: '123456'
- };
- var $tr = fileList.add(fileData);
- FileActions.display($tr.find('td.filename'), true, fileList);
-
- $tr.find('.action-download').click();
-
- expect(redirectStub.calledOnce).toEqual(true);
- expect(redirectStub.getCall(0).args[0]).toContain(
- OC.webroot +
- '/index.php/apps/files/ajax/download.php' +
- '?dir=%2Fsubdir&files=testName.txt');
- redirectStub.restore();
+ fileActions.clear();
+ expect(fileActions.actions).toEqual({});
+ expect(fileActions.defaults).toEqual({});
+ expect(fileActions.icons).toEqual({});
+ expect(fileActions.currentFile).toBe(null);
});
- it('takes the file\'s path into account when clicking download', function() {
- var redirectStub = sinon.stub(OC, 'redirect');
- var fileData = {
- id: 18,
- type: 'file',
- name: 'testName.txt',
- path: '/anotherpath/there',
- mimetype: 'text/plain',
- size: '1234',
- etag: 'a01234c',
- mtime: '123456'
- };
- var $tr = fileList.add(fileData);
- FileActions.display($tr.find('td.filename'), true, fileList);
-
- $tr.find('.action-download').click();
-
- expect(redirectStub.calledOnce).toEqual(true);
- expect(redirectStub.getCall(0).args[0]).toContain(
- OC.webroot + '/index.php/apps/files/ajax/download.php' +
- '?dir=%2Fanotherpath%2Fthere&files=testName.txt'
- );
- redirectStub.restore();
- });
- it('deletes file when clicking delete', function() {
- var deleteStub = sinon.stub(fileList, 'do_delete');
- var fileData = {
- id: 18,
- type: 'file',
- name: 'testName.txt',
- path: '/somepath/dir',
- mimetype: 'text/plain',
- size: '1234',
- etag: 'a01234c',
- mtime: '123456'
- };
- var $tr = fileList.add(fileData);
- FileActions.display($tr.find('td.filename'), true, fileList);
-
- $tr.find('.action.delete').click();
-
- expect(deleteStub.calledOnce).toEqual(true);
- expect(deleteStub.getCall(0).args[0]).toEqual('testName.txt');
- expect(deleteStub.getCall(0).args[1]).toEqual('/somepath/dir');
- deleteStub.restore();
- });
- it('shows delete hint when no permission to delete', function() {
- var deleteStub = sinon.stub(fileList, 'do_delete');
- var fileData = {
- id: 18,
- type: 'file',
- name: 'testName.txt',
- path: '/somepath/dir',
- mimetype: 'text/plain',
- size: '1234',
- etag: 'a01234c',
- mtime: '123456',
- permissions: OC.PERMISSION_READ
- };
- var $tr = fileList.add(fileData);
- FileActions.display($tr.find('td.filename'), true, fileList);
+ describe('displaying actions', function() {
+ var $tr;
- var $action = $tr.find('.action.delete');
+ beforeEach(function() {
+ var fileData = {
+ id: 18,
+ type: 'file',
+ name: 'testName.txt',
+ mimetype: 'text/plain',
+ size: '1234',
+ etag: 'a01234c',
+ mtime: '123456',
+ permissions: OC.PERMISSION_READ | OC.PERMISSION_UPDATE
+ };
- expect($action.hasClass('no-permission')).toEqual(true);
- deleteStub.restore();
- });
- it('shows delete hint not when permission to delete', function() {
- var deleteStub = sinon.stub(fileList, 'do_delete');
- var fileData = {
- id: 18,
- type: 'file',
- name: 'testName.txt',
- path: '/somepath/dir',
- mimetype: 'text/plain',
- size: '1234',
- etag: 'a01234c',
- mtime: '123456',
- permissions: OC.PERMISSION_DELETE
- };
- var $tr = fileList.add(fileData);
- FileActions.display($tr.find('td.filename'), true, fileList);
-
- var $action = $tr.find('.action.delete');
-
- expect($action.hasClass('no-permission')).toEqual(false);
- deleteStub.restore();
+ // note: FileActions.display() is called implicitly
+ $tr = fileList.add(fileData);
+ });
+ it('renders inline file actions', function() {
+ // actions defined after call
+ expect($tr.find('.action.action-testinline').length).toEqual(1);
+ expect($tr.find('.action.action-testinline').attr('data-action')).toEqual('Testinline');
+ });
+ it('does not render dropdown actions', function() {
+ expect($tr.find('.action.action-testdropdown').length).toEqual(0);
+ });
+ it('does not render default action', function() {
+ expect($tr.find('.action.action-testdefault').length).toEqual(0);
+ });
+ it('replaces file actions when displayed twice', function() {
+ fileActions.display($tr.find('td.filename'), true, fileList);
+ fileActions.display($tr.find('td.filename'), true, fileList);
+
+ expect($tr.find('.action.action-testinline').length).toEqual(1);
+ });
+ it('renders actions menu trigger', function() {
+ expect($tr.find('.action.action-menu').length).toEqual(1);
+ expect($tr.find('.action.action-menu').attr('data-action')).toEqual('menu');
+ });
+ it('only renders actions relevant to the mime type', function() {
+ fileActions.registerAction({
+ name: 'Match',
+ displayName: 'MatchDisplay',
+ type: OCA.Files.FileActions.TYPE_INLINE,
+ mime: 'text/plain',
+ permissions: OC.PERMISSION_READ
+ });
+ fileActions.registerAction({
+ name: 'Nomatch',
+ displayName: 'NoMatchDisplay',
+ type: OCA.Files.FileActions.TYPE_INLINE,
+ mime: 'application/octet-stream',
+ permissions: OC.PERMISSION_READ
+ });
+
+ fileActions.display($tr.find('td.filename'), true, fileList);
+ expect($tr.find('.action.action-match').length).toEqual(1);
+ expect($tr.find('.action.action-nomatch').length).toEqual(0);
+ });
+ it('only renders actions relevant to the permissions', function() {
+ fileActions.registerAction({
+ name: 'Match',
+ displayName: 'MatchDisplay',
+ type: OCA.Files.FileActions.TYPE_INLINE,
+ mime: 'text/plain',
+ permissions: OC.PERMISSION_UPDATE
+ });
+ fileActions.registerAction({
+ name: 'Nomatch',
+ displayName: 'NoMatchDisplay',
+ type: OCA.Files.FileActions.TYPE_INLINE,
+ mime: 'text/plain',
+ permissions: OC.PERMISSION_DELETE
+ });
+
+ fileActions.display($tr.find('td.filename'), true, fileList);
+ expect($tr.find('.action.action-match').length).toEqual(1);
+ expect($tr.find('.action.action-nomatch').length).toEqual(0);
+ });
});
- it('passes context to action handler', function() {
- var actionStub = sinon.stub();
- var fileData = {
- id: 18,
- type: 'file',
- name: 'testName.txt',
- mimetype: 'text/plain',
- size: '1234',
- etag: 'a01234c',
- mtime: '123456'
- };
- var $tr = fileList.add(fileData);
- FileActions.register(
- 'all',
- 'Test',
- OC.PERMISSION_READ,
- OC.imagePath('core', 'actions/test'),
- actionStub
- );
- FileActions.display($tr.find('td.filename'), true, fileList);
- $tr.find('.action-test').click();
- expect(actionStub.calledOnce).toEqual(true);
- expect(actionStub.getCall(0).args[0]).toEqual('testName.txt');
- var context = actionStub.getCall(0).args[1];
- expect(context.$file.is($tr)).toEqual(true);
- expect(context.fileList).toBeDefined();
- expect(context.fileActions).toBeDefined();
- expect(context.dir).toEqual('/subdir');
-
- // when data-path is defined
- actionStub.reset();
- $tr.attr('data-path', '/somepath');
- $tr.find('.action-test').click();
- context = actionStub.getCall(0).args[1];
- expect(context.dir).toEqual('/somepath');
+ describe('action handler', function() {
+ var actionStub, $tr;
+
+ beforeEach(function() {
+ var fileData = {
+ id: 18,
+ type: 'file',
+ name: 'testName.txt',
+ mimetype: 'text/plain',
+ size: '1234',
+ etag: 'a01234c',
+ mtime: '123456'
+ };
+ actionStub = sinon.stub();
+ fileActions.registerAction({
+ name: 'Test',
+ type: OCA.Files.FileActions.TYPE_INLINE,
+ mime: 'all',
+ icon: OC.imagePath('core', 'actions/test'),
+ permissions: OC.PERMISSION_READ,
+ actionHandler: actionStub
+ });
+ $tr = fileList.add(fileData);
+ });
+ it('passes context to action handler', function() {
+ $tr.find('.action-test').click();
+ expect(actionStub.calledOnce).toEqual(true);
+ expect(actionStub.getCall(0).args[0]).toEqual('testName.txt');
+ var context = actionStub.getCall(0).args[1];
+ expect(context.$file.is($tr)).toEqual(true);
+ expect(context.fileList).toBeDefined();
+ expect(context.fileActions).toBeDefined();
+ expect(context.dir).toEqual('/subdir');
+
+ // when data-path is defined
+ actionStub.reset();
+ $tr.attr('data-path', '/somepath');
+ $tr.find('.action-test').click();
+ context = actionStub.getCall(0).args[1];
+ expect(context.dir).toEqual('/somepath');
+ });
+ it('shows actions menu when clicking the menu trigger', function() {
+ expect($tr.find('.menu').length).toEqual(0);
+ $tr.find('.action-menu').click();
+ expect($tr.find('.menu').length).toEqual(1);
+ });
});
describe('custom rendering', function() {
var $tr;
@@ -251,10 +214,11 @@ describe('OCA.Files.FileActions tests', function() {
});
it('regular function', function() {
var actionStub = sinon.stub();
- FileActions.registerAction({
+ fileActions.registerAction({
name: 'Test',
displayName: '',
mime: 'all',
+ type: OCA.Files.FileActions.TYPE_INLINE,
permissions: OC.PERMISSION_READ,
render: function(actionSpec, isDefault, context) {
expect(actionSpec.name).toEqual('Test');
@@ -266,13 +230,13 @@ describe('OCA.Files.FileActions tests', function() {
expect(context.fileList).toEqual(fileList);
expect(context.$file[0]).toEqual($tr[0]);
- var $customEl = $('<a href="#"><span>blabli</span><span>blabla</span></a>');
+ var $customEl = $('<a class="action action-test" href="#"><span>blabli</span><span>blabla</span></a>');
$tr.find('td:first').append($customEl);
return $customEl;
},
actionHandler: actionStub
});
- FileActions.display($tr.find('td.filename'), true, fileList);
+ fileActions.display($tr.find('td.filename'), true, fileList);
var $actionEl = $tr.find('td:first .action-test');
expect($actionEl.length).toEqual(1);
@@ -306,20 +270,22 @@ describe('OCA.Files.FileActions tests', function() {
var actions2 = new OCA.Files.FileActions();
var actionStub1 = sinon.stub();
var actionStub2 = sinon.stub();
- actions1.register(
- 'all',
- 'Test',
- OC.PERMISSION_READ,
- OC.imagePath('core', 'actions/test'),
- actionStub1
- );
- actions2.register(
- 'all',
- 'Test2',
- OC.PERMISSION_READ,
- OC.imagePath('core', 'actions/test'),
- actionStub2
- );
+ actions1.registerAction({
+ name: 'Test',
+ type: OCA.Files.FileActions.TYPE_INLINE,
+ mime: 'all',
+ permissions: OC.PERMISSION_READ,
+ icon: OC.imagePath('core', 'actions/test'),
+ actionHandler: actionStub1
+ });
+ actions2.registerAction({
+ name: 'Test2',
+ type: OCA.Files.FileActions.TYPE_INLINE,
+ mime: 'all',
+ permissions: OC.PERMISSION_READ,
+ icon: OC.imagePath('core', 'actions/test'),
+ actionHandler: actionStub2
+ });
actions2.merge(actions1);
actions2.display($tr.find('td.filename'), true, fileList);
@@ -342,20 +308,22 @@ describe('OCA.Files.FileActions tests', function() {
var actions2 = new OCA.Files.FileActions();
var actionStub1 = sinon.stub();
var actionStub2 = sinon.stub();
- actions1.register(
- 'all',
- 'Test',
- OC.PERMISSION_READ,
- OC.imagePath('core', 'actions/test'),
- actionStub1
- );
- actions2.register(
- 'all',
- 'Test', // override
- OC.PERMISSION_READ,
- OC.imagePath('core', 'actions/test'),
- actionStub2
- );
+ actions1.registerAction({
+ name: 'Test',
+ type: OCA.Files.FileActions.TYPE_INLINE,
+ mime: 'all',
+ permissions: OC.PERMISSION_READ,
+ icon: OC.imagePath('core', 'actions/test'),
+ actionHandler: actionStub1
+ });
+ actions2.registerAction({
+ name: 'Test', // override
+ mime: 'all',
+ type: OCA.Files.FileActions.TYPE_INLINE,
+ permissions: OC.PERMISSION_READ,
+ icon: OC.imagePath('core', 'actions/test'),
+ actionHandler: actionStub2
+ });
actions1.merge(actions2);
actions1.display($tr.find('td.filename'), true, fileList);
@@ -371,24 +339,26 @@ describe('OCA.Files.FileActions tests', function() {
var actions2 = new OCA.Files.FileActions();
var actionStub1 = sinon.stub();
var actionStub2 = sinon.stub();
- actions1.register(
- 'all',
- 'Test',
- OC.PERMISSION_READ,
- OC.imagePath('core', 'actions/test'),
- actionStub1
- );
+ actions1.registerAction({
+ mime: 'all',
+ name: 'Test',
+ type: OCA.Files.FileActions.TYPE_INLINE,
+ permissions: OC.PERMISSION_READ,
+ icon: OC.imagePath('core', 'actions/test'),
+ actionHandler: actionStub1
+ });
actions1.merge(actions2);
// late override
- actions1.register(
- 'all',
- 'Test', // override
- OC.PERMISSION_READ,
- OC.imagePath('core', 'actions/test'),
- actionStub2
- );
+ actions1.registerAction({
+ mime: 'all',
+ name: 'Test', // override
+ type: OCA.Files.FileActions.TYPE_INLINE,
+ permissions: OC.PERMISSION_READ,
+ icon: OC.imagePath('core', 'actions/test'),
+ actionHandler: actionStub2
+ });
actions1.display($tr.find('td.filename'), true, fileList);
@@ -403,25 +373,27 @@ describe('OCA.Files.FileActions tests', function() {
var actions2 = new OCA.Files.FileActions();
var actionStub1 = sinon.stub();
var actionStub2 = sinon.stub();
- actions1.register(
- 'all',
- 'Test',
- OC.PERMISSION_READ,
- OC.imagePath('core', 'actions/test'),
- actionStub1
- );
+ actions1.registerAction({
+ mime: 'all',
+ name: 'Test',
+ type: OCA.Files.FileActions.TYPE_INLINE,
+ permissions: OC.PERMISSION_READ,
+ icon: OC.imagePath('core', 'actions/test'),
+ actionHandler: actionStub1
+ });
// copy the Test action to actions2
actions2.merge(actions1);
// late override
- actions2.register(
- 'all',
- 'Test', // override
- OC.PERMISSION_READ,
- OC.imagePath('core', 'actions/test'),
- actionStub2
- );
+ actions2.registerAction({
+ mime: 'all',
+ name: 'Test', // override
+ type: OCA.Files.FileActions.TYPE_INLINE,
+ permissions: OC.PERMISSION_READ,
+ icon: OC.imagePath('core', 'actions/test'),
+ actionHandler: actionStub2
+ });
// check if original actions still call the correct handler
actions1.display($tr.find('td.filename'), true, fileList);
@@ -444,42 +416,45 @@ describe('OCA.Files.FileActions tests', function() {
it('notifies update event handlers once after multiple changes', function() {
var actionStub = sinon.stub();
var handler = sinon.stub();
- FileActions.on('registerAction', handler);
- FileActions.register(
- 'all',
- 'Test',
- OC.PERMISSION_READ,
- OC.imagePath('core', 'actions/test'),
- actionStub
- );
- FileActions.register(
- 'all',
- 'Test2',
- OC.PERMISSION_READ,
- OC.imagePath('core', 'actions/test'),
- actionStub
- );
+ fileActions.on('registerAction', handler);
+ fileActions.registerAction({
+ mime: 'all',
+ name: 'Test',
+ type: OCA.Files.FileActions.TYPE_INLINE,
+ permissions: OC.PERMISSION_READ,
+ icon: OC.imagePath('core', 'actions/test'),
+ actionHandler: actionStub
+ });
+ fileActions.registerAction({
+ mime: 'all',
+ name: 'Test2',
+ permissions: OC.PERMISSION_READ,
+ icon: OC.imagePath('core', 'actions/test'),
+ actionHandler: actionStub
+ });
expect(handler.calledTwice).toEqual(true);
});
it('does not notifies update event handlers after unregistering', function() {
var actionStub = sinon.stub();
var handler = sinon.stub();
- FileActions.on('registerAction', handler);
- FileActions.off('registerAction', handler);
- FileActions.register(
- 'all',
- 'Test',
- OC.PERMISSION_READ,
- OC.imagePath('core', 'actions/test'),
- actionStub
- );
- FileActions.register(
- 'all',
- 'Test2',
- OC.PERMISSION_READ,
- OC.imagePath('core', 'actions/test'),
- actionStub
- );
+ fileActions.on('registerAction', handler);
+ fileActions.off('registerAction', handler);
+ fileActions.registerAction({
+ mime: 'all',
+ name: 'Test',
+ type: OCA.Files.FileActions.TYPE_INLINE,
+ permissions: OC.PERMISSION_READ,
+ icon: OC.imagePath('core', 'actions/test'),
+ actionHandler: actionStub
+ });
+ fileActions.registerAction({
+ mime: 'all',
+ name: 'Test2',
+ type: OCA.Files.FileActions.TYPE_INLINE,
+ permissions: OC.PERMISSION_READ,
+ icon: OC.imagePath('core', 'actions/test'),
+ actionHandler: actionStub
+ });
expect(handler.notCalled).toEqual(true);
});
});
diff --git a/apps/files/tests/js/fileactionsmenuSpec.js b/apps/files/tests/js/fileactionsmenuSpec.js
new file mode 100644
index 00000000000..43439794975
--- /dev/null
+++ b/apps/files/tests/js/fileactionsmenuSpec.js
@@ -0,0 +1,291 @@
+/**
+* ownCloud
+*
+* @author Vincent Petry
+* @copyright 2015 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/>.
+*
+*/
+
+describe('OCA.Files.FileActionsMenu tests', function() {
+ var fileList, fileActions, menu, actionStub, $tr;
+
+ beforeEach(function() {
+ // init horrible parameters
+ var $body = $('#testArea');
+ $body.append('<input type="hidden" id="dir" value="/subdir"></input>');
+ $body.append('<input type="hidden" id="permissions" value="31"></input>');
+ // dummy files table
+ actionStub = sinon.stub();
+ fileActions = new OCA.Files.FileActions();
+ fileList = new OCA.Files.FileList($body, {
+ fileActions: fileActions
+ });
+
+ fileActions.registerAction({
+ name: 'Testdropdown',
+ displayName: 'Testdropdowndisplay',
+ mime: 'all',
+ permissions: OC.PERMISSION_READ,
+ icon: function () {
+ return OC.imagePath('core', 'actions/download');
+ },
+ actionHandler: actionStub
+ });
+
+ fileActions.registerAction({
+ name: 'Testdropdownnoicon',
+ displayName: 'Testdropdowndisplaynoicon',
+ mime: 'all',
+ permissions: OC.PERMISSION_READ,
+ actionHandler: actionStub
+ });
+
+ fileActions.registerAction({
+ name: 'Testinline',
+ displayName: 'Testinlinedisplay',
+ type: OCA.Files.FileActions.TYPE_INLINE,
+ mime: 'all',
+ permissions: OC.PERMISSION_READ
+ });
+
+ fileActions.registerAction({
+ name: 'Testdefault',
+ displayName: 'Testdefaultdisplay',
+ mime: 'all',
+ permissions: OC.PERMISSION_READ
+ });
+ fileActions.setDefault('all', 'Testdefault');
+
+ var fileData = {
+ id: 18,
+ type: 'file',
+ name: 'testName.txt',
+ mimetype: 'text/plain',
+ size: '1234',
+ etag: 'a01234c',
+ mtime: '123456'
+ };
+ $tr = fileList.add(fileData);
+
+ var menuContext = {
+ $file: $tr,
+ fileList: fileList,
+ fileActions: fileActions,
+ dir: fileList.getCurrentDirectory()
+ };
+ menu = new OCA.Files.FileActionsMenu();
+ menu.showAt(menuContext);
+ });
+ afterEach(function() {
+ fileActions = null;
+ fileList.destroy();
+ fileList = undefined;
+ menu.destroy();
+ $('#dir, #permissions, #filestable').remove();
+ });
+
+ describe('rendering', function() {
+ it('displays menu in the row container', function() {
+ expect(menu.$el.closest('td.filename').length).toEqual(1);
+ expect($tr.find('.fileActionsMenu').length).toEqual(1);
+ });
+ it('highlights the row in the file list', function() {
+ expect($tr.hasClass('mouseOver')).toEqual(true);
+ });
+ it('renders dropdown actions in menu', function() {
+ var $action = menu.$el.find('a[data-action=Testdropdown]');
+ expect($action.length).toEqual(1);
+ expect($action.find('img').attr('src'))
+ .toEqual(OC.imagePath('core', 'actions/download'));
+ expect($action.find('.no-icon').length).toEqual(0);
+
+ $action = menu.$el.find('a[data-action=Testdropdownnoicon]');
+ expect($action.length).toEqual(1);
+ expect($action.find('img').length).toEqual(0);
+ expect($action.find('.no-icon').length).toEqual(1);
+ });
+ it('does not render default actions', function() {
+ expect(menu.$el.find('a[data-action=Testdefault]').length).toEqual(0);
+ });
+ it('does not render inline actions', function() {
+ expect(menu.$el.find('a[data-action=Testinline]').length).toEqual(0);
+ });
+ it('only renders actions relevant to the mime type', function() {
+ fileActions.registerAction({
+ name: 'Match',
+ displayName: 'MatchDisplay',
+ mime: 'text/plain',
+ permissions: OC.PERMISSION_READ
+ });
+ fileActions.registerAction({
+ name: 'Nomatch',
+ displayName: 'NoMatchDisplay',
+ mime: 'application/octet-stream',
+ permissions: OC.PERMISSION_READ
+ });
+
+ menu.render();
+ expect(menu.$el.find('a[data-action=Match]').length).toEqual(1);
+ expect(menu.$el.find('a[data-action=NoMatch]').length).toEqual(0);
+ });
+ it('only renders actions relevant to the permissions', function() {
+ fileActions.registerAction({
+ name: 'Match',
+ displayName: 'MatchDisplay',
+ mime: 'text/plain',
+ permissions: OC.PERMISSION_UPDATE
+ });
+ fileActions.registerAction({
+ name: 'Nomatch',
+ displayName: 'NoMatchDisplay',
+ mime: 'text/plain',
+ permissions: OC.PERMISSION_DELETE
+ });
+
+ menu.render();
+ expect(menu.$el.find('a[data-action=Match]').length).toEqual(1);
+ expect(menu.$el.find('a[data-action=NoMatch]').length).toEqual(0);
+ });
+ });
+
+ describe('action handler', function() {
+ it('calls action handler when clicking menu item', function() {
+ var $action = menu.$el.find('a[data-action=Testdropdown]');
+ $action.click();
+
+ expect(actionStub.calledOnce).toEqual(true);
+ expect(actionStub.getCall(0).args[0]).toEqual('testName.txt');
+ expect(actionStub.getCall(0).args[1].$file[0]).toEqual($tr[0]);
+ expect(actionStub.getCall(0).args[1].fileList).toEqual(fileList);
+ expect(actionStub.getCall(0).args[1].fileActions).toEqual(fileActions);
+ expect(actionStub.getCall(0).args[1].dir).toEqual('/subdir');
+ });
+ });
+ describe('default actions from registerDefaultActions', function() {
+ beforeEach(function() {
+ fileActions.clear();
+ fileActions.registerDefaultActions();
+ });
+ it('redirects to download URL when clicking download', function() {
+ var redirectStub = sinon.stub(OC, 'redirect');
+ var fileData = {
+ id: 18,
+ type: 'file',
+ name: 'testName.txt',
+ mimetype: 'text/plain',
+ size: '1234',
+ etag: 'a01234c',
+ mtime: '123456'
+ };
+ var $tr = fileList.add(fileData);
+ fileActions.display($tr.find('td.filename'), true, fileList);
+
+ var menuContext = {
+ $file: $tr,
+ fileList: fileList,
+ fileActions: fileActions,
+ dir: fileList.getCurrentDirectory()
+ };
+ menu = new OCA.Files.FileActionsMenu();
+ menu.showAt(menuContext);
+
+ menu.$el.find('.action-download').click();
+
+ expect(redirectStub.calledOnce).toEqual(true);
+ expect(redirectStub.getCall(0).args[0]).toContain(
+ OC.webroot +
+ '/index.php/apps/files/ajax/download.php' +
+ '?dir=%2Fsubdir&files=testName.txt');
+ redirectStub.restore();
+ });
+ it('takes the file\'s path into account when clicking download', function() {
+ var redirectStub = sinon.stub(OC, 'redirect');
+ var fileData = {
+ id: 18,
+ type: 'file',
+ name: 'testName.txt',
+ path: '/anotherpath/there',
+ mimetype: 'text/plain',
+ size: '1234',
+ etag: 'a01234c',
+ mtime: '123456'
+ };
+ var $tr = fileList.add(fileData);
+ fileActions.display($tr.find('td.filename'), true, fileList);
+
+ var menuContext = {
+ $file: $tr,
+ fileList: fileList,
+ fileActions: fileActions,
+ dir: '/anotherpath/there'
+ };
+ menu = new OCA.Files.FileActionsMenu();
+ menu.showAt(menuContext);
+
+ menu.$el.find('.action-download').click();
+
+ expect(redirectStub.calledOnce).toEqual(true);
+ expect(redirectStub.getCall(0).args[0]).toContain(
+ OC.webroot + '/index.php/apps/files/ajax/download.php' +
+ '?dir=%2Fanotherpath%2Fthere&files=testName.txt'
+ );
+ redirectStub.restore();
+ });
+ it('deletes file when clicking delete', function() {
+ var deleteStub = sinon.stub(fileList, 'do_delete');
+ var fileData = {
+ id: 18,
+ type: 'file',
+ name: 'testName.txt',
+ path: '/somepath/dir',
+ mimetype: 'text/plain',
+ size: '1234',
+ etag: 'a01234c',
+ mtime: '123456'
+ };
+ var $tr = fileList.add(fileData);
+ fileActions.display($tr.find('td.filename'), true, fileList);
+
+ var menuContext = {
+ $file: $tr,
+ fileList: fileList,
+ fileActions: fileActions,
+ dir: '/somepath/dir'
+ };
+ menu = new OCA.Files.FileActionsMenu();
+ menu.showAt(menuContext);
+
+ menu.$el.find('.action-delete').click();
+
+ expect(deleteStub.calledOnce).toEqual(true);
+ expect(deleteStub.getCall(0).args[0]).toEqual('testName.txt');
+ expect(deleteStub.getCall(0).args[1]).toEqual('/somepath/dir');
+ deleteStub.restore();
+ });
+ });
+ describe('hiding', function() {
+ beforeEach(function() {
+ menu.$el.trigger(new $.Event('afterHide'));
+ });
+ it('removes highlight on current row', function() {
+ expect($tr.hasClass('mouseOver')).toEqual(false);
+ });
+ it('destroys its DOM element on hide', function() {
+ expect($tr.find('.fileActionsMenu').length).toEqual(0);
+ });
+ });
+});
+
diff --git a/apps/files/tests/js/filelistSpec.js b/apps/files/tests/js/filelistSpec.js
index 5c0c8c96bc5..57e16626403 100644
--- a/apps/files/tests/js/filelistSpec.js
+++ b/apps/files/tests/js/filelistSpec.js
@@ -456,19 +456,19 @@ describe('OCA.Files.FileList tests', function() {
expect(notificationStub.notCalled).toEqual(true);
});
- it('shows spinner on files to be deleted', function() {
+ it('shows busy state on files to be deleted', function() {
fileList.setFiles(testFiles);
doDelete();
- expect(fileList.findFileEl('One.txt').find('.icon-loading-small:not(.icon-delete)').length).toEqual(1);
- expect(fileList.findFileEl('Three.pdf').find('.icon-delete:not(.icon-loading-small)').length).toEqual(1);
+ expect(fileList.findFileEl('One.txt').hasClass('busy')).toEqual(true);
+ expect(fileList.findFileEl('Three.pdf').hasClass('busy')).toEqual(false);
});
- it('shows spinner on all files when deleting all', function() {
+ it('shows busy state on all files when deleting all', function() {
fileList.setFiles(testFiles);
fileList.do_delete();
- expect(fileList.$fileList.find('tr .icon-loading-small:not(.icon-delete)').length).toEqual(4);
+ expect(fileList.$fileList.find('tr.busy').length).toEqual(4);
});
it('updates summary when deleting last file', function() {
var $summary;
@@ -625,7 +625,7 @@ describe('OCA.Files.FileList tests', function() {
doCancelRename();
expect($summary.find('.info').text()).toEqual('1 folder and 3 files');
});
- it('Hides actions while rename in progress', function() {
+ it('Shows busy state while rename in progress', function() {
var $tr;
doRename();
@@ -634,8 +634,7 @@ describe('OCA.Files.FileList tests', function() {
expect($tr.length).toEqual(1);
expect(fileList.findFileEl('One.txt').length).toEqual(0);
// file actions are hidden
- expect($tr.find('.action').hasClass('hidden')).toEqual(true);
- expect($tr.find('.fileactions').hasClass('hidden')).toEqual(true);
+ expect($tr.hasClass('busy')).toEqual(true);
// input and form are gone
expect(fileList.$fileList.find('input.filename').length).toEqual(0);
@@ -1918,16 +1917,17 @@ describe('OCA.Files.FileList tests', function() {
it('Clicking on a file name will trigger default action', function() {
var actionStub = sinon.stub();
fileList.setFiles(testFiles);
- fileList.fileActions.register(
- 'text/plain',
- 'Test',
- OC.PERMISSION_ALL,
- function() {
+ fileList.fileActions.registerAction({
+ mime: 'text/plain',
+ name: 'Test',
+ type: OCA.Files.FileActions.TYPE_INLINE,
+ permissions: OC.PERMISSION_ALL,
+ icon: function() {
// Specify icon for hitory button
return OC.imagePath('core','actions/history');
},
- actionStub
- );
+ actionHandler: actionStub
+ });
fileList.fileActions.setDefault('text/plain', 'Test');
var $tr = fileList.findFileEl('One.txt');
$tr.find('td.filename .nametext').click();
@@ -1958,16 +1958,17 @@ describe('OCA.Files.FileList tests', function() {
fileList.$fileList.on('fileActionsReady', readyHandler);
- fileList.fileActions.register(
- 'text/plain',
- 'Test',
- OC.PERMISSION_ALL,
- function() {
+ fileList.fileActions.registerAction({
+ mime: 'text/plain',
+ name: 'Test',
+ type: OCA.Files.FileActions.TYPE_INLINE,
+ permissions: OC.PERMISSION_ALL,
+ icon: function() {
// Specify icon for hitory button
return OC.imagePath('core','actions/history');
},
- actionStub
- );
+ actionHandler: actionStub
+ });
var $tr = fileList.findFileEl('One.txt');
expect($tr.find('.action-test').length).toEqual(0);
expect(readyHandler.notCalled).toEqual(true);
@@ -2256,6 +2257,8 @@ describe('OCA.Files.FileList tests', function() {
});
});
describe('Handeling errors', function () {
+ var redirectStub;
+
beforeEach(function () {
redirectStub = sinon.stub(OC, 'redirect');
@@ -2281,4 +2284,36 @@ describe('OCA.Files.FileList tests', function() {
expect(redirectStub.calledWith(OC.generateUrl('apps/files'))).toEqual(true);
});
});
+ describe('showFileBusyState', function() {
+ var $tr;
+
+ beforeEach(function() {
+ fileList.setFiles(testFiles);
+ $tr = fileList.findFileEl('Two.jpg');
+ });
+ it('shows spinner on busy rows', function() {
+ fileList.showFileBusyState('Two.jpg', true);
+ expect($tr.hasClass('busy')).toEqual(true);
+ expect(OC.TestUtil.getImageUrl($tr.find('.thumbnail')))
+ .toEqual(OC.imagePath('core', 'loading.gif'));
+
+ fileList.showFileBusyState('Two.jpg', false);
+ expect($tr.hasClass('busy')).toEqual(false);
+ expect(OC.TestUtil.getImageUrl($tr.find('.thumbnail')))
+ .toEqual(OC.imagePath('core', 'filetypes/image.svg'));
+ });
+ it('accepts multiple input formats', function() {
+ _.each([
+ 'Two.jpg',
+ ['Two.jpg'],
+ $tr,
+ [$tr]
+ ], function(testCase) {
+ fileList.showFileBusyState(testCase, true);
+ expect($tr.hasClass('busy')).toEqual(true);
+ fileList.showFileBusyState(testCase, false);
+ expect($tr.hasClass('busy')).toEqual(false);
+ });
+ });
+ });
});