summaryrefslogtreecommitdiffstats
path: root/apps/files_sharing
diff options
context:
space:
mode:
authorVincent Petry <pvince81@owncloud.com>2014-05-21 12:54:34 +0200
committerVincent Petry <pvince81@owncloud.com>2014-05-30 10:06:29 +0200
commit1d9129eac35b49a4e8d0d642a68d7d634f31c905 (patch)
tree513bdd46bb2e557bbac678aff73d1766b8e3c9c6 /apps/files_sharing
parent6fbf4d8548133dff4419e5e2e0c649f49e177669 (diff)
downloadnextcloud-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.js29
-rw-r--r--apps/files_sharing/js/public.js5
-rw-r--r--apps/files_sharing/js/share.js9
-rw-r--r--apps/files_sharing/js/sharedfilelist.js56
-rw-r--r--apps/files_sharing/templates/list.php4
-rw-r--r--apps/files_sharing/tests/js/appSpec.js140
-rw-r--r--apps/files_sharing/tests/js/sharedfilelistSpec.js417
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');
+ });
+ });
+});