123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998 |
- /**
- * ownCloud
- *
- * @author Vincent Petry
- * @copyright 2015 Vincent Petry <pvince81@owncloud.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
- *
- * You should have received a copy of the GNU Affero General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
- *
- */
- /* global oc_appconfig, sinon */
- describe('OC.Share.ShareDialogView', function() {
- var $container;
- var oldAppConfig;
- var autocompleteStub;
- var avatarStub;
- var placeholderStub;
- var oldCurrentUser;
- var saveLinkShareStub;
- var fetchStub;
- var notificationStub;
- var configModel;
- var shareModel;
- var fileInfoModel;
- var dialog;
- beforeEach(function() {
- // horrible parameters
- $('#testArea').append('<input id="allowShareWithLink" type="hidden" value="yes">');
- $container = $('#shareContainer');
- /* jshint camelcase:false */
- oldAppConfig = _.extend({}, oc_appconfig.core);
- 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,
- name: 'shared_file_name.txt',
- path: '/subdir',
- size: 100,
- mimetype: 'text/plain',
- permissions: 31,
- sharePermissions: 31
- });
- var attributes = {
- itemType: fileInfoModel.isDirectory() ? 'folder' : 'file',
- itemSource: fileInfoModel.get('id'),
- possiblePermissions: 31,
- permissions: 31
- };
- configModel = new OC.Share.ShareConfigModel({
- enforcePasswordForPublicLink: false,
- isResharingAllowed: true,
- isDefaultExpireDateEnabled: false,
- isDefaultExpireDateEnforced: false,
- defaultExpireDate: 7
- });
- shareModel = new OC.Share.ShareItemModel(attributes, {
- configModel: configModel,
- fileInfoModel: fileInfoModel
- });
- dialog = new OC.Share.ShareDialogView({
- configModel: configModel,
- model: shareModel
- });
- // required for proper event propagation when simulating clicks in some cases (jquery bugs)
- $('#testArea').append(dialog.$el);
- // triggers rendering
- shareModel.set({
- shares: [],
- linkShare: {isLinkShare: false}
- });
- autocompleteStub = sinon.stub($.fn, 'autocomplete').callsFake(function() {
- // dummy container with the expected attributes
- if (!$(this).length) {
- // simulate the real autocomplete that returns
- // nothing at all when no element is specified
- // (and potentially break stuff)
- return null;
- }
- var $el = $('<div></div>').data('ui-autocomplete', {});
- return $el;
- });
- avatarStub = sinon.stub($.fn, 'avatar');
- placeholderStub = sinon.stub($.fn, 'imageplaceholder');
- oldCurrentUser = OC.currentUser;
- OC.currentUser = 'user0';
- });
- afterEach(function() {
- OC.currentUser = oldCurrentUser;
- /* jshint camelcase:false */
- oc_appconfig.core = oldAppConfig;
- dialog.remove();
- fetchStub.restore();
- saveLinkShareStub.restore();
- autocompleteStub.restore();
- avatarStub.restore();
- placeholderStub.restore();
- });
- describe('Share with link', function() {
- // TODO: test ajax calls
- // TODO: test password field visibility (whenever enforced or not)
- it('update password on focus out', function() {
- $('#allowShareWithLink').val('yes');
- dialog.model.set('linkShare', {
- isLinkShare: true
- });
- dialog.render();
- // 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(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();
- // Enable password and enter password
- dialog.$el.find('[name=showPassword]').click();
- dialog.$el.find('.linkPassText').focus();
- dialog.$el.find('.linkPassText').val('foo');
- dialog.$el.find('.linkPassText').trigger(new $.Event('keyup', {keyCode: 13}));
- 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');
- dialog.render();
- expect(dialog.$el.find('.linkCheckbox').length).toEqual(1);
- });
- it('does not show share with link checkbox when not allowed', function() {
- $('#allowShareWithLink').val('no');
- dialog.render();
- expect(dialog.$el.find('.linkCheckbox').length).toEqual(0);
- expect(dialog.$el.find('.shareWithField').length).toEqual(1);
- });
- it('shows populated link share when a link share exists', function() {
- // this is how the OC.Share class does it...
- var link = parent.location.protocol + '//' + location.host +
- OC.generateUrl('/s/') + 'tehtoken';
- shareModel.set('linkShare', {
- isLinkShare: true,
- token: 'tehtoken',
- link: link,
- expiration: '',
- permissions: OC.PERMISSION_READ,
- stime: 1403884258,
- });
- dialog.render();
- expect(dialog.$el.find('.linkCheckbox').prop('checked')).toEqual(true);
- expect(dialog.$el.find('.linkText').val()).toEqual(link);
- });
- it('autofocus link text when clicked', function() {
- $('#allowShareWithLink').val('yes');
- dialog.model.set('linkShare', {
- isLinkShare: true
- });
- dialog.render();
- var focusStub = sinon.stub($.fn, 'focus');
- var selectStub = sinon.stub($.fn, 'select');
- dialog.$el.find('.linkText').click();
- expect(focusStub.calledOnce).toEqual(true);
- expect(selectStub.calledOnce).toEqual(true);
- focusStub.restore();
- selectStub.restore();
- });
- describe('password', function() {
- var slideToggleStub;
- beforeEach(function() {
- $('#allowShareWithLink').val('yes');
- configModel.set({
- enforcePasswordForPublicLink: false
- });
- slideToggleStub = sinon.stub($.fn, 'slideToggle');
- });
- afterEach(function() {
- slideToggleStub.restore();
- });
- it('enforced but toggled does not fire request', function() {
- configModel.set('enforcePasswordForPublicLink', true);
- dialog.render();
- dialog.$el.find('.linkCheckbox').click();
- // The password linkPass field is shown (slideToggle is called).
- // No request is made yet
- expect(slideToggleStub.callCount).toEqual(1);
- expect(slideToggleStub.getCall(0).thisValue.eq(0).attr('id')).toEqual('linkPass');
- expect(fakeServer.requests.length).toEqual(0);
- // Now untoggle share by link
- dialog.$el.find('.linkCheckbox').click();
- dialog.render();
- // Password field disappears and no ajax requests have been made
- expect(fakeServer.requests.length).toEqual(0);
- expect(slideToggleStub.callCount).toEqual(2);
- expect(slideToggleStub.getCall(1).thisValue.eq(0).attr('id')).toEqual('linkPass');
- });
- });
- describe('expiration date', function() {
- var shareData;
- var shareItem;
- var clock;
- var expectedMinDate;
- beforeEach(function() {
- // pick a fake date
- clock = sinon.useFakeTimers(new Date(2014, 0, 20, 14, 0, 0).getTime());
- expectedMinDate = new Date(2014, 0, 21, 14, 0, 0);
- configModel.set({
- enforcePasswordForPublicLink: false,
- isDefaultExpireDateEnabled: false,
- isDefaultExpireDateEnforced: false,
- defaultExpireDate: 7
- });
- shareModel.set('linkShare', {
- isLinkShare: true,
- token: 'tehtoken',
- permissions: OC.PERMISSION_READ,
- expiration: null
- });
- });
- afterEach(function() {
- clock.restore();
- });
- it('does not check expiration date checkbox when no date was set', function() {
- shareModel.get('linkShare').expiration = null;
- dialog.render();
- expect(dialog.$el.find('[name=expirationCheckbox]').prop('checked')).toEqual(false);
- expect(dialog.$el.find('.datepicker').val()).toEqual('');
- });
- it('does not check expiration date checkbox for new share', function() {
- dialog.render();
- expect(dialog.$el.find('[name=expirationCheckbox]').prop('checked')).toEqual(false);
- expect(dialog.$el.find('.datepicker').val()).toEqual('');
- });
- it('checks expiration date checkbox and populates field when expiration date was set', function() {
- shareModel.get('linkShare').expiration = '2014-02-01 00:00:00';
- dialog.render();
- expect(dialog.$el.find('[name=expirationCheckbox]').prop('checked')).toEqual(true);
- expect(dialog.$el.find('.datepicker').val()).toEqual('01-02-2014');
- });
- it('sets default date when default date setting is enabled', function() {
- configModel.set('isDefaultExpireDateEnabled', true);
- dialog.render();
- dialog.$el.find('.linkCheckbox').click();
- // here fetch would be called and the server returns the expiration date
- shareModel.get('linkShare').expiration = '2014-1-27 00:00:00';
- dialog.render();
- // enabled by default
- expect(dialog.$el.find('[name=expirationCheckbox]').prop('checked')).toEqual(true);
- expect(dialog.$el.find('.datepicker').val()).toEqual('27-01-2014');
- // disabling is allowed
- dialog.$el.find('[name=expirationCheckbox]').click();
- expect(dialog.$el.find('[name=expirationCheckbox]').prop('checked')).toEqual(false);
- });
- it('enforces default date when enforced date setting is enabled', function() {
- configModel.set({
- isDefaultExpireDateEnabled: true,
- isDefaultExpireDateEnforced: true
- });
- dialog.render();
- dialog.$el.find('.linkCheckbox').click();
- // here fetch would be called and the server returns the expiration date
- shareModel.get('linkShare').expiration = '2014-1-27 00:00:00';
- dialog.render();
- expect(dialog.$el.find('[name=expirationCheckbox]').prop('checked')).toEqual(true);
- expect(dialog.$el.find('.datepicker').val()).toEqual('27-01-2014');
- // disabling is not allowed
- expect(dialog.$el.find('[name=expirationCheckbox]').prop('disabled')).toEqual(true);
- dialog.$el.find('[name=expirationCheckbox]').click();
- expect(dialog.$el.find('[name=expirationCheckbox]').prop('checked')).toEqual(true);
- });
- it('enforces default date when enforced date setting is enabled and password is enforced', function() {
- configModel.set({
- enforcePasswordForPublicLink: true,
- isDefaultExpireDateEnabled: true,
- isDefaultExpireDateEnforced: true
- });
- dialog.render();
- dialog.$el.find('.linkCheckbox').click();
- // here fetch would be called and the server returns the expiration date
- shareModel.get('linkShare').expiration = '2014-1-27 00:00:00';
- dialog.render();
- //Enter password
- dialog.$el.find('.linkPassText').val('foo');
- dialog.$el.find('.linkPassText').trigger(new $.Event('keyup', {keyCode: 13}));
- fakeServer.requests[0].respond(
- 200,
- { 'Content-Type': 'application/json' },
- JSON.stringify({data: {token: 'xyz'}, status: 'success'})
- );
- expect(dialog.$el.find('[name=expirationCheckbox]').prop('checked')).toEqual(true);
- expect(dialog.$el.find('.datepicker').val()).toEqual('27-01-2014');
- // disabling is not allowed
- expect(dialog.$el.find('[name=expirationCheckbox]').prop('disabled')).toEqual(true);
- dialog.$el.find('[name=expirationCheckbox]').click();
- expect(dialog.$el.find('[name=expirationCheckbox]').prop('checked')).toEqual(true);
- });
- it('sets picker minDate to today and no maxDate by default', function() {
- dialog.render();
- dialog.$el.find('.linkCheckbox').click();
- dialog.$el.find('[name=expirationCheckbox]').click();
- expect($.datepicker._defaults.minDate).toEqual(expectedMinDate);
- expect($.datepicker._defaults.maxDate).toEqual(null);
- });
- it('limits the date range to X days after share time when enforced', function() {
- configModel.set({
- isDefaultExpireDateEnabled: true,
- isDefaultExpireDateEnforced: true
- });
- dialog.render();
- dialog.$el.find('.linkCheckbox').click();
- expect($.datepicker._defaults.minDate).toEqual(expectedMinDate);
- expect($.datepicker._defaults.maxDate).toEqual(new Date(2014, 0, 27, 0, 0, 0, 0));
- });
- it('limits the date range to X days after share time when enforced, even when redisplayed the next days', function() {
- // item exists, was created two days ago
- var shareItem = shareModel.get('linkShare');
- shareItem.expiration = '2014-1-27';
- // share time has time component but must be stripped later
- shareItem.stime = new Date(2014, 0, 20, 11, 0, 25).getTime() / 1000;
- configModel.set({
- isDefaultExpireDateEnabled: true,
- isDefaultExpireDateEnforced: true
- });
- dialog.render();
- expect($.datepicker._defaults.minDate).toEqual(expectedMinDate);
- expect($.datepicker._defaults.maxDate).toEqual(new Date(2014, 0, 27, 0, 0, 0, 0));
- });
- });
- });
- describe('check for avatar', function() {
- beforeEach(function() {
- shareModel.set({
- reshare: {
- share_type: OC.Share.SHARE_TYPE_USER,
- uid_owner: 'owner',
- displayname_owner: 'Owner',
- permissions: 31
- },
- shares: [{
- id: 100,
- item_source: 123,
- permissions: 31,
- share_type: OC.Share.SHARE_TYPE_USER,
- share_with: 'user1',
- share_with_displayname: 'User One'
- },{
- id: 101,
- item_source: 123,
- permissions: 31,
- share_type: OC.Share.SHARE_TYPE_GROUP,
- share_with: 'group',
- share_with_displayname: 'group'
- },{
- id: 102,
- item_source: 123,
- permissions: 31,
- share_type: OC.Share.SHARE_TYPE_REMOTE,
- share_with: 'foo@bar.com/baz',
- share_with_displayname: 'foo@bar.com/baz'
- }]
- });
- });
- describe('avatars enabled', function() {
- beforeEach(function() {
- avatarStub.reset();
- dialog.render();
- });
- it('test correct function calls', function() {
- expect(avatarStub.calledTwice).toEqual(true);
- expect(placeholderStub.callCount).toEqual(4);
- expect(dialog.$('.shareWithList').children().length).toEqual(3);
- expect(dialog.$('.avatar').length).toEqual(4);
- });
- it('test avatar owner', function() {
- var args = avatarStub.getCall(0).args;
- expect(args.length).toEqual(2);
- expect(args[0]).toEqual('owner');
- });
- it('test avatar user', function() {
- var args = avatarStub.getCall(1).args;
- expect(args.length).toEqual(6);
- expect(args[0]).toEqual('user1');
- expect(args[5]).toEqual('User One');
- });
- it('test avatar for groups', function() {
- var args = placeholderStub.getCall(0).args;
- expect(args.length).toEqual(1);
- expect(args[0]).toEqual('group ' + OC.Share.SHARE_TYPE_GROUP);
- });
- it('test avatar for remotes', function() {
- var args = placeholderStub.getCall(1).args;
- expect(args.length).toEqual(1);
- expect(args[0]).toEqual('foo@bar.com/baz ' + OC.Share.SHARE_TYPE_REMOTE);
- });
- });
- });
- describe('remote sharing', function() {
- it('shows remote share info when allowed', function() {
- configModel.set({
- isRemoteShareAllowed: true
- });
- dialog.render();
- expect(dialog.$el.find('.shareWithRemoteInfo').length).toEqual(1);
- });
- it('does not show remote share info when not allowed', function() {
- configModel.set({
- isRemoteShareAllowed: false
- });
- dialog.render();
- expect(dialog.$el.find('.shareWithRemoteInfo').length).toEqual(0);
- });
- });
- describe('autocompletion of users', function() {
- it('triggers autocomplete display and focus with data when ajax search succeeds', function () {
- dialog.render();
- var response = sinon.stub();
- dialog.autocompleteHandler({term: 'bob'}, response);
- var jsonData = JSON.stringify({
- 'ocs' : {
- 'meta' : {
- 'status' : 'success',
- 'statuscode' : 100,
- 'message' : null
- },
- 'data' : {
- 'exact' : {
- 'users' : [],
- 'groups' : [],
- 'remotes': []
- },
- 'users' : [{'label': 'bob', 'value': {'shareType': 0, 'shareWith': 'test'}}],
- 'groups' : [],
- 'remotes': [],
- 'lookup': []
- }
- }
- });
- fakeServer.requests[0].respond(
- 200,
- {'Content-Type': 'application/json'},
- jsonData
- );
- expect(response.calledWithExactly(JSON.parse(jsonData).ocs.data.users)).toEqual(true);
- expect(autocompleteStub.calledWith("option", "autoFocus", true)).toEqual(true);
- });
- describe('filter out', function() {
- it('the current user', function () {
- dialog.render();
- var response = sinon.stub();
- dialog.autocompleteHandler({term: 'bob'}, response);
- var jsonData = JSON.stringify({
- 'ocs': {
- 'meta': {
- 'status': 'success',
- 'statuscode': 100,
- 'message': null
- },
- 'data': {
- 'exact': {
- 'users': [],
- 'groups': [],
- 'remotes': []
- },
- 'users': [
- {
- 'label': 'bob',
- 'value': {
- 'shareType': 0,
- 'shareWith': OC.currentUser
- }
- },
- {
- 'label': 'bobby',
- 'value': {
- 'shareType': 0,
- 'shareWith': 'imbob'
- }
- }
- ],
- 'groups': [],
- 'remotes': [],
- 'lookup': []
- }
- }
- });
- fakeServer.requests[0].respond(
- 200,
- {'Content-Type': 'application/json'},
- jsonData
- );
- expect(response.calledWithExactly([{
- 'label': 'bobby',
- 'value': {'shareType': 0, 'shareWith': 'imbob'}
- }])).toEqual(true);
- expect(autocompleteStub.calledWith("option", "autoFocus", true)).toEqual(true);
- });
- it('the share owner', function () {
- shareModel.set({
- reshare: {
- uid_owner: 'user1'
- },
- shares: [],
- permissions: OC.PERMISSION_READ
- });
- dialog.render();
- var response = sinon.stub();
- dialog.autocompleteHandler({term: 'bob'}, response);
- var jsonData = JSON.stringify({
- 'ocs': {
- 'meta': {
- 'status': 'success',
- 'statuscode': 100,
- 'message': null
- },
- 'data': {
- 'exact': {
- 'users': [],
- 'groups': [],
- 'remotes': []
- },
- 'users': [
- {
- 'label': 'bob',
- 'value': {
- 'shareType': 0,
- 'shareWith': 'user1'
- }
- },
- {
- 'label': 'bobby',
- 'value': {
- 'shareType': 0,
- 'shareWith': 'imbob'
- }
- }
- ],
- 'groups': [],
- 'remotes': [],
- 'lookup': []
- }
- }
- });
- fakeServer.requests[0].respond(
- 200,
- {'Content-Type': 'application/json'},
- jsonData
- );
- expect(response.calledWithExactly([{
- 'label': 'bobby',
- 'value': {'shareType': 0, 'shareWith': 'imbob'}
- }])).toEqual(true);
- expect(autocompleteStub.calledWith("option", "autoFocus", true)).toEqual(true);
- });
- describe('already shared with', function () {
- beforeEach(function() {
- shareModel.set({
- reshare: {},
- shares: [{
- id: 100,
- item_source: 123,
- permissions: 31,
- share_type: OC.Share.SHARE_TYPE_USER,
- share_with: 'user1',
- share_with_displayname: 'User One'
- },{
- id: 101,
- item_source: 123,
- permissions: 31,
- share_type: OC.Share.SHARE_TYPE_GROUP,
- share_with: 'group',
- share_with_displayname: 'group'
- },{
- id: 102,
- item_source: 123,
- permissions: 31,
- share_type: OC.Share.SHARE_TYPE_REMOTE,
- share_with: 'foo@bar.com/baz',
- share_with_displayname: 'foo@bar.com/baz'
- }]
- });
- });
- it('users', function () {
- dialog.render();
- var response = sinon.stub();
- dialog.autocompleteHandler({term: 'bob'}, response);
- var jsonData = JSON.stringify({
- 'ocs': {
- 'meta': {
- 'status': 'success',
- 'statuscode': 100,
- 'message': null
- },
- 'data': {
- 'exact': {
- 'users': [],
- 'groups': [],
- 'remotes': []
- },
- 'users': [
- {
- 'label': 'bob',
- 'value': {
- 'shareType': OC.Share.SHARE_TYPE_USER,
- 'shareWith': 'user1'
- }
- },
- {
- 'label': 'bobby',
- 'value': {
- 'shareType': OC.Share.SHARE_TYPE_USER,
- 'shareWith': 'imbob'
- }
- }
- ],
- 'groups': [],
- 'remotes': [],
- 'lookup': []
- }
- }
- });
- fakeServer.requests[0].respond(
- 200,
- {'Content-Type': 'application/json'},
- jsonData
- );
- expect(response.calledWithExactly([{
- 'label': 'bobby',
- 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'imbob'}
- }])).toEqual(true);
- expect(autocompleteStub.calledWith("option", "autoFocus", true)).toEqual(true);
- });
- it('groups', function () {
- dialog.render();
- var response = sinon.stub();
- dialog.autocompleteHandler({term: 'group'}, response);
- var jsonData = JSON.stringify({
- 'ocs': {
- 'meta': {
- 'status': 'success',
- 'statuscode': 100,
- 'message': null
- },
- 'data': {
- 'exact': {
- 'users': [],
- 'groups': [],
- 'remotes': []
- },
- 'users': [],
- 'groups': [
- {
- 'label': 'group',
- 'value': {
- 'shareType': OC.Share.SHARE_TYPE_GROUP,
- 'shareWith': 'group'
- }
- },
- {
- 'label': 'group2',
- 'value': {
- 'shareType': OC.Share.SHARE_TYPE_GROUP,
- 'shareWith': 'group2'
- }
- }
- ],
- 'remotes': [],
- 'lookup': []
- }
- }
- });
- fakeServer.requests[0].respond(
- 200,
- {'Content-Type': 'application/json'},
- jsonData
- );
- expect(response.calledWithExactly([{
- 'label': 'group2',
- 'value': {'shareType': OC.Share.SHARE_TYPE_GROUP, 'shareWith': 'group2'}
- }])).toEqual(true);
- expect(autocompleteStub.calledWith("option", "autoFocus", true)).toEqual(true);
- });
- it('remotes', function () {
- dialog.render();
- var response = sinon.stub();
- dialog.autocompleteHandler({term: 'bob'}, response);
- var jsonData = JSON.stringify({
- 'ocs': {
- 'meta': {
- 'status': 'success',
- 'statuscode': 100,
- 'message': null
- },
- 'data': {
- 'exact': {
- 'users': [],
- 'groups': [],
- 'remotes': []
- },
- 'users': [],
- 'groups': [],
- 'remotes': [
- {
- 'label': 'foo@bar.com/baz',
- 'value': {
- 'shareType': OC.Share.SHARE_TYPE_REMOTE,
- 'shareWith': 'foo@bar.com/baz'
- }
- },
- {
- 'label': 'foo2@bar.com/baz',
- 'value': {
- 'shareType': OC.Share.SHARE_TYPE_REMOTE,
- 'shareWith': 'foo2@bar.com/baz'
- }
- }
- ],
- 'lookup': []
- }
- }
- });
- fakeServer.requests[0].respond(
- 200,
- {'Content-Type': 'application/json'},
- jsonData
- );
- expect(response.calledWithExactly([{
- 'label': 'foo2@bar.com/baz',
- 'value': {'shareType': OC.Share.SHARE_TYPE_REMOTE, 'shareWith': 'foo2@bar.com/baz'}
- }])).toEqual(true);
- expect(autocompleteStub.calledWith("option", "autoFocus", true)).toEqual(true);
- });
- });
- });
- it('gracefully handles successful ajax call with failure content', function () {
- dialog.render();
- var response = sinon.stub();
- dialog.autocompleteHandler({term: 'bob'}, response);
- var jsonData = JSON.stringify({
- 'ocs' : {
- 'meta' : {
- 'status': 'failure',
- 'statuscode': 400
- }
- }
- });
- fakeServer.requests[0].respond(
- 200,
- {'Content-Type': 'application/json'},
- jsonData
- );
- expect(response.calledWithExactly()).toEqual(true);
- });
- it('throws a notification when the ajax search lookup fails', function () {
- notificationStub = sinon.stub(OC.Notification, 'show');
- dialog.render();
- dialog.autocompleteHandler({term: 'bob'}, sinon.stub());
- fakeServer.requests[0].respond(500);
- expect(notificationStub.calledOnce).toEqual(true);
- notificationStub.restore();
- });
- describe('renders the autocomplete elements', function() {
- it('renders a group element', function() {
- dialog.render();
- var el = dialog.autocompleteRenderItem(
- $("<ul></ul>"),
- {label: "1", value: { shareType: OC.Share.SHARE_TYPE_GROUP }}
- );
- expect(el.is('li')).toEqual(true);
- expect(el.hasClass('group')).toEqual(true);
- });
- it('renders a remote element', function() {
- dialog.render();
- var el = dialog.autocompleteRenderItem(
- $("<ul></ul>"),
- {label: "1", value: { shareType: OC.Share.SHARE_TYPE_REMOTE }}
- );
- expect(el.is('li')).toEqual(true);
- expect(el.hasClass('user')).toEqual(true);
- });
- });
- it('calls addShare after selection', function() {
- dialog.render();
- var shareWith = $('.shareWithField')[0];
- var $shareWith = $(shareWith);
- var addShareStub = sinon.stub(shareModel, 'addShare');
- var autocompleteOptions = autocompleteStub.getCall(0).args[0];
- autocompleteOptions.select(new $.Event('select', {target: shareWith}), {
- 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'
- });
- //Input is locked
- expect($shareWith.val()).toEqual('User Two');
- expect($shareWith.attr('disabled')).toEqual('disabled');
- //Callback is called
- addShareStub.firstCall.args[1].success();
- //Input is unlocked
- expect($shareWith.val()).toEqual('');
- expect($shareWith.attr('disabled')).toEqual(undefined);
- addShareStub.restore();
- });
- it('calls addShare after selection and fail to share', function() {
- dialog.render();
- var shareWith = $('.shareWithField')[0];
- var $shareWith = $(shareWith);
- var addShareStub = sinon.stub(shareModel, 'addShare');
- var autocompleteOptions = autocompleteStub.getCall(0).args[0];
- autocompleteOptions.select(new $.Event('select', {target: shareWith}), {
- 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'
- });
- //Input is locked
- expect($shareWith.val()).toEqual('User Two');
- expect($shareWith.attr('disabled')).toEqual('disabled');
- //Callback is called
- addShareStub.firstCall.args[1].error();
- //Input is unlocked
- expect($shareWith.val()).toEqual('User Two');
- expect($shareWith.attr('disabled')).toEqual(undefined);
- 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 for single user share', function() {
- shareModel.set({
- reshare: {
- uid_owner: 'user1',
- displayname_owner: 'User One',
- share_type: OC.Share.SHARE_TYPE_USER
- },
- shares: [],
- permissions: OC.PERMISSION_READ
- });
- dialog.render();
- expect(dialog.$el.find('.resharerInfoView .reshare').length).toEqual(1);
- expect(dialog.$el.find('.resharerInfoView .reshare').text().trim()).toEqual('Shared with you by User One');
- });
- it('shows reshare owner for single user share', function() {
- shareModel.set({
- reshare: {
- uid_owner: 'user1',
- displayname_owner: 'User One',
- share_with: 'group2',
- share_with_displayname: 'Group Two',
- share_type: OC.Share.SHARE_TYPE_GROUP
- },
- shares: [],
- permissions: OC.PERMISSION_READ
- });
- dialog.render();
- expect(dialog.$el.find('.resharerInfoView .reshare').length).toEqual(1);
- expect(dialog.$el.find('.resharerInfoView .reshare').text().trim()).toEqual('Shared with you and the group Group Two by User One');
- });
- 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);
- });
- });
- });
|