diff options
author | Vincent Petry <pvince81@owncloud.com> | 2014-06-02 17:23:52 +0200 |
---|---|---|
committer | Vincent Petry <pvince81@owncloud.com> | 2014-06-02 18:08:56 +0200 |
commit | 0944565f6033766abfe0ab8987d7116062748c21 (patch) | |
tree | e5b12a01cf6acb8f05e5ef4c35e54af328224a38 | |
parent | 679d10ca00577f8175fe03ff5c25f4aa41547177 (diff) | |
download | nextcloud-server-0944565f6033766abfe0ab8987d7116062748c21.tar.gz nextcloud-server-0944565f6033766abfe0ab8987d7116062748c21.zip |
More unit tests and fixes for share
-rw-r--r-- | apps/files_sharing/js/share.js | 201 | ||||
-rw-r--r-- | apps/files_sharing/tests/js/shareSpec.js | 179 | ||||
-rw-r--r-- | core/js/share.js | 37 | ||||
-rw-r--r-- | core/js/tests/specs/shareSpec.js | 144 |
4 files changed, 421 insertions, 140 deletions
diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js index 9f47e785821..66def1fe73f 100644 --- a/apps/files_sharing/js/share.js +++ b/apps/files_sharing/js/share.js @@ -14,119 +14,112 @@ } OCA.Sharing.Util = { initialize: function(fileActions) { - if (!_.isUndefined(OC.Share) && !_.isUndefined(OCA.Files)) { - // TODO: make a separate class for this or a hook or jQuery event ? - if (OCA.Files.FileList) { - var oldCreateRow = OCA.Files.FileList.prototype._createRow; - OCA.Files.FileList.prototype._createRow = function(fileData) { - var tr = oldCreateRow.apply(this, arguments); - if (fileData.shareOwner) { - tr.attr('data-share-owner', fileData.shareOwner); - // user should always be able to rename a mount point - if (fileData.isShareMountPoint) { - tr.attr('data-permissions', fileData.permissions | OC.PERMISSION_UPDATE); - tr.attr('data-reshare-permissions', fileData.permissions); - } + // TODO: make a separate class for this or a hook or jQuery event ? + if (OCA.Files.FileList) { + var oldCreateRow = OCA.Files.FileList.prototype._createRow; + OCA.Files.FileList.prototype._createRow = function(fileData) { + var tr = oldCreateRow.apply(this, arguments); + if (fileData.shareOwner) { + tr.attr('data-share-owner', fileData.shareOwner); + // user should always be able to rename a mount point + if (fileData.isShareMountPoint) { + tr.attr('data-permissions', fileData.permissions | OC.PERMISSION_UPDATE); + tr.attr('data-reshare-permissions', fileData.permissions); } - if (fileData.recipientsDisplayName) { - tr.attr('data-share-recipients', fileData.recipientsDisplayName); - } - return tr; - }; - } + } + if (fileData.recipientsDisplayName) { + tr.attr('data-share-recipients', fileData.recipientsDisplayName); + } + return tr; + }; + } - // use delegate to catch the case with multiple file lists - $('#content').delegate('#fileList', 'fileActionsReady',function(ev){ - // if no share action exists because the admin disabled sharing for this user - // we create a share notification action to inform the user about files - // shared with him otherwise we just update the existing share action. - var fileList = ev.fileList; - var $fileList = $(this); - $fileList.find('[data-share-owner]').each(function() { - var $tr = $(this); - var permissions = $tr.data('permissions'); - if(permissions & OC.PERMISSION_SHARE) { - OC.Share.markFileAsShared($tr, true); - } else { - // TODO: make this work like/with OC.Share.markFileAsShared() - var shareNotification = '<a class="action action-share-notification permanent"' + - ' data-action="Share-Notification" href="#" original-title="">' + - ' <img class="svg" src="' + OC.imagePath('core', 'actions/share') + '"></img>'; - $tr.find('.fileactions').append(function() { - var owner = $(this).closest('tr').attr('data-share-owner'); - var shareBy = t('files_sharing', 'Shared by {owner}', {owner: owner}); - var $result = $(shareNotification + '<span> ' + shareBy + '</span></span>'); - $result.on('click', function() { - return false; - }); - return $result; + // use delegate to catch the case with multiple file lists + $('#content').delegate('#fileList', 'fileActionsReady',function(ev){ + // if no share action exists because the admin disabled sharing for this user + // we create a share notification action to inform the user about files + // shared with him otherwise we just update the existing share action. + var fileList = ev.fileList; + var $fileList = $(this); + $fileList.find('[data-share-owner]').each(function() { + var $tr = $(this); + var permissions = $tr.data('permissions'); + if(permissions & OC.PERMISSION_SHARE) { + OC.Share.markFileAsShared($tr, true); + } else { + // TODO: make this work like/with OC.Share.markFileAsShared() + var shareNotification = '<a class="action action-share-notification permanent"' + + ' data-action="Share-Notification" href="#" original-title="">' + + ' <img class="svg" src="' + OC.imagePath('core', 'actions/share') + '"></img>'; + $tr.find('.fileactions').append(function() { + var owner = $(this).closest('tr').attr('data-share-owner'); + var shareBy = t('files_sharing', 'Shared by {owner}', {owner: owner}); + var $result = $(shareNotification + '<span> ' + shareBy + '</span></span>'); + $result.on('click', function() { + return false; }); - } - }); - - if (!OCA.Sharing.sharesLoaded){ - OC.Share.loadIcons('file', fileList); - // assume that we got all shares, so switching directories - // will not invalidate that list - OCA.Sharing.sharesLoaded = true; - } - else{ - OC.Share.updateIcons('file', fileList); + return $result; + }); } }); - fileActions.register( - 'all', - 'Share', - OC.PERMISSION_SHARE, - OC.imagePath('core', 'actions/share'), - function(filename, context) { + if (!OCA.Sharing.sharesLoaded){ + OC.Share.loadIcons('file', fileList); + // assume that we got all shares, so switching directories + // will not invalidate that list + OCA.Sharing.sharesLoaded = true; + } + else{ + OC.Share.updateIcons('file', fileList); + } + }); - var $tr = context.$file; - var itemType = 'file'; - if ($tr.data('type') === 'dir') { - itemType = 'folder'; - } - var possiblePermissions = $tr.data('reshare-permissions'); - if (_.isUndefined(possiblePermissions)) { - possiblePermissions = $tr.data('permissions'); - } + fileActions.register( + 'all', + 'Share', + OC.PERMISSION_SHARE, + OC.imagePath('core', 'actions/share'), + function(filename, context) { - var appendTo = $tr.find('td.filename'); - // Check if drop down is already visible for a different file - if (OC.Share.droppedDown) { - if ($tr.data('id') !== $('#dropdown').attr('data-item-source')) { - OC.Share.hideDropDown(function () { - $tr.addClass('mouseOver'); - OC.Share.showDropDown(itemType, $tr.data('id'), appendTo, true, possiblePermissions, filename); - }); - } else { - OC.Share.hideDropDown(); - } + var $tr = context.$file; + var itemType = 'file'; + if ($tr.data('type') === 'dir') { + itemType = 'folder'; + } + var possiblePermissions = $tr.data('reshare-permissions'); + if (_.isUndefined(possiblePermissions)) { + possiblePermissions = $tr.data('permissions'); + } + + var appendTo = $tr.find('td.filename'); + // Check if drop down is already visible for a different file + if (OC.Share.droppedDown) { + if ($tr.data('id') !== $('#dropdown').attr('data-item-source')) { + OC.Share.hideDropDown(function () { + $tr.addClass('mouseOver'); + OC.Share.showDropDown(itemType, $tr.data('id'), appendTo, true, possiblePermissions, filename); + }); } else { - $tr.addClass('mouseOver'); - OC.Share.showDropDown(itemType, $tr.data('id'), appendTo, true, possiblePermissions, filename); + OC.Share.hideDropDown(); + } + } else { + $tr.addClass('mouseOver'); + OC.Share.showDropDown(itemType, $tr.data('id'), appendTo, true, possiblePermissions, filename); + } + $('#dropdown').on('sharesChanged', function(ev) { + // note: we only update the data attribute because updateIcon() + // is called automatically after this event + var userShares = ev.itemShares[OC.Share.SHARE_TYPE_USER] || []; + var groupShares = ev.itemShares[OC.Share.SHARE_TYPE_GROUP] || []; + var recipients = _.union(userShares, groupShares); + if (recipients.length) { + $tr.attr('data-share-recipients', OCA.Sharing.Util.formatRecipients(recipients)); + } + else { + $tr.removeAttr('data-share-recipients'); } - $('#dropdown').on('sharesChanged', function(ev) { - // note: we only update the data attribute because updateIcon() - // is called automatically after this event - var userShares = ev.itemShares[OC.Share.SHARE_TYPE_USER] || []; - var groupShares = ev.itemShares[OC.Share.SHARE_TYPE_GROUP] || []; - var recipients = _.union(userShares, groupShares); - // only update the recipients if they existed before - // (some file lists don't have them) - if (!_.isUndefined($tr.attr('data-share-recipients'))) { - // FIXME: use display names from users, we currently only got user ids - if (recipients.length) { - $tr.attr('data-share-recipients', OCA.Sharing.Util.formatRecipients(recipients)); - } - else { - $tr.attr('data-share-recipients', ''); - } - } - }); }); - } + }); }, /** @@ -159,7 +152,9 @@ $(document).ready(function() { // FIXME: HACK: do not init when running unit tests, need a better way if (!window.TESTING) { - OCA.Sharing.Util.initialize(OCA.Files.fileActions); + if (!_.isUndefined(OC.Share) && !_.isUndefined(OCA.Files)) { + OCA.Sharing.Util.initialize(OCA.Files.fileActions); + } } }); diff --git a/apps/files_sharing/tests/js/shareSpec.js b/apps/files_sharing/tests/js/shareSpec.js index 604a4bb2bb6..d2697beeb0b 100644 --- a/apps/files_sharing/tests/js/shareSpec.js +++ b/apps/files_sharing/tests/js/shareSpec.js @@ -13,6 +13,16 @@ describe('OCA.Sharing.Util tests', function() { var fileList; var testFiles; + function getImageUrl($el) { + // might be slightly different cross-browser + var url = $el.css('background-image'); + var r = url.match(/url\(['"]?([^'")]*)['"]?\)/); + if (!r) { + return url; + } + return r[1]; + } + beforeEach(function() { // back up prototype, as it will be extended by // the sharing code @@ -59,6 +69,7 @@ describe('OCA.Sharing.Util tests', function() { afterEach(function() { OCA.Files.FileList.prototype = oldFileListPrototype; delete OCA.Sharing.sharesLoaded; + delete OC.Share.droppedDown; OC.Share.statuses = {}; }); @@ -67,62 +78,71 @@ describe('OCA.Sharing.Util tests', function() { }); describe('Share action icon', function() { it('do not shows share text when not shared', function() { - var $action; + var $action, $tr; OC.Share.statuses = {}; fileList.setFiles([{ id: 1, - type: 'file', - name: 'One.txt', + type: 'dir', + name: 'One', path: '/subdir', mimetype: 'text/plain', size: 12, permissions: 31, etag: 'abc' }]); - $action = fileList.$el.find('tbody tr:first .action-share'); + $tr = fileList.$el.find('tbody tr:first'); + $action = $tr.find('.action-share'); expect($action.hasClass('permanent')).toEqual(false); expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg'); + expect(OC.basename(getImageUrl($tr.find('.filename')))).toEqual('folder.svg'); + expect($action.find('img').length).toEqual(1); }); it('shows simple share text with share icon', function() { - var $action; + var $action, $tr; fileList.setFiles([{ id: 1, - type: 'file', - name: 'One.txt', + type: 'dir', + name: 'One', path: '/subdir', mimetype: 'text/plain', size: 12, permissions: 31, etag: 'abc' }]); - $action = fileList.$el.find('tbody tr:first .action-share'); + $tr = fileList.$el.find('tbody tr:first'); + $action = $tr.find('.action-share'); expect($action.hasClass('permanent')).toEqual(true); expect($action.find('>span').text()).toEqual('Shared'); expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg'); + expect(OC.basename(getImageUrl($tr.find('.filename')))).toEqual('folder-shared.svg'); + expect($action.find('img').length).toEqual(1); }); it('shows simple share text with public icon when shared with link', function() { - var $action; + var $action, $tr; OC.Share.statuses = {1: {link: true, path: '/subdir'}}; fileList.setFiles([{ id: 1, - type: 'file', - name: 'One.txt', + type: 'dir', + name: 'One', path: '/subdir', mimetype: 'text/plain', size: 12, permissions: 31, etag: 'abc' }]); - $action = fileList.$el.find('tbody tr:first .action-share'); + $tr = fileList.$el.find('tbody tr:first'); + $action = $tr.find('.action-share'); expect($action.hasClass('permanent')).toEqual(true); expect($action.find('>span').text()).toEqual('Shared'); expect(OC.basename($action.find('img').attr('src'))).toEqual('public.svg'); + expect(OC.basename(getImageUrl($tr.find('.filename')))).toEqual('folder-public.svg'); + expect($action.find('img').length).toEqual(1); }); it('shows owner name when owner is available', function() { - var $action; + var $action, $tr; fileList.setFiles([{ id: 1, - type: 'file', + type: 'dir', name: 'One.txt', path: '/subdir', mimetype: 'text/plain', @@ -131,16 +151,18 @@ describe('OCA.Sharing.Util tests', function() { shareOwner: 'User One', etag: 'abc' }]); - $action = fileList.$el.find('tbody tr:first .action-share'); + $tr = fileList.$el.find('tbody tr:first'); + $action = $tr.find('.action-share'); expect($action.hasClass('permanent')).toEqual(true); expect($action.find('>span').text()).toEqual('Shared by User One'); expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg'); + expect(OC.basename(getImageUrl($tr.find('.filename')))).toEqual('folder-shared.svg'); }); it('shows recipients when recipients are available', function() { - var $action; + var $action, $tr; fileList.setFiles([{ id: 1, - type: 'file', + type: 'dir', name: 'One.txt', path: '/subdir', mimetype: 'text/plain', @@ -149,17 +171,130 @@ describe('OCA.Sharing.Util tests', function() { recipientsDisplayName: 'User One, User Two', etag: 'abc' }]); - $action = fileList.$el.find('tbody tr:first .action-share'); + $tr = fileList.$el.find('tbody tr:first'); + $action = $tr.find('.action-share'); expect($action.hasClass('permanent')).toEqual(true); expect($action.find('>span').text()).toEqual('Shared with User One, User Two'); expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg'); + expect(OC.basename(getImageUrl($tr.find('.filename')))).toEqual('folder-shared.svg'); + expect($action.find('img').length).toEqual(1); }); }); describe('Share action', function() { - // TODO: test file action / dropdown trigger - it('updates share icon when shares were changed in dropdown', function() { - fileList.setFiles(testFiles); - fileList.$el.find('tr:first .action-share').click(); + var showDropDownStub; + + beforeEach(function() { + showDropDownStub = sinon.stub(OC.Share, 'showDropDown', function() { + $('#testArea').append($('<div id="dropdown"></div>')); + }); + }); + afterEach(function() { + showDropDownStub.restore(); + }); + it('adds share icon after sharing a non-shared file', function() { + var $action, $tr; + OC.Share.statuses = {}; + fileList.setFiles([{ + id: 1, + type: 'file', + name: 'One.txt', + path: '/subdir', + mimetype: 'text/plain', + size: 12, + permissions: 31, + etag: 'abc' + }]); + $action = fileList.$el.find('tbody tr:first .action-share'); + $tr = fileList.$el.find('tr:first'); + + expect($action.hasClass('permanent')).toEqual(false); + + $tr.find('.action-share').click(); + + expect(showDropDownStub.calledOnce).toEqual(true); + + // simulate what the dropdown does + var itemShares = {}; + itemShares[OC.Share.SHARE_TYPE_USER] = ['User One', 'User Two']; + itemShares[OC.Share.SHARE_TYPE_GROUP] = ['Group One', 'Group Two']; + OC.Share.itemShares = itemShares; + $('#dropdown').trigger(new $.Event('sharesChanged', {itemShares: itemShares})); + + expect($tr.attr('data-share-recipients')).toEqual('Group One, Group Two, User One, User Two'); + + OC.Share.updateIcon('file', 1); + expect($action.hasClass('permanent')).toEqual(true); + expect($action.find('>span').text()).toEqual('Shared with Group One, Group Two, User One, User Two'); + expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg'); + }); + it('removes share icon after unsharing a shared file', function() { + var $action, $tr; + OC.Share.statuses = {1: {link: false, path: '/subdir'}}; + fileList.setFiles([{ + id: 1, + type: 'file', + name: 'One.txt', + path: '/subdir', + mimetype: 'text/plain', + size: 12, + permissions: 31, + etag: 'abc' + }]); + $action = fileList.$el.find('tbody tr:first .action-share'); + $tr = fileList.$el.find('tr:first'); + + expect($action.hasClass('permanent')).toEqual(true); + + $tr.find('.action-share').click(); + + expect(showDropDownStub.calledOnce).toEqual(true); + + // simulate what the dropdown does + var itemShares = {}; + itemShares[OC.Share.SHARE_TYPE_USER] = ['User One', 'User Two', 'User Three']; + OC.Share.itemShares = itemShares; + $('#dropdown').trigger(new $.Event('sharesChanged', {itemShares: itemShares})); + + expect($tr.attr('data-share-recipients')).toEqual('User One, User Three, User Two'); + + OC.Share.updateIcon('file', 1); + + expect($action.hasClass('permanent')).toEqual(true); + expect($action.find('>span').text()).toEqual('Shared with User One, User Three, User Two'); + expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg'); + }); + it('updates share icon after modifying shares on a shared file', function() { + var $action, $tr; + OC.Share.statuses = {1: {link: false, path: '/subdir'}}; + fileList.setFiles([{ + id: 1, + type: 'file', + name: 'One.txt', + path: '/subdir', + mimetype: 'text/plain', + size: 12, + permissions: 31, + etag: 'abc', + recipients: 'User One, User Two' + }]); + $action = fileList.$el.find('tbody tr:first .action-share'); + $tr = fileList.$el.find('tr:first'); + + expect($action.hasClass('permanent')).toEqual(true); + + $tr.find('.action-share').click(); + + expect(showDropDownStub.calledOnce).toEqual(true); + + // simulate what the dropdown does + var itemShares = {}; + OC.Share.itemShares = itemShares; + $('#dropdown').trigger(new $.Event('sharesChanged', {itemShares: itemShares})); + + expect($tr.attr('data-share-recipients')).not.toBeDefined(); + + OC.Share.updateIcon('file', 1); + expect($action.hasClass('permanent')).toEqual(false); }); }); describe('formatRecipients', function() { diff --git a/core/js/share.js b/core/js/share.js index c4ca63908a9..4e12f35d19e 100644 --- a/core/js/share.js +++ b/core/js/share.js @@ -47,6 +47,7 @@ OC.Share={ $fileList = fileList.$fileList; currentDir = fileList.getCurrentDirectory(); } + // TODO: iterating over the files might be more efficient for (item in OC.Share.statuses){ var image = OC.imagePath('core', 'actions/share'); var data = OC.Share.statuses[item]; @@ -63,7 +64,7 @@ OC.Share={ var shareFolder = OC.imagePath('core', 'filetypes/folder-shared'); var img; if (file.length > 0) { - this.markFileAsShared(file, true, image); + this.markFileAsShared(file, true, hasLink); } else { var dir = currentDir; if (dir.length > 1) { @@ -122,7 +123,11 @@ OC.Share={ } else { var $tr = $('tr').filterAttr('data-id', String(itemSource)); if ($tr.length > 0) { - this.markFileAsShared($tr, shares, image); + // it might happen that multiple lists exist in the DOM + // with the same id + $tr.each(function() { + OC.Share.markFileAsShared($(this), shares, link); + }); } } if (shares) { @@ -133,13 +138,14 @@ OC.Share={ } }, /** - * Marks/unmarks a given file as shared + * Marks/unmarks a given file as shared by changing its action icon + * and folder icon. * * @param $tr file element to mark as shared - * @param state true to mark as shared, false to unmark - * @param image image to use for the icon + * @param hasShares whether shares are available + * @param hasLink whether link share is available */ - markFileAsShared: function($tr, state, image) { + markFileAsShared: function($tr, hasShares, hasLink) { var action = $tr.find('.fileactions .action[data-action="Share"]'); var type = $tr.data('type'); var img = action.find('img'); @@ -147,14 +153,22 @@ OC.Share={ var recipients; var owner; var shareFolderIcon; - if (type === 'dir' && state) { - shareFolderIcon = OC.imagePath('core', 'filetypes/folder-shared'); + var image = OC.imagePath('core', 'actions/share'); + // update folder icon + if (type === 'dir' && (hasShares || hasLink)) { + if (hasLink) { + shareFolderIcon = OC.imagePath('core', 'filetypes/folder-public'); + } + else { + shareFolderIcon = OC.imagePath('core', 'filetypes/folder-shared'); + } $tr.children('.filename').css('background-image', 'url(' + shareFolderIcon + ')'); } else if (type === 'dir') { shareFolderIcon = OC.imagePath('core', 'filetypes/folder'); $tr.children('.filename').css('background-image', 'url(' + shareFolderIcon + ')'); } - if (state) { + // update share action text / icon + if (hasShares) { recipients = $tr.attr('data-share-recipients'); owner = $tr.attr('data-share-owner'); @@ -162,7 +176,6 @@ OC.Share={ message = t('core', 'Shared'); if (owner && !recipients) { message = t('files_sharing', 'Shared by {owner}', {owner: owner}); - image = image || OC.imagePath('core', 'actions/share'); } if (recipients) { message = t('core', 'Shared with {recipients}', {recipients: recipients}); @@ -173,6 +186,9 @@ OC.Share={ action.removeClass('permanent'); action.html(' <span>'+ escapeHTML(t('core', 'Share'))+'</span>').prepend(img); } + if (hasLink) { + image = OC.imagePath('core', 'actions/public'); + } img.attr('src', image); }, loadItem:function(itemType, itemSource) { @@ -756,6 +772,7 @@ $(document).ready(function() { if ($('#linkText').val() !== '') { OC.Share.unshare(itemType, itemSource, OC.Share.SHARE_TYPE_LINK, '', function() { OC.Share.itemShares[OC.Share.SHARE_TYPE_LINK] = false; + $('#dropdown').trigger(new $.Event('sharesChanged', {itemShares: OC.Share.itemShares})); OC.Share.updateIcon(itemType, itemSource); if (typeof OC.Share.statuses[itemSource] === 'undefined') { $('#expiration').hide('blind'); diff --git a/core/js/tests/specs/shareSpec.js b/core/js/tests/specs/shareSpec.js index a487b71fdbb..a8d9225649c 100644 --- a/core/js/tests/specs/shareSpec.js +++ b/core/js/tests/specs/shareSpec.js @@ -26,13 +26,17 @@ describe('OC.Share tests', function() { var oldAppConfig; var loadItemStub; var autocompleteStub; + beforeEach(function() { $('#testArea').append($('<div id="shareContainer"></div>')); + // horrible parameters + $('#testArea').append('<input id="allowShareWithLink" type="hidden" value="yes">'); $container = $('#shareContainer'); /* jshint camelcase:false */ - oldAppConfig = oc_appconfig.core; - loadItemStub = sinon.stub(OC.Share, 'loadItem'); + oldAppConfig = _.extend({}, oc_appconfig.core); + oc_appconfig.core.enforcePasswordForPublicLink = false; + loadItemStub = sinon.stub(OC.Share, 'loadItem'); loadItemStub.returns({ reshare: [], shares: [] @@ -89,9 +93,139 @@ describe('OC.Share tests', function() { oc_appconfig.core.defaultExpireDate = ''; // TODO: expect that default date was NOT set }); - // TODO: test password field visibility (whenever enforced or not) - // TODO: check link share field visibility based on whether it is allowed - // TODO: check public upload visibility based on config + describe('Share with link', function() { + // TODO: test ajax calls + // TODO: test password field visibility (whenever enforced or not) + // TODO: check public upload visibility based on config + it('shows share with link checkbox when allowed', function() { + $('#allowShareWithLink').val('yes'); + OC.Share.showDropDown( + 'file', + 123, + $container, + 'http://localhost/dummylink', + 31, + 'shared_file_name.txt' + ); + expect($('#dropdown #linkCheckbox').length).toEqual(1); + }); + it('does not show share with link checkbox when not allowed', function() { + $('#allowShareWithLink').val('no'); + OC.Share.showDropDown( + 'file', + 123, + $container, + 'http://localhost/dummylink', + 31, + 'shared_file_name.txt' + ); + expect($('#dropdown #linkCheckbox').length).toEqual(0); + }); + }); + describe('"sharesChanged" event', function() { + var autocompleteOptions; + var handler; + beforeEach(function() { + handler = sinon.stub(); + loadItemStub.returns({ + reshare: [], + shares: [{ + id: 100, + item_source: 123, + permissions: 31, + share_type: OC.Share.SHARE_TYPE_USER, + share_with: 'user1', + share_with_displayname: 'User One' + }] + }); + OC.Share.showDropDown( + 'file', + 123, + $container, + 'http://localhost/dummylink', + 31, + 'shared_file_name.txt' + ); + $('#dropdown').on('sharesChanged', handler); + autocompleteOptions = autocompleteStub.getCall(0).args[0]; + }); + afterEach(function() { + autocompleteOptions = null; + handler = null; + }); + it('triggers "sharesChanged" event when adding shares', function() { + // simulate autocomplete selection + autocompleteOptions.select(new $.Event('select'), { + item: { + label: 'User Two', + value: { + shareType: OC.Share.SHARE_TYPE_USER, + shareWith: 'user2' + } + } + }); + fakeServer.requests[0].respond( + 200, + { 'Content-Type': 'application/json' }, + JSON.stringify({status: 'success'}) + ); + expect(handler.calledOnce).toEqual(true); + var itemShares = handler.getCall(0).args[0].itemShares; + expect(itemShares).toBeDefined(); + expect(itemShares[OC.Share.SHARE_TYPE_USER]).toEqual(['user1', 'user2']); + expect(itemShares[OC.Share.SHARE_TYPE_GROUP]).not.toBeDefined(); + expect(itemShares[OC.Share.SHARE_TYPE_LINK]).not.toBeDefined(); + }); + it('triggers "sharesChanged" event when deleting shares', function() { + $('#dropdown .unshare:eq(0)').click(); + fakeServer.requests[0].respond( + 200, + { 'Content-Type': 'application/json' }, + JSON.stringify({status: 'success'}) + ); + expect(handler.calledOnce).toEqual(true); + var itemShares = handler.getCall(0).args[0].itemShares; + expect(itemShares).toBeDefined(); + expect(itemShares[OC.Share.SHARE_TYPE_USER]).toEqual([]); + expect(itemShares[OC.Share.SHARE_TYPE_GROUP]).not.toBeDefined(); + expect(itemShares[OC.Share.SHARE_TYPE_LINK]).not.toBeDefined(); + }); + it('triggers "sharesChanged" event when toggling link share', function() { + // simulate autocomplete selection + $('#dropdown #linkCheckbox').click(); + fakeServer.requests[0].respond( + 200, + { 'Content-Type': 'application/json' }, + JSON.stringify({status: 'success', data: { token: 'abc' }}) + ); + expect(handler.calledOnce).toEqual(true); + var itemShares = handler.getCall(0).args[0].itemShares; + expect(itemShares).toBeDefined(); + expect(itemShares[OC.Share.SHARE_TYPE_USER]).toEqual(['user1']); + expect(itemShares[OC.Share.SHARE_TYPE_GROUP]).not.toBeDefined(); + expect(itemShares[OC.Share.SHARE_TYPE_LINK]).toEqual(true); + + handler.reset(); + + // uncheck checkbox + $('#dropdown #linkCheckbox').click(); + fakeServer.requests[1].respond( + 200, + { 'Content-Type': 'application/json' }, + JSON.stringify({status: 'success'}) + ); + + expect(handler.calledOnce).toEqual(true); + itemShares = handler.getCall(0).args[0].itemShares; + expect(itemShares).toBeDefined(); + expect(itemShares[OC.Share.SHARE_TYPE_USER]).toEqual(['user1']); + expect(itemShares[OC.Share.SHARE_TYPE_GROUP]).not.toBeDefined(); + // currently inconsistent, removing share with link sets it to false + // instead of delete + expect(itemShares[OC.Share.SHARE_TYPE_LINK]).toBeFalsy(); + //expect(itemShares[OC.Share.SHARE_TYPE_LINK]).not.toBeDefined(); + }); + }); }); }); |