diff options
author | Vincent Petry <pvince81@owncloud.com> | 2014-05-21 12:54:34 +0200 |
---|---|---|
committer | Vincent Petry <pvince81@owncloud.com> | 2014-05-30 10:06:29 +0200 |
commit | 1d9129eac35b49a4e8d0d642a68d7d634f31c905 (patch) | |
tree | 513bdd46bb2e557bbac678aff73d1766b8e3c9c6 /apps/files_sharing | |
parent | 6fbf4d8548133dff4419e5e2e0c649f49e177669 (diff) | |
download | nextcloud-server-1d9129eac35b49a4e8d0d642a68d7d634f31c905.tar.gz nextcloud-server-1d9129eac35b49a4e8d0d642a68d7d634f31c905.zip |
Sharing overview fixes and unit tests
- Fixed renaming and fileActionsReady event
- Added unit tests for shares list
- Fixed public page with defer
- Fixed file actions in sharing overview
- Fixed sharing counterpart list (10 entries max)
- Fixed file path attribute to be used in download action
- Fix sharing list headers
- OC.Share icons now operate on fileList instance
- Fix OC.Share.updateIcon when more than one list in DOM
Diffstat (limited to 'apps/files_sharing')
-rw-r--r-- | apps/files_sharing/js/app.js | 29 | ||||
-rw-r--r-- | apps/files_sharing/js/public.js | 5 | ||||
-rw-r--r-- | apps/files_sharing/js/share.js | 9 | ||||
-rw-r--r-- | apps/files_sharing/js/sharedfilelist.js | 56 | ||||
-rw-r--r-- | apps/files_sharing/templates/list.php | 4 | ||||
-rw-r--r-- | apps/files_sharing/tests/js/appSpec.js | 140 | ||||
-rw-r--r-- | apps/files_sharing/tests/js/sharedfilelistSpec.js | 417 |
7 files changed, 634 insertions, 26 deletions
diff --git a/apps/files_sharing/js/app.js b/apps/files_sharing/js/app.js index 7a71684f1a1..3764328a5d0 100644 --- a/apps/files_sharing/js/app.js +++ b/apps/files_sharing/js/app.js @@ -16,7 +16,7 @@ OCA.Sharing.App = { initSharingIn: function($el) { if (this._inFileList) { - return; + return this._inFileList; } this._inFileList = new OCA.Sharing.FileList( @@ -31,11 +31,12 @@ OCA.Sharing.App = { this._extendFileList(this._inFileList); this._inFileList.appName = t('files_sharing', 'Shared with you'); this._inFileList.$el.find('#emptycontent').text(t('files_sharing', 'No files have been shared with you yet.')); + return this._inFileList; }, initSharingOut: function($el) { if (this._outFileList) { - return; + return this._outFileList; } this._outFileList = new OCA.Sharing.FileList( $el, @@ -49,6 +50,19 @@ OCA.Sharing.App = { this._extendFileList(this._outFileList); this._outFileList.appName = t('files_sharing', 'Shared with others'); this._outFileList.$el.find('#emptycontent').text(t('files_sharing', 'You haven\'t shared any files yet.')); + return this._outFileList; + }, + + removeSharingIn: function() { + if (this._inFileList) { + this._inFileList.$fileList.empty(); + } + }, + + removeSharingOut: function() { + if (this._outFileList) { + this._outFileList.$fileList.empty(); + } }, _createFileActions: function() { @@ -56,6 +70,7 @@ OCA.Sharing.App = { var fileActions = new OCA.Files.FileActions(); // note: not merging the legacy actions because legacy apps are not // compatible with the sharing overview and need to be adapted first + fileActions.registerDefaultActions(); fileActions.merge(OCA.Files.fileActions); // when the user clicks on a folder, redirect to the corresponding @@ -75,11 +90,17 @@ OCA.Sharing.App = { }; $(document).ready(function() { - $('#app-content-sharingin').one('show', function(e) { + $('#app-content-sharingin').on('show', function(e) { OCA.Sharing.App.initSharingIn($(e.target)); }); - $('#app-content-sharingout').one('show', function(e) { + $('#app-content-sharingin').on('hide', function() { + OCA.Sharing.App.removeSharingIn(); + }); + $('#app-content-sharingout').on('show', function(e) { OCA.Sharing.App.initSharingOut($(e.target)); }); + $('#app-content-sharingout').on('hide', function() { + OCA.Sharing.App.removeSharingOut(); + }); }); diff --git a/apps/files_sharing/js/public.js b/apps/files_sharing/js/public.js index 446f3f2442b..27e8d361ff9 100644 --- a/apps/files_sharing/js/public.js +++ b/apps/files_sharing/js/public.js @@ -166,7 +166,10 @@ OCA.Sharing.PublicApp = { $(document).ready(function() { var App = OCA.Sharing.PublicApp; - App.initialize($('#preview')); + // defer app init, to give a chance to plugins to register file actions + _.defer(function() { + App.initialize($('#preview')); + }); if (window.Files) { // HACK: for oc-dialogs previews that depends on Files: diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js index 1fcb1f088bf..5a42604c866 100644 --- a/apps/files_sharing/js/share.js +++ b/apps/files_sharing/js/share.js @@ -28,10 +28,11 @@ $(document).ready(function() { } // use delegate to catch the case with multiple file lists - $('#content').delegate('#fileList', 'fileActionsReady',function(){ + $('#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); @@ -59,16 +60,16 @@ $(document).ready(function() { return $result; }); } - }) + }); if (!OCA.Sharing.sharesLoaded){ - OC.Share.loadIcons('file', $fileList); + 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); + OC.Share.updateIcons('file', fileList); } }); diff --git a/apps/files_sharing/js/sharedfilelist.js b/apps/files_sharing/js/sharedfilelist.js index 4508de47dcc..b941722d0cf 100644 --- a/apps/files_sharing/js/sharedfilelist.js +++ b/apps/files_sharing/js/sharedfilelist.js @@ -43,10 +43,9 @@ var $tr = OCA.Files.FileList.prototype._createRow.apply(this, arguments); $tr.find('.filesize').remove(); var $sharedWith = $('<td class="sharedWith"></td>') - .text(fileData.shareColumnInfo); + .text(fileData.counterParts.join(', ')); $tr.find('td.date').before($sharedWith); $tr.find('td.filename input:checkbox').remove(); - $tr.attr('data-path', fileData.path); $tr.attr('data-share-id', _.pluck(fileData.shares, 'id').join(',')); return $tr; }, @@ -74,7 +73,12 @@ }, getDirectoryPermissions: function() { - return OC.PERMISSION_READ; + return OC.PERMISSION_READ | OC.PERMISSION_DELETE; + }, + + updateStorageStatistics: function() { + // no op because it doesn't have + // storage info like free space / used space }, reload: function() { @@ -128,16 +132,16 @@ var self = this; // OCS API uses non-camelcased names var files = _.chain(data) - // cOnvert share data to file data + // convert share data to file data .map(function(share) { /* jshint camelcase: false */ var file = { id: share.file_source, - mtime: share.stime * 1000, mimetype: share.mimetype }; if (share.item_type === 'folder') { file.type = 'dir'; + file.mimetype = 'httpd/unix-directory'; } else { file.type = 'file'; @@ -150,7 +154,8 @@ file.share = { id: share.id, type: share.share_type, - target: share.share_with + target: share.share_with, + stime: share.stime * 1000, }; if (self._sharedWithUser) { file.share.ownerDisplayName = share.displayname_owner; @@ -173,28 +178,49 @@ // inside the same file object (by file id). .reduce(function(memo, file) { var data = memo[file.id]; + var counterPart = file.share.ownerDisplayName || file.share.targetDisplayName; if (!data) { data = memo[file.id] = file; data.shares = [file.share]; + // using a hash to make them unique, + // this is only a list to be displayed + data.counterParts = {}; + // counter is cheaper than calling _.keys().length + data.counterPartsCount = 0; + data.mtime = file.share.stime; } else { + // always take the most recent stime + if (file.share.stime > data.mtime) { + data.mtime = file.share.stime; + } data.shares.push(file.share); } - // format the share column info output string - if (!data.shareColumnInfo) { - data.shareColumnInfo = ''; - } - else { - data.shareColumnInfo += ', '; + + if (file.share.type === OC.Share.SHARE_TYPE_LINK) { + data.hasLinkShare = true; + } else if (counterPart && data.counterPartsCount < 10) { + // limit counterparts for output + data.counterParts[counterPart] = true; + data.counterPartsCount++; } - // TODO. more accurate detection of name based on type - // TODO: maybe better formatting, like "link + 3 users" when more than 1 user - data.shareColumnInfo += (file.share.ownerDisplayName || file.share.targetDisplayName || 'link'); + delete file.share; return memo; }, {}) // Retrieve only the values of the returned hash .values() + // Clean up + .each(function(data) { + // convert the counterParts map to a flat + // array of sorted names + data.counterParts = _.chain(data.counterParts).keys().sort().value(); + if (data.hasLinkShare) { + data.counterParts.unshift(t('files_sharing', 'link')); + delete data.hasLinkShare; + } + delete data.counterPartsCount; + }) // Sort by expected sort comparator .sortBy(this._sortComparator) // Finish the chain by getting the result diff --git a/apps/files_sharing/templates/list.php b/apps/files_sharing/templates/list.php index c688dcf8764..b07222cfe28 100644 --- a/apps/files_sharing/templates/list.php +++ b/apps/files_sharing/templates/list.php @@ -16,11 +16,11 @@ <a class="name sort columntitle" data-sort="name"><span><?php p($l->t( 'Name' )); ?></span><span class="sort-indicator"></span></a> </div> </th> - <th id="headerSharedWith" class="hidden column-mtime"> + <th id="headerSharedWith" class="hidden column-counterpart"> <a id="sharedwith" class="columntitle" data-sort="shareWith"><span><?php p($l->t( 'Shared with' )); ?></span><span class="sort-indicator"></span></a> </th> <th id="headerDate" class="hidden column-mtime"> - <a id="modified" class="columntitle" data-sort="mtime"><span><?php p($l->t( 'Shared since' )); ?></span><span class="sort-indicator"></span></a> + <a id="modified" class="columntitle" data-sort="mtime"><span><?php p($l->t( 'Share time' )); ?></span><span class="sort-indicator"></span></a> </th> </tr> </thead> diff --git a/apps/files_sharing/tests/js/appSpec.js b/apps/files_sharing/tests/js/appSpec.js new file mode 100644 index 00000000000..09c48a6305c --- /dev/null +++ b/apps/files_sharing/tests/js/appSpec.js @@ -0,0 +1,140 @@ +/** +* ownCloud +* +* @author Vincent Petry +* @copyright 2014 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.Sharing.App tests', function() { + var App = OCA.Sharing.App; + var fileListIn; + var fileListOut; + + beforeEach(function() { + $('#testArea').append( + '<div id="app-navigation">' + + '<ul><li data-id="files"><a>Files</a></li>' + + '<li data-id="sharingin"><a></a></li>' + + '<li data-id="sharingout"><a></a></li>' + + '</ul></div>' + + '<div id="app-content">' + + '<div id="app-content-files" class="hidden">' + + '</div>' + + '<div id="app-content-sharingin" class="hidden">' + + '</div>' + + '<div id="app-content-sharingout" class="hidden">' + + '</div>' + + '</div>' + + '</div>' + ); + fileListIn = App.initSharingIn($('#app-content-sharingin')); + fileListOut = App.initSharingOut($('#app-content-sharingout')); + }); + afterEach(function() { + App._inFileList = null; + App._outFileList = null; + fileListIn = null; + fileListOut = null; + }); + + describe('initialization', function() { + it('inits sharing-in list on show', function() { + expect(fileListIn._sharedWithUser).toEqual(true); + }); + it('inits sharing-out list on show', function() { + expect(fileListOut._sharedWithUser).toBeFalsy(); + }); + }); + describe('file actions', function() { + it('provides default file actions', function() { + _.each([fileListIn, fileListOut], function(fileList) { + var fileActions = fileList.fileActions; + + expect(fileActions.actions.all).toBeDefined(); + expect(fileActions.actions.all.Delete).toBeDefined(); + expect(fileActions.actions.all.Rename).toBeDefined(); + expect(fileActions.actions.file.Download).toBeDefined(); + + expect(fileActions.defaults.dir).toEqual('Open'); + }); + }); + it('provides custom file actions', function() { + var actionStub = sinon.stub(); + // regular file action + OCA.Files.fileActions.register( + 'all', + 'RegularTest', + OC.PERMISSION_READ, + OC.imagePath('core', 'actions/shared'), + actionStub + ); + + App._inFileList = null; + fileListIn = App.initSharingIn($('#app-content-sharingin')); + + expect(fileListIn.fileActions.actions.all.RegularTest).toBeDefined(); + }); + it('does not provide legacy file actions', function() { + var actionStub = sinon.stub(); + // legacy file action + window.FileActions.register( + 'all', + 'LegacyTest', + OC.PERMISSION_READ, + OC.imagePath('core', 'actions/shared'), + actionStub + ); + + App._inFileList = null; + fileListIn = App.initSharingIn($('#app-content-sharingin')); + + expect(fileListIn.fileActions.actions.all.LegacyTest).not.toBeDefined(); + }); + it('redirects to files app when opening a directory', function() { + var oldList = OCA.Files.App.fileList; + // dummy new list to make sure it exists + OCA.Files.App.fileList = new OCA.Files.FileList($('<table><thead></thead><tbody></tbody></table>')); + + var setActiveViewStub = sinon.stub(OCA.Files.App, 'setActiveView'); + // create dummy table so we can click the dom + var $table = '<table><thead></thead><tbody id="fileList"></tbody></table>'; + $('#app-content-sharingin').append($table); + + App._inFileList = null; + fileListIn = App.initSharingIn($('#app-content-sharingin')); + + fileListIn.setFiles([{ + name: 'testdir', + type: 'dir', + path: '/somewhere/inside/subdir', + counterParts: ['user2'] + }]); + + fileListIn.findFileEl('testdir').find('td a.name').click(); + + expect(OCA.Files.App.fileList.getCurrentDirectory()).toEqual('/somewhere/inside/subdir/testdir'); + + expect(setActiveViewStub.calledOnce).toEqual(true); + expect(setActiveViewStub.calledWith('files')).toEqual(true); + + setActiveViewStub.restore(); + + // restore old list + OCA.Files.App.fileList = oldList; + }); + }); +}); diff --git a/apps/files_sharing/tests/js/sharedfilelistSpec.js b/apps/files_sharing/tests/js/sharedfilelistSpec.js new file mode 100644 index 00000000000..ddcd746afe0 --- /dev/null +++ b/apps/files_sharing/tests/js/sharedfilelistSpec.js @@ -0,0 +1,417 @@ +/* + * Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com> + * + * This file is licensed under the Affero General Public License version 3 + * or later. + * + * See the COPYING-README file. + * + */ + +describe('OCA.Sharing.FileList tests', function() { + var testFiles, alertStub, notificationStub, fileList; + + beforeEach(function() { + alertStub = sinon.stub(OC.dialogs, 'alert'); + notificationStub = sinon.stub(OC.Notification, 'show'); + + // init parameters and test table elements + $('#testArea').append( + '<div id="app-content-container">' + + // init horrible parameters + '<input type="hidden" id="dir" value="/"></input>' + + '<input type="hidden" id="permissions" value="31"></input>' + + // dummy controls + '<div id="controls">' + + ' <div class="actions creatable"></div>' + + ' <div class="notCreatable"></div>' + + '</div>' + + // dummy table + // TODO: at some point this will be rendered by the fileList class itself! + '<table id="filestable">' + + '<thead><tr>' + + '<th id="headerName" class="hidden column-name">' + + '<input type="checkbox" id="select_all_files" class="select-all">' + + '<a class="name columntitle" data-sort="name"><span>Name</span><span class="sort-indicator"></span></a>' + + '<span class="selectedActions hidden">' + + '</th>' + + '<th class="hidden column-mtime">' + + '<a class="columntitle" data-sort="mtime"><span class="sort-indicator"></span></a>' + + '</th>' + + '</tr></thead>' + + '<tbody id="fileList"></tbody>' + + '<tfoot></tfoot>' + + '</table>' + + '<div id="emptycontent">Empty content message</div>' + + '</div>' + ); + }); + afterEach(function() { + testFiles = undefined; + fileList = undefined; + + notificationStub.restore(); + alertStub.restore(); + }); + + describe('loading file list for incoming shares', function() { + var ocsResponse; + + beforeEach(function() { + fileList = new OCA.Sharing.FileList( + $('#app-content-container'), { + sharedWithUser: true + } + ); + + fileList.reload(); + + /* jshint camelcase: false */ + ocsResponse = { + ocs: { + meta: { + status: 'ok', + statuscode: 100, + message: null + }, + data: [{ + id: 7, + item_type: 'file', + item_source: 49, + item_target: '/49', + file_source: 49, + file_target: '/local path/local name.txt', + path: 'files/something shared.txt', + permissions: 31, + stime: 11111, + share_type: OC.Share.SHARE_TYPE_USER, + share_with: 'user1', + share_with_displayname: 'User One', + mimetype: 'text/plain', + uid_owner: 'user2', + displayname_owner: 'User Two' + }] + } + }; + }); + it('render file shares', function() { + var request; + + expect(fakeServer.requests.length).toEqual(1); + request = fakeServer.requests[0]; + expect(request.url).toEqual( + OC.linkToOCS('apps/files_sharing/api/v1') + + 'shares?format=json&shared_with_me=true' + ); + + fakeServer.requests[0].respond( + 200, + { 'Content-Type': 'application/json' }, + JSON.stringify(ocsResponse) + ); + + var $rows = fileList.$el.find('tbody tr'); + var $tr = $rows.eq(0); + expect($rows.length).toEqual(1); + expect($tr.attr('data-id')).toEqual('49'); + expect($tr.attr('data-type')).toEqual('file'); + expect($tr.attr('data-file')).toEqual('local name.txt'); + expect($tr.attr('data-path')).toEqual('/local path'); + expect($tr.attr('data-size')).not.toBeDefined(); + expect($tr.attr('data-permissions')).toEqual('31'); // read and delete + expect($tr.attr('data-mime')).toEqual('text/plain'); + expect($tr.attr('data-mtime')).toEqual('11111000'); + expect($tr.attr('data-share-id')).toEqual('7'); + expect($tr.find('a.name').attr('href')).toEqual( + OC.webroot + + '/index.php/apps/files/ajax/download.php' + + '?dir=%2Flocal%20path&files=local%20name.txt' + ); + expect($tr.find('td.sharedWith').text()).toEqual('User Two'); + + expect($tr.find('.nametext').text().trim()).toEqual('local name.txt'); + }); + it('render folder shares', function() { + /* jshint camelcase: false */ + var request; + ocsResponse.ocs.data[0] = _.extend(ocsResponse.ocs.data[0], { + item_type: 'folder', + file_target: '/local path/local name', + path: 'files/something shared', + }); + + expect(fakeServer.requests.length).toEqual(1); + request = fakeServer.requests[0]; + expect(request.url).toEqual( + OC.linkToOCS('apps/files_sharing/api/v1') + + 'shares?format=json&shared_with_me=true' + ); + + fakeServer.requests[0].respond( + 200, + { 'Content-Type': 'application/json' }, + JSON.stringify(ocsResponse) + ); + + var $rows = fileList.$el.find('tbody tr'); + var $tr = $rows.eq(0); + expect($rows.length).toEqual(1); + expect($tr.attr('data-id')).toEqual('49'); + expect($tr.attr('data-type')).toEqual('dir'); + expect($tr.attr('data-file')).toEqual('local name'); + expect($tr.attr('data-path')).toEqual('/local path'); + expect($tr.attr('data-size')).not.toBeDefined(); + expect($tr.attr('data-permissions')).toEqual('31'); // read and delete + expect($tr.attr('data-mime')).toEqual('httpd/unix-directory'); + expect($tr.attr('data-mtime')).toEqual('11111000'); + expect($tr.attr('data-share-id')).toEqual('7'); + expect($tr.find('a.name').attr('href')).toEqual( + OC.webroot + + '/index.php/apps/files' + + '?dir=/local%20path/local%20name' + ); + expect($tr.find('td.sharedWith').text()).toEqual('User Two'); + + expect($tr.find('.nametext').text().trim()).toEqual('local name'); + }); + }); + describe('loading file list for outgoing shares', function() { + var ocsResponse; + + beforeEach(function() { + fileList = new OCA.Sharing.FileList( + $('#app-content-container'), { + sharedWithUser: false + } + ); + + fileList.reload(); + + /* jshint camelcase: false */ + ocsResponse = { + ocs: { + meta: { + status: 'ok', + statuscode: 100, + message: null + }, + data: [{ + id: 7, + item_type: 'file', + item_source: 49, + file_source: 49, + path: '/local path/local name.txt', + permissions: 27, + stime: 11111, + share_type: OC.Share.SHARE_TYPE_USER, + share_with: 'user2', + share_with_displayname: 'User Two', + mimetype: 'text/plain', + uid_owner: 'user1', + displayname_owner: 'User One' + }] + } + }; + }); + it('render file shares', function() { + var request; + + expect(fakeServer.requests.length).toEqual(1); + request = fakeServer.requests[0]; + expect(request.url).toEqual( + OC.linkToOCS('apps/files_sharing/api/v1') + + 'shares?format=json&shared_with_me=false' + ); + + fakeServer.requests[0].respond( + 200, + { 'Content-Type': 'application/json' }, + JSON.stringify(ocsResponse) + ); + + var $rows = fileList.$el.find('tbody tr'); + var $tr = $rows.eq(0); + expect($rows.length).toEqual(1); + expect($tr.attr('data-id')).toEqual('49'); + expect($tr.attr('data-type')).toEqual('file'); + expect($tr.attr('data-file')).toEqual('local name.txt'); + expect($tr.attr('data-path')).toEqual('/local path'); + expect($tr.attr('data-size')).not.toBeDefined(); + expect($tr.attr('data-permissions')).toEqual('31'); // read and delete + expect($tr.attr('data-mime')).toEqual('text/plain'); + expect($tr.attr('data-mtime')).toEqual('11111000'); + expect($tr.attr('data-share-id')).toEqual('7'); + expect($tr.find('a.name').attr('href')).toEqual( + OC.webroot + + '/index.php/apps/files/ajax/download.php' + + '?dir=%2Flocal%20path&files=local%20name.txt' + ); + expect($tr.find('td.sharedWith').text()).toEqual('User Two'); + + expect($tr.find('.nametext').text().trim()).toEqual('local name.txt'); + }); + it('render folder shares', function() { + var request; + /* jshint camelcase: false */ + ocsResponse.ocs.data[0] = _.extend(ocsResponse.ocs.data[0], { + item_type: 'folder', + path: '/local path/local name', + }); + + expect(fakeServer.requests.length).toEqual(1); + request = fakeServer.requests[0]; + expect(request.url).toEqual( + OC.linkToOCS('apps/files_sharing/api/v1') + + 'shares?format=json&shared_with_me=false' + ); + + fakeServer.requests[0].respond( + 200, + { 'Content-Type': 'application/json' }, + JSON.stringify(ocsResponse) + ); + + var $rows = fileList.$el.find('tbody tr'); + var $tr = $rows.eq(0); + expect($rows.length).toEqual(1); + expect($tr.attr('data-id')).toEqual('49'); + expect($tr.attr('data-type')).toEqual('dir'); + expect($tr.attr('data-file')).toEqual('local name'); + expect($tr.attr('data-path')).toEqual('/local path'); + expect($tr.attr('data-size')).not.toBeDefined(); + expect($tr.attr('data-permissions')).toEqual('31'); // read and delete + expect($tr.attr('data-mime')).toEqual('httpd/unix-directory'); + expect($tr.attr('data-mtime')).toEqual('11111000'); + expect($tr.attr('data-share-id')).toEqual('7'); + expect($tr.find('a.name').attr('href')).toEqual( + OC.webroot + + '/index.php/apps/files' + + '?dir=/local%20path/local%20name' + ); + expect($tr.find('td.sharedWith').text()).toEqual('User Two'); + + expect($tr.find('.nametext').text().trim()).toEqual('local name'); + }); + it('render link shares', function() { + /* jshint camelcase: false */ + var request; + ocsResponse.ocs.data[0] = { + id: 7, + item_type: 'file', + item_source: 49, + file_source: 49, + path: '/local path/local name.txt', + permissions: 1, + stime: 11111, + share_type: OC.Share.SHARE_TYPE_LINK, + share_with: null, + token: 'abc', + mimetype: 'text/plain', + uid_owner: 'user1', + displayname_owner: 'User One' + }; + expect(fakeServer.requests.length).toEqual(1); + request = fakeServer.requests[0]; + expect(request.url).toEqual( + OC.linkToOCS('apps/files_sharing/api/v1') + + 'shares?format=json&shared_with_me=false' + ); + + fakeServer.requests[0].respond( + 200, + { 'Content-Type': 'application/json' }, + JSON.stringify(ocsResponse) + ); + + var $rows = fileList.$el.find('tbody tr'); + var $tr = $rows.eq(0); + expect($rows.length).toEqual(1); + expect($tr.attr('data-id')).toEqual('49'); + expect($tr.attr('data-type')).toEqual('file'); + expect($tr.attr('data-file')).toEqual('local name.txt'); + expect($tr.attr('data-path')).toEqual('/local path'); + expect($tr.attr('data-size')).not.toBeDefined(); + expect($tr.attr('data-permissions')).toEqual('31'); // read and delete + expect($tr.attr('data-mime')).toEqual('text/plain'); + expect($tr.attr('data-mtime')).toEqual('11111000'); + expect($tr.attr('data-share-id')).toEqual('7'); + expect($tr.find('a.name').attr('href')).toEqual( + OC.webroot + + '/index.php/apps/files/ajax/download.php' + + '?dir=%2Flocal%20path&files=local%20name.txt'); + expect($tr.find('td.sharedWith').text()).toEqual('link'); + + expect($tr.find('.nametext').text().trim()).toEqual('local name.txt'); + }); + it('groups link shares with regular shares', function() { + /* jshint camelcase: false */ + var request; + // link share + ocsResponse.ocs.data.push({ + id: 8, + item_type: 'file', + item_source: 49, + file_source: 49, + path: '/local path/local name.txt', + permissions: 1, + stime: 11111, + share_type: OC.Share.SHARE_TYPE_LINK, + share_with: null, + token: 'abc', + mimetype: 'text/plain', + uid_owner: 'user1', + displayname_owner: 'User One' + }); + // another share of the same file + ocsResponse.ocs.data.push({ + id: 9, + item_type: 'file', + item_source: 49, + file_source: 49, + path: '/local path/local name.txt', + permissions: 27, + stime: 22222, + share_type: OC.Share.SHARE_TYPE_USER, + share_with: 'user3', + share_with_displayname: 'User Three', + mimetype: 'text/plain', + uid_owner: 'user1', + displayname_owner: 'User One' + }); + expect(fakeServer.requests.length).toEqual(1); + request = fakeServer.requests[0]; + expect(request.url).toEqual( + OC.linkToOCS('apps/files_sharing/api/v1') + + 'shares?format=json&shared_with_me=false' + ); + + fakeServer.requests[0].respond( + 200, + { 'Content-Type': 'application/json' }, + JSON.stringify(ocsResponse) + ); + + var $rows = fileList.$el.find('tbody tr'); + var $tr = $rows.eq(0); + expect($rows.length).toEqual(1); + expect($tr.attr('data-id')).toEqual('49'); + expect($tr.attr('data-type')).toEqual('file'); + expect($tr.attr('data-file')).toEqual('local name.txt'); + expect($tr.attr('data-path')).toEqual('/local path'); + expect($tr.attr('data-size')).not.toBeDefined(); + expect($tr.attr('data-permissions')).toEqual('31'); // read and delete + expect($tr.attr('data-mime')).toEqual('text/plain'); + // always use the most recent stime + expect($tr.attr('data-mtime')).toEqual('22222000'); + expect($tr.attr('data-share-id')).toEqual('7,8,9'); + expect($tr.find('a.name').attr('href')).toEqual( + OC.webroot + + '/index.php/apps/files/ajax/download.php' + + '?dir=%2Flocal%20path&files=local%20name.txt' + ); + expect($tr.find('td.sharedWith').text()).toEqual('link, User Three, User Two'); + + expect($tr.find('.nametext').text().trim()).toEqual('local name.txt'); + }); + }); +}); |