diff options
author | Vincent Petry <pvince81@owncloud.com> | 2016-01-22 17:30:18 +0100 |
---|---|---|
committer | Vincent Petry <pvince81@owncloud.com> | 2016-01-28 15:25:34 +0100 |
commit | b063ddb05b71988d92fe140ca003ad58301cfcc8 (patch) | |
tree | febf5d75ec2f5c4d4759d0ab2ad12523ea66a0a6 /core/js/tests | |
parent | 476720ada9f0997bdef7407f8ef15c2c50866011 (diff) | |
download | nextcloud-server-b063ddb05b71988d92fe140ca003ad58301cfcc8.tar.gz nextcloud-server-b063ddb05b71988d92fe140ca003ad58301cfcc8.zip |
Share dialog use OCS API
Diffstat (limited to 'core/js/tests')
-rw-r--r-- | core/js/tests/specs/sharedialogshareelistview.js | 10 | ||||
-rw-r--r-- | core/js/tests/specs/sharedialogviewSpec.js | 238 | ||||
-rw-r--r-- | core/js/tests/specs/shareitemmodelSpec.js | 468 |
3 files changed, 432 insertions, 284 deletions
diff --git a/core/js/tests/specs/sharedialogshareelistview.js b/core/js/tests/specs/sharedialogshareelistview.js index 44611d0d964..cef97469753 100644 --- a/core/js/tests/specs/sharedialogshareelistview.js +++ b/core/js/tests/specs/sharedialogshareelistview.js @@ -27,7 +27,7 @@ describe('OC.Share.ShareDialogShareeListView', function () { var configModel; var shareModel; var listView; - var setPermissionsStub; + var updateShareStub; beforeEach(function () { /* jshint camelcase:false */ @@ -81,7 +81,7 @@ describe('OC.Share.ShareDialogShareeListView', function () { oldCurrentUser = OC.currentUser; OC.currentUser = 'user0'; - setPermissionsStub = sinon.stub(listView.model, 'setPermissions'); + updateShareStub = sinon.stub(OC.Share.ShareItemModel.prototype, 'updateShare'); }); afterEach(function () { @@ -89,7 +89,7 @@ describe('OC.Share.ShareDialogShareeListView', function () { /* jshint camelcase:false */ oc_appconfig.core = oldAppConfig; listView.remove(); - setPermissionsStub.restore(); + updateShareStub.restore(); }); describe('Manages checkbox events correctly', function () { @@ -105,7 +105,7 @@ describe('OC.Share.ShareDialogShareeListView', function () { listView.render(); listView.$el.find("input[name='edit']").click(); expect(listView.$el.find("input[name='update']").is(':checked')).toEqual(true); - expect(setPermissionsStub.called).toEqual(true); + expect(updateShareStub.calledOnce).toEqual(true); }); it('Checks edit box when create/update/delete are checked', function () { @@ -120,7 +120,7 @@ describe('OC.Share.ShareDialogShareeListView', function () { listView.render(); listView.$el.find("input[name='update']").click(); expect(listView.$el.find("input[name='edit']").is(':checked')).toEqual(true); - expect(setPermissionsStub.called).toEqual(true); + expect(updateShareStub.calledOnce).toEqual(true); }); it('shows cruds checkboxes when toggled', function () { diff --git a/core/js/tests/specs/sharedialogviewSpec.js b/core/js/tests/specs/sharedialogviewSpec.js index 63cfe5299ae..6899e625c45 100644 --- a/core/js/tests/specs/sharedialogviewSpec.js +++ b/core/js/tests/specs/sharedialogviewSpec.js @@ -28,8 +28,10 @@ describe('OC.Share.ShareDialogView', function() { var avatarStub; var placeholderStub; var oldCurrentUser; + var saveLinkShareStub; var fetchStub; + var notificationStub; var configModel; var shareModel; @@ -46,6 +48,7 @@ describe('OC.Share.ShareDialogView', function() { oc_appconfig.core.enforcePasswordForPublicLink = false; fetchStub = sinon.stub(OC.Share.ShareItemModel.prototype, 'fetch'); + saveLinkShareStub = sinon.stub(OC.Share.ShareItemModel.prototype, 'saveLinkShare'); fileInfoModel = new OCA.Files.FileInfoModel({ id: 123, @@ -116,6 +119,7 @@ describe('OC.Share.ShareDialogView', function() { dialog.remove(); fetchStub.restore(); + saveLinkShareStub.restore(); autocompleteStub.restore(); avatarStub.restore(); @@ -128,55 +132,32 @@ describe('OC.Share.ShareDialogView', function() { it('update password on focus out', function() { $('#allowShareWithLink').val('yes'); + dialog.model.set('linkShare', { + isLinkShare: true + }); dialog.render(); - // Toggle linkshare - dialog.$el.find('.linkCheckbox').click(); - fakeServer.requests[0].respond( - 200, - { 'Content-Type': 'application/json' }, - JSON.stringify({data: {token: 'xyz'}, status: 'success'}) - ); - // Enable password, enter password and focusout dialog.$el.find('[name=showPassword]').click(); dialog.$el.find('.linkPassText').focus(); dialog.$el.find('.linkPassText').val('foo'); dialog.$el.find('.linkPassText').focusout(); - expect(fakeServer.requests[1].method).toEqual('POST'); - var body = OC.parseQueryString(fakeServer.requests[1].requestBody); - expect(body['shareWith[password]']).toEqual('foo'); - expect(body['shareWith[passwordChanged]']).toEqual('true'); - - fetchStub.reset(); - - // Set password response - fakeServer.requests[1].respond( - 200, - { 'Content-Type': 'application/json' }, - JSON.stringify({data: {token: 'xyz'}, status: 'success'}) - ); - - expect(fetchStub.calledOnce).toEqual(true); - // fetching the model will rerender the view - dialog.render(); - - expect(dialog.$el.find('.linkPassText').val()).toEqual(''); - expect(dialog.$el.find('.linkPassText').attr('placeholder')).toEqual('**********'); + expect(saveLinkShareStub.calledOnce).toEqual(true); + expect(saveLinkShareStub.firstCall.args[0]).toEqual({ + password: 'foo' + }); }); it('update password on enter', function() { $('#allowShareWithLink').val('yes'); + dialog.model.set('linkShare', { + isLinkShare: true + }); dialog.render(); // Toggle linkshare dialog.$el.find('.linkCheckbox').click(); - fakeServer.requests[0].respond( - 200, - { 'Content-Type': 'application/json' }, - JSON.stringify({data: {token: 'xyz'}, status: 'success'}) - ); // Enable password and enter password dialog.$el.find('[name=showPassword]').click(); @@ -184,26 +165,10 @@ describe('OC.Share.ShareDialogView', function() { dialog.$el.find('.linkPassText').val('foo'); dialog.$el.find('.linkPassText').trigger(new $.Event('keyup', {keyCode: 13})); - expect(fakeServer.requests[1].method).toEqual('POST'); - var body = OC.parseQueryString(fakeServer.requests[1].requestBody); - expect(body['shareWith[password]']).toEqual('foo'); - expect(body['shareWith[passwordChanged]']).toEqual('true'); - - fetchStub.reset(); - - // Set password response - fakeServer.requests[1].respond( - 200, - { 'Content-Type': 'application/json' }, - JSON.stringify({data: {token: 'xyz'}, status: 'success'}) - ); - - expect(fetchStub.calledOnce).toEqual(true); - // fetching the model will rerender the view - dialog.render(); - - expect(dialog.$el.find('.linkPassText').val()).toEqual(''); - expect(dialog.$el.find('.linkPassText').attr('placeholder')).toEqual('**********'); + expect(saveLinkShareStub.calledOnce).toEqual(true); + expect(saveLinkShareStub.firstCall.args[0]).toEqual({ + password: 'foo' + }); }); it('shows share with link checkbox when allowed', function() { $('#allowShareWithLink').val('yes'); @@ -241,16 +206,11 @@ describe('OC.Share.ShareDialogView', function() { it('autofocus link text when clicked', function() { $('#allowShareWithLink').val('yes'); + dialog.model.set('linkShare', { + isLinkShare: true + }); dialog.render(); - // Toggle linkshare - dialog.$el.find('.linkCheckbox').click(); - fakeServer.requests[0].respond( - 200, - { 'Content-Type': 'application/json' }, - JSON.stringify({data: {token: 'xyz'}, status: 'success'}) - ); - var focusStub = sinon.stub($.fn, 'focus'); var selectStub = sinon.stub($.fn, 'select'); dialog.$el.find('.linkText').click(); @@ -603,106 +563,6 @@ describe('OC.Share.ShareDialogView', function() { }); }); }); - describe('share permissions', function() { - beforeEach(function() { - oc_appconfig.core.resharingAllowed = true; - }); - - /** - * Tests sharing with the given possible permissions - * - * @param {int} possiblePermissions - * @return {int} permissions sent to the server - */ - function testWithPermissions(possiblePermissions) { - shareModel.set({ - permissions: possiblePermissions, - possiblePermissions: possiblePermissions - }); - dialog.render(); - var autocompleteOptions = autocompleteStub.getCall(0).args[0]; - // simulate autocomplete selection - autocompleteOptions.select(new $.Event('select'), { - item: { - label: 'User Two', - value: { - shareType: OC.Share.SHARE_TYPE_USER, - shareWith: 'user2' - } - } - }); - autocompleteStub.reset(); - var requestBody = OC.parseQueryString(_.last(fakeServer.requests).requestBody); - return parseInt(requestBody.permissions, 10); - } - - describe('regular sharing', function() { - it('shares with given permissions with default config', function() { - shareModel.set({ - reshare: {}, - shares: [] - }); - expect( - testWithPermissions(OC.PERMISSION_READ | OC.PERMISSION_UPDATE | OC.PERMISSION_SHARE) - ).toEqual(OC.PERMISSION_READ | OC.PERMISSION_UPDATE | OC.PERMISSION_SHARE); - expect( - testWithPermissions(OC.PERMISSION_READ | OC.PERMISSION_SHARE) - ).toEqual(OC.PERMISSION_READ | OC.PERMISSION_SHARE); - }); - it('removes share permission when not allowed', function() { - configModel.set('isResharingAllowed', false); - shareModel.set({ - reshare: {}, - shares: [] - }); - expect( - testWithPermissions(OC.PERMISSION_READ | OC.PERMISSION_UPDATE | OC.PERMISSION_SHARE) - ).toEqual(OC.PERMISSION_READ | OC.PERMISSION_UPDATE); - }); - it('automatically adds READ permission even when not specified', function() { - configModel.set('isResharingAllowed', false); - shareModel.set({ - reshare: {}, - shares: [] - }); - expect( - testWithPermissions(OC.PERMISSION_UPDATE | OC.PERMISSION_SHARE) - ).toEqual(OC.PERMISSION_READ | OC.PERMISSION_UPDATE | OC.PERMISSION_UPDATE); - }); - it('does not show sharing options when sharing not allowed', function() { - shareModel.set({ - reshare: {}, - shares: [], - permissions: OC.PERMISSION_READ - }); - dialog.render(); - expect(dialog.$el.find('.shareWithField').prop('disabled')).toEqual(true); - }); - it('shows reshare owner', function() { - shareModel.set({ - reshare: { - uid_owner: 'user1' - }, - shares: [], - permissions: OC.PERMISSION_READ - }); - dialog.render(); - expect(dialog.$el.find('.resharerInfoView .reshare').length).toEqual(1); - }); - it('does not show reshare owner if owner is current user', function() { - shareModel.set({ - reshare: { - uid_owner: OC.currentUser - }, - shares: [], - permissions: OC.PERMISSION_READ - }); - dialog.render(); - expect(dialog.$el.find('.resharerInfoView .reshare').length).toEqual(0); - }); - }); - }); - describe('remote sharing', function() { it('shows remote share info when allowed', function() { configModel.set({ @@ -1093,5 +953,61 @@ describe('OC.Share.ShareDialogView', function() { expect(el.hasClass('user')).toEqual(true); }); }); + + it('calls addShare after selection', function() { + dialog.render(); + var addShareStub = sinon.stub(shareModel, 'addShare'); + var autocompleteOptions = autocompleteStub.getCall(0).args[0]; + autocompleteOptions.select(new $.Event('select'), { + item: { + label: 'User Two', + value: { + shareType: OC.Share.SHARE_TYPE_USER, + shareWith: 'user2' + } + } + }); + + expect(addShareStub.calledOnce).toEqual(true); + expect(addShareStub.firstCall.args[0]).toEqual({ + shareType: OC.Share.SHARE_TYPE_USER, + shareWith: 'user2' + }); + + addShareStub.restore(); + }); + }); + describe('reshare permissions', function() { + it('does not show sharing options when sharing not allowed', function() { + shareModel.set({ + reshare: {}, + shares: [], + permissions: OC.PERMISSION_READ + }); + dialog.render(); + expect(dialog.$el.find('.shareWithField').prop('disabled')).toEqual(true); + }); + it('shows reshare owner', function() { + shareModel.set({ + reshare: { + uid_owner: 'user1' + }, + shares: [], + permissions: OC.PERMISSION_READ + }); + dialog.render(); + expect(dialog.$el.find('.resharerInfoView .reshare').length).toEqual(1); + }); + it('does not show reshare owner if owner is current user', function() { + shareModel.set({ + reshare: { + uid_owner: OC.currentUser + }, + shares: [], + permissions: OC.PERMISSION_READ + }); + dialog.render(); + expect(dialog.$el.find('.resharerInfoView .reshare').length).toEqual(0); + }); }); }); diff --git a/core/js/tests/specs/shareitemmodelSpec.js b/core/js/tests/specs/shareitemmodelSpec.js index 28daf860393..d696b159e47 100644 --- a/core/js/tests/specs/shareitemmodelSpec.js +++ b/core/js/tests/specs/shareitemmodelSpec.js @@ -21,14 +21,20 @@ /* global oc_appconfig */ describe('OC.Share.ShareItemModel', function() { - var loadItemStub; + var fetchSharesStub, fetchReshareStub; + var fetchSharesDeferred, fetchReshareDeferred; var fileInfoModel, configModel, model; var oldCurrentUser; beforeEach(function() { oldCurrentUser = OC.currentUser; - loadItemStub = sinon.stub(OC.Share, 'loadItem'); + fetchSharesDeferred = new $.Deferred(); + fetchSharesStub = sinon.stub(OC.Share.ShareItemModel.prototype, '_fetchShares') + .returns(fetchSharesDeferred.promise()); + fetchReshareDeferred = new $.Deferred(); + fetchReshareStub = sinon.stub(OC.Share.ShareItemModel.prototype, '_fetchReshare') + .returns(fetchReshareDeferred.promise()); fileInfoModel = new OCA.Files.FileInfoModel({ id: 123, @@ -52,27 +58,70 @@ describe('OC.Share.ShareItemModel', function() { }); }); afterEach(function() { - loadItemStub.restore(); + if (fetchSharesStub) { + fetchSharesStub.restore(); + } + if (fetchReshareStub) { + fetchReshareStub.restore(); + } OC.currentUser = oldCurrentUser; }); + function makeOcsResponse(data) { + return [{ + ocs: { + data: data + } + }]; + } + describe('Fetching and parsing', function() { - it('fetching calls loadItem with the correct arguments', function() { + it('fetches both outgoing shares and the current incoming share', function() { model.fetch(); - expect(loadItemStub.calledOnce).toEqual(true); - expect(loadItemStub.calledWith('file', 123)).toEqual(true); + expect(fetchSharesStub.calledOnce).toEqual(true); + expect(fetchReshareStub.calledOnce).toEqual(true); + }); + it('fetches shares for the current path', function() { + fetchSharesStub.restore(); + + model._fetchShares(); + + expect(fakeServer.requests.length).toEqual(1); + expect(fakeServer.requests[0].method).toEqual('GET'); + expect(fakeServer.requests[0].url).toEqual( + OC.linkToOCS('apps/files_sharing/api/v1', 2) + + 'shares?format=json&path=%2Fsubdir%2Fshared_file_name.txt&reshares=true' + ); + + fetchSharesStub = null; + }); + it('fetches reshare for the current path', function() { + fetchReshareStub.restore(); + + model._fetchReshare(); + + expect(fakeServer.requests.length).toEqual(1); + expect(fakeServer.requests[0].method).toEqual('GET'); + expect(fakeServer.requests[0].url).toEqual( + OC.linkToOCS('apps/files_sharing/api/v1', 2) + + 'shares?format=json&path=%2Fsubdir%2Fshared_file_name.txt&shared_with_me=true' + ); + + fetchReshareStub = null; }); it('populates attributes with parsed response', function() { - loadItemStub.yields({ - /* jshint camelcase: false */ - reshare: { + /* jshint camelcase: false */ + fetchReshareDeferred.resolve(makeOcsResponse([ + { share_type: OC.Share.SHARE_TYPE_USER, uid_owner: 'owner', displayname_owner: 'Owner', permissions: 31 - }, - shares: [{ + } + ])); + fetchSharesDeferred.resolve(makeOcsResponse([ + { id: 100, item_source: 123, permissions: 31, @@ -112,8 +161,9 @@ describe('OC.Share.ShareItemModel', function() { storage: 1, token: 'tehtoken', uid_owner: 'root' - }] - }); + } + ])); + model.fetch(); var shares = model.get('shares'); @@ -130,10 +180,9 @@ describe('OC.Share.ShareItemModel', function() { // TODO: check more attributes }); it('does not parse link share when for a different file', function() { - loadItemStub.yields({ - reshare: [], - /* jshint camelcase: false */ - shares: [{ + /* jshint camelcase: false */ + fetchReshareDeferred.resolve(makeOcsResponse([])); + fetchSharesDeferred.resolve(makeOcsResponse([{ displayname_owner: 'root', expiration: null, file_source: 456, @@ -152,7 +201,7 @@ describe('OC.Share.ShareItemModel', function() { token: 'tehtoken', uid_owner: 'root' }] - }); + )); model.fetch(); @@ -164,10 +213,9 @@ describe('OC.Share.ShareItemModel', function() { expect(linkShare.isLinkShare).toEqual(false); }); it('parses correct link share when a nested link share exists along with parent one', function() { - loadItemStub.yields({ - reshare: [], - /* jshint camelcase: false */ - shares: [{ + /* jshint camelcase: false */ + fetchReshareDeferred.resolve(makeOcsResponse([])); + fetchSharesDeferred.resolve(makeOcsResponse([{ displayname_owner: 'root', expiration: '2015-10-12 00:00:00', file_source: 123, @@ -204,7 +252,7 @@ describe('OC.Share.ShareItemModel', function() { token: 'anothertoken', uid_owner: 'root' }] - }); + )); model.fetch(); @@ -219,26 +267,26 @@ describe('OC.Share.ShareItemModel', function() { // TODO: check child too }); it('reduces reshare permissions to the ones from the original share', function() { - loadItemStub.yields({ - reshare: { - permissions: OC.PERMISSION_READ, - uid_owner: 'user1' - }, - shares: [] - }); + /* jshint camelcase: false */ + fetchReshareDeferred.resolve(makeOcsResponse([{ + id: 123, + permissions: OC.PERMISSION_READ, + uid_owner: 'user1' + }])); + fetchSharesDeferred.resolve(makeOcsResponse([])); model.fetch(); // no resharing allowed expect(model.get('permissions')).toEqual(OC.PERMISSION_READ); }); it('reduces reshare permissions to possible permissions', function() { - loadItemStub.yields({ - reshare: { - permissions: OC.PERMISSION_ALL, - uid_owner: 'user1' - }, - shares: [] - }); + /* jshint camelcase: false */ + fetchReshareDeferred.resolve(makeOcsResponse([{ + id: 123, + permissions: OC.PERMISSION_ALL, + uid_owner: 'user1' + }])); + fetchSharesDeferred.resolve(makeOcsResponse([])); model.set('possiblePermissions', OC.PERMISSION_READ); model.fetch(); @@ -248,10 +296,8 @@ describe('OC.Share.ShareItemModel', function() { }); it('allows owner to share their own share when they are also the recipient', function() { OC.currentUser = 'user1'; - loadItemStub.yields({ - reshare: {}, - shares: [] - }); + fetchReshareDeferred.resolve(makeOcsResponse([])); + fetchSharesDeferred.resolve(makeOcsResponse([])); model.fetch(); @@ -259,9 +305,9 @@ describe('OC.Share.ShareItemModel', function() { expect(model.get('permissions') & OC.PERMISSION_SHARE).toEqual(OC.PERMISSION_SHARE); }); it('properly parses integer values when the server is in the mood of returning ints as string', function() { - loadItemStub.yields({ - reshare: {}, - shares: [{ + /* jshint camelcase: false */ + fetchReshareDeferred.resolve(makeOcsResponse([])); + fetchSharesDeferred.resolve(makeOcsResponse([{ displayname_owner: 'root', expiration: '2015-10-12 00:00:00', file_source: '123', @@ -280,7 +326,7 @@ describe('OC.Share.ShareItemModel', function() { token: 'tehtoken', uid_owner: 'root' }] - }); + )); model.fetch(); @@ -306,55 +352,50 @@ describe('OC.Share.ShareItemModel', function() { }); describe('hasUserShares', function() { it('returns false when no user shares exist', function() { - loadItemStub.yields({ - reshare: {}, - shares: [] - }); + fetchReshareDeferred.resolve(makeOcsResponse([])); + fetchSharesDeferred.resolve(makeOcsResponse([])); model.fetch(); expect(model.hasUserShares()).toEqual(false); }); it('returns true when user shares exist on the current item', function() { - loadItemStub.yields({ - reshare: {}, - shares: [{ - id: 1, - share_type: OC.Share.SHARE_TYPE_USER, - share_with: 'user1', - item_source: '123' - }] - }); + /* jshint camelcase: false */ + fetchReshareDeferred.resolve(makeOcsResponse([])); + fetchSharesDeferred.resolve(makeOcsResponse([{ + id: 1, + share_type: OC.Share.SHARE_TYPE_USER, + share_with: 'user1', + item_source: '123' + }])); model.fetch(); expect(model.hasUserShares()).toEqual(true); }); it('returns true when group shares exist on the current item', function() { - loadItemStub.yields({ - reshare: {}, - shares: [{ - id: 1, - share_type: OC.Share.SHARE_TYPE_GROUP, - share_with: 'group1', - item_source: '123' - }] - }); + /* jshint camelcase: false */ + fetchReshareDeferred.resolve(makeOcsResponse([])); + fetchSharesDeferred.resolve(makeOcsResponse([{ + id: 1, + share_type: OC.Share.SHARE_TYPE_GROUP, + share_with: 'group1', + item_source: '123' + }])); model.fetch(); expect(model.hasUserShares()).toEqual(true); }); it('returns false when share exist on parent item', function() { - loadItemStub.yields({ - reshare: {}, - shares: [{ - id: 1, - share_type: OC.Share.SHARE_TYPE_GROUP, - share_with: 'group1', - item_source: '111' - }] - }); + /* jshint camelcase: false */ + fetchReshareDeferred.resolve(makeOcsResponse([])); + fetchSharesDeferred.resolve(makeOcsResponse([{ + id: 1, + share_type: OC.Share.SHARE_TYPE_GROUP, + share_with: 'group1', + item_source: '111' + }])); model.fetch(); @@ -381,27 +422,28 @@ describe('OC.Share.ShareItemModel', function() { describe('sendEmailPrivateLink', function() { it('succeeds', function() { - loadItemStub.yields({ - shares: [{ - displayname_owner: 'root', - expiration: null, - file_source: 123, - file_target: '/folder', - id: 20, - item_source: '123', - item_type: 'folder', - mail_send: '0', - parent: null, - path: '/folder', - permissions: OC.PERMISSION_READ, - share_type: OC.Share.SHARE_TYPE_LINK, - share_with: null, - stime: 1403884258, - storage: 1, - token: 'tehtoken', - uid_owner: 'root' - }] - }); + /* jshint camelcase: false */ + fetchReshareDeferred.resolve(makeOcsResponse([])); + fetchSharesDeferred.resolve(makeOcsResponse([{ + displayname_owner: 'root', + expiration: null, + file_source: 123, + file_target: '/folder', + id: 20, + item_source: '123', + item_type: 'folder', + mail_send: '0', + parent: null, + path: '/folder', + permissions: OC.PERMISSION_READ, + share_type: OC.Share.SHARE_TYPE_LINK, + share_with: null, + stime: 1403884258, + storage: 1, + token: 'tehtoken', + uid_owner: 'root' + }])); + model.fetch(); var res = model.sendEmailPrivateLink('foo@bar.com'); @@ -430,27 +472,28 @@ describe('OC.Share.ShareItemModel', function() { }); it('fails', function() { - loadItemStub.yields({ - shares: [{ - displayname_owner: 'root', - expiration: null, - file_source: 123, - file_target: '/folder', - id: 20, - item_source: '123', - item_type: 'folder', - mail_send: '0', - parent: null, - path: '/folder', - permissions: OC.PERMISSION_READ, - share_type: OC.Share.SHARE_TYPE_LINK, - share_with: null, - stime: 1403884258, - storage: 1, - token: 'tehtoken', - uid_owner: 'root' - }] - }); + /* jshint camelcase: false */ + fetchReshareDeferred.resolve(makeOcsResponse([])); + fetchSharesDeferred.resolve(makeOcsResponse([{ + displayname_owner: 'root', + expiration: null, + file_source: 123, + file_target: '/folder', + id: 20, + item_source: '123', + item_type: 'folder', + mail_send: '0', + parent: null, + path: '/folder', + permissions: OC.PERMISSION_READ, + share_type: OC.Share.SHARE_TYPE_LINK, + share_with: null, + stime: 1403884258, + storage: 1, + token: 'tehtoken', + uid_owner: 'root' + }])); + model.fetch(); var res = model.sendEmailPrivateLink('foo@bar.com'); @@ -478,5 +521,194 @@ describe('OC.Share.ShareItemModel', function() { expect(res.state()).toEqual('rejected'); }); }); + describe('share permissions', function() { + beforeEach(function() { + oc_appconfig.core.resharingAllowed = true; + }); + + /** + * Tests sharing with the given possible permissions + * + * @param {int} possiblePermissions + * @return {int} permissions sent to the server + */ + function testWithPermissions(possiblePermissions) { + model.set({ + permissions: possiblePermissions, + possiblePermissions: possiblePermissions + }); + model.addShare({ + shareType: OC.Share.SHARE_TYPE_USER, + shareWith: 'user2' + }); + + var requestBody = OC.parseQueryString(_.last(fakeServer.requests).requestBody); + return parseInt(requestBody.permissions, 10); + } + + describe('regular sharing', function() { + it('shares with given permissions with default config', function() { + configModel.set('isResharingAllowed', true); + model.set({ + reshare: {}, + shares: [] + }); + expect( + testWithPermissions(OC.PERMISSION_READ | OC.PERMISSION_UPDATE | OC.PERMISSION_SHARE) + ).toEqual(OC.PERMISSION_READ | OC.PERMISSION_UPDATE | OC.PERMISSION_SHARE); + expect( + testWithPermissions(OC.PERMISSION_READ | OC.PERMISSION_SHARE) + ).toEqual(OC.PERMISSION_READ | OC.PERMISSION_SHARE); + }); + it('removes share permission when not allowed', function() { + configModel.set('isResharingAllowed', false); + model.set({ + reshare: {}, + shares: [] + }); + expect( + testWithPermissions(OC.PERMISSION_READ | OC.PERMISSION_UPDATE | OC.PERMISSION_SHARE) + ).toEqual(OC.PERMISSION_READ | OC.PERMISSION_UPDATE); + }); + it('automatically adds READ permission even when not specified', function() { + configModel.set('isResharingAllowed', false); + model.set({ + reshare: {}, + shares: [] + }); + expect( + testWithPermissions(OC.PERMISSION_UPDATE | OC.PERMISSION_SHARE) + ).toEqual(OC.PERMISSION_READ | OC.PERMISSION_UPDATE | OC.PERMISSION_UPDATE); + }); + }); + }); + + describe('saveLinkShare', function() { + var addShareStub; + var updateShareStub; + + beforeEach(function() { + addShareStub = sinon.stub(model, 'addShare'); + updateShareStub = sinon.stub(model, 'updateShare'); + }); + afterEach(function() { + addShareStub.restore(); + updateShareStub.restore(); + }); + + it('creates a new share if no link share exists', function() { + model.set({ + linkShare: { + isLinkShare: false + } + }); + + model.saveLinkShare(); + + expect(addShareStub.calledOnce).toEqual(true); + expect(addShareStub.firstCall.args[0]).toEqual({ + password: '', + passwordChanged: false, + permissions: OC.PERMISSION_READ, + expireDate: '', + shareType: OC.Share.SHARE_TYPE_LINK + }); + expect(updateShareStub.notCalled).toEqual(true); + }); + it('creates a new share with default expiration date', function() { + var clock = sinon.useFakeTimers(Date.UTC(2015, 6, 17, 1, 2, 0, 3)); + configModel.set({ + isDefaultExpireDateEnabled: true, + defaultExpireDate: 7 + }); + model.set({ + linkShare: { + isLinkShare: false + } + }); + + model.saveLinkShare(); + + expect(addShareStub.calledOnce).toEqual(true); + expect(addShareStub.firstCall.args[0]).toEqual({ + password: '', + passwordChanged: false, + permissions: OC.PERMISSION_READ, + expireDate: '2015-7-24 00:00:00', + shareType: OC.Share.SHARE_TYPE_LINK + }); + expect(updateShareStub.notCalled).toEqual(true); + clock.restore(); + }); + it('updates link share if it exists', function() { + model.set({ + linkShare: { + isLinkShare: true, + id: 123 + } + }); + + model.saveLinkShare({ + password: 'test' + }); + + expect(addShareStub.notCalled).toEqual(true); + expect(updateShareStub.calledOnce).toEqual(true); + expect(updateShareStub.firstCall.args[0]).toEqual(123); + expect(updateShareStub.firstCall.args[1]).toEqual({ + password: 'test' + }); + }); + }); + describe('creating shares', function() { + it('sends POST method to endpoint with passed values', function() { + model.addShare({ + shareType: OC.Share.SHARE_TYPE_GROUP, + shareWith: 'group1' + }); + + expect(fakeServer.requests.length).toEqual(1); + expect(fakeServer.requests[0].method).toEqual('POST'); + expect(fakeServer.requests[0].url).toEqual( + OC.linkToOCS('apps/files_sharing/api/v1', 2) + + 'shares?format=json' + ); + expect(OC.parseQueryString(fakeServer.requests[0].requestBody)).toEqual({ + path: '/subdir/shared_file_name.txt', + permissions: '' + OC.PERMISSION_READ, + shareType: '' + OC.Share.SHARE_TYPE_GROUP, + shareWith: 'group1' + }); + }); + }); + describe('updating shares', function() { + it('sends PUT method to endpoint with passed values', function() { + model.updateShare(123, { + permissions: OC.PERMISSION_READ | OC.PERMISSION_SHARE + }); + + expect(fakeServer.requests.length).toEqual(1); + expect(fakeServer.requests[0].method).toEqual('PUT'); + expect(fakeServer.requests[0].url).toEqual( + OC.linkToOCS('apps/files_sharing/api/v1', 2) + + 'shares/123?format=json' + ); + expect(OC.parseQueryString(fakeServer.requests[0].requestBody)).toEqual({ + permissions: '' + (OC.PERMISSION_READ | OC.PERMISSION_SHARE) + }); + }); + }); + describe('removing shares', function() { + it('sends DELETE method to endpoint with share id', function() { + model.removeShare(123); + + expect(fakeServer.requests.length).toEqual(1); + expect(fakeServer.requests[0].method).toEqual('DELETE'); + expect(fakeServer.requests[0].url).toEqual( + OC.linkToOCS('apps/files_sharing/api/v1', 2) + + 'shares/123?format=json' + ); + }); + }); }); |