2015-11-30 17:40:17 +03:00
|
|
|
/**
|
|
|
|
* ownCloud
|
|
|
|
*
|
|
|
|
* @author Vincent Petry
|
|
|
|
* @copyright 2016 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('OC.SystemTags.SystemTagsInputField tests', function() {
|
2016-02-22 19:19:08 +03:00
|
|
|
var view, select2Stub, clock;
|
2015-11-30 17:40:17 +03:00
|
|
|
|
|
|
|
beforeEach(function() {
|
2016-02-22 19:19:08 +03:00
|
|
|
clock = sinon.useFakeTimers();
|
2015-11-30 17:40:17 +03:00
|
|
|
var $container = $('<div class="testInputContainer"></div>');
|
|
|
|
select2Stub = sinon.stub($.fn, 'select2');
|
|
|
|
select2Stub.returnsThis();
|
|
|
|
$('#testArea').append($container);
|
|
|
|
});
|
|
|
|
afterEach(function() {
|
|
|
|
select2Stub.restore();
|
|
|
|
OC.SystemTags.collection.reset();
|
2016-02-22 19:19:08 +03:00
|
|
|
clock.restore();
|
2015-11-30 17:40:17 +03:00
|
|
|
view.remove();
|
|
|
|
view = undefined;
|
|
|
|
});
|
2016-01-21 17:23:49 +03:00
|
|
|
|
|
|
|
describe('general behavior', function() {
|
|
|
|
var $dropdown;
|
2015-11-30 17:40:17 +03:00
|
|
|
|
|
|
|
beforeEach(function() {
|
2016-01-21 17:23:49 +03:00
|
|
|
view = new OC.SystemTags.SystemTagsInputField();
|
|
|
|
$('.testInputContainer').append(view.$el);
|
|
|
|
$dropdown = $('<div class="select2-dropdown"></div>');
|
|
|
|
select2Stub.withArgs('dropdown').returns($dropdown);
|
|
|
|
$('#testArea').append($dropdown);
|
|
|
|
|
2015-11-30 17:40:17 +03:00
|
|
|
view.render();
|
|
|
|
});
|
2016-01-21 17:23:49 +03:00
|
|
|
describe('rendering', function() {
|
|
|
|
it('calls select2 on rendering', function() {
|
|
|
|
expect(view.$el.find('input[name=tags]').length).toEqual(1);
|
|
|
|
expect(select2Stub.called).toEqual(true);
|
|
|
|
});
|
|
|
|
it('formatResult renders rename button', function() {
|
|
|
|
var opts = select2Stub.getCall(0).args[0];
|
|
|
|
var $el = $(opts.formatResult({id: '1', name: 'test'}));
|
|
|
|
expect($el.find('.rename').length).toEqual(1);
|
|
|
|
});
|
2015-11-30 17:40:17 +03:00
|
|
|
});
|
2016-01-21 17:23:49 +03:00
|
|
|
describe('tag selection', function() {
|
|
|
|
beforeEach(function() {
|
|
|
|
var $el = view.$el.find('input');
|
|
|
|
$el.val('1');
|
|
|
|
|
|
|
|
view.collection.add([
|
|
|
|
new OC.SystemTags.SystemTagModel({id: '1', name: 'abc'}),
|
|
|
|
new OC.SystemTags.SystemTagModel({id: '2', name: 'def'}),
|
2016-05-11 17:47:33 +03:00
|
|
|
new OC.SystemTags.SystemTagModel({id: '3', name: 'abd', userAssignable: false, canAssign: false}),
|
2016-01-21 17:23:49 +03:00
|
|
|
]);
|
2015-11-30 17:40:17 +03:00
|
|
|
});
|
2016-01-21 17:23:49 +03:00
|
|
|
it('does not create dummy tag when user types non-matching name', function() {
|
|
|
|
var opts = select2Stub.getCall(0).args[0];
|
|
|
|
var result = opts.createSearchChoice('abc');
|
|
|
|
expect(result).not.toBeDefined();
|
2015-11-30 17:40:17 +03:00
|
|
|
});
|
2016-01-21 17:23:49 +03:00
|
|
|
it('creates dummy tag when user types non-matching name', function() {
|
|
|
|
var opts = select2Stub.getCall(0).args[0];
|
|
|
|
var result = opts.createSearchChoice('abnew');
|
|
|
|
expect(result.id).toEqual(-1);
|
|
|
|
expect(result.name).toEqual('abnew');
|
|
|
|
expect(result.isNew).toEqual(true);
|
|
|
|
expect(result.userVisible).toEqual(true);
|
|
|
|
expect(result.userAssignable).toEqual(true);
|
2016-05-11 17:47:33 +03:00
|
|
|
expect(result.canAssign).toEqual(true);
|
2016-01-21 17:23:49 +03:00
|
|
|
});
|
2016-02-02 12:42:35 +03:00
|
|
|
it('creates dummy tag when user types non-matching name even with prefix of existing tag', function() {
|
|
|
|
var opts = select2Stub.getCall(0).args[0];
|
|
|
|
var result = opts.createSearchChoice('ab');
|
|
|
|
expect(result.id).toEqual(-1);
|
|
|
|
expect(result.name).toEqual('ab');
|
|
|
|
expect(result.isNew).toEqual(true);
|
|
|
|
expect(result.userVisible).toEqual(true);
|
|
|
|
expect(result.userAssignable).toEqual(true);
|
2016-05-11 17:47:33 +03:00
|
|
|
expect(result.canAssign).toEqual(true);
|
2016-02-02 12:42:35 +03:00
|
|
|
});
|
2016-01-21 17:23:49 +03:00
|
|
|
it('creates the real tag and fires select event after user selects the dummy tag', function() {
|
|
|
|
var selectHandler = sinon.stub();
|
|
|
|
view.on('select', selectHandler);
|
|
|
|
var createStub = sinon.stub(OC.SystemTags.SystemTagsCollection.prototype, 'create');
|
|
|
|
view.$el.find('input').trigger(new $.Event('select2-selecting', {
|
|
|
|
object: {
|
|
|
|
id: -1,
|
|
|
|
name: 'newname',
|
|
|
|
isNew: true
|
|
|
|
}
|
|
|
|
}));
|
|
|
|
|
|
|
|
expect(createStub.calledOnce).toEqual(true);
|
|
|
|
expect(createStub.getCall(0).args[0]).toEqual({
|
|
|
|
name: 'newname',
|
|
|
|
userVisible: true,
|
2016-05-11 17:47:33 +03:00
|
|
|
userAssignable: true,
|
|
|
|
canAssign: true
|
2016-01-21 17:23:49 +03:00
|
|
|
});
|
2015-11-30 17:40:17 +03:00
|
|
|
|
2016-01-21 17:23:49 +03:00
|
|
|
var newModel = new OC.SystemTags.SystemTagModel({
|
|
|
|
id: '123',
|
|
|
|
name: 'newname',
|
|
|
|
userVisible: true,
|
2016-05-11 17:47:33 +03:00
|
|
|
userAssignable: true,
|
|
|
|
canAssign: true
|
2016-01-21 17:23:49 +03:00
|
|
|
});
|
2015-11-30 17:40:17 +03:00
|
|
|
|
2016-01-21 17:23:49 +03:00
|
|
|
// not called yet
|
|
|
|
expect(selectHandler.notCalled).toEqual(true);
|
2015-11-30 17:40:17 +03:00
|
|
|
|
2016-01-21 17:23:49 +03:00
|
|
|
select2Stub.withArgs('data').returns([{
|
2015-11-30 17:40:17 +03:00
|
|
|
id: '1',
|
|
|
|
name: 'abc'
|
2016-01-21 17:23:49 +03:00
|
|
|
}]);
|
2015-11-30 17:40:17 +03:00
|
|
|
|
2016-01-21 17:23:49 +03:00
|
|
|
createStub.yieldTo('success', newModel);
|
2015-11-30 17:40:17 +03:00
|
|
|
|
2016-01-21 17:23:49 +03:00
|
|
|
expect(select2Stub.lastCall.args[0]).toEqual('data');
|
|
|
|
expect(select2Stub.lastCall.args[1]).toEqual([{
|
|
|
|
id: '1',
|
|
|
|
name: 'abc'
|
|
|
|
},
|
|
|
|
newModel.toJSON()
|
|
|
|
]);
|
2015-11-30 17:40:17 +03:00
|
|
|
|
2016-01-21 17:23:49 +03:00
|
|
|
expect(selectHandler.calledOnce).toEqual(true);
|
|
|
|
expect(selectHandler.getCall(0).args[0]).toEqual(newModel);
|
2015-11-30 17:40:17 +03:00
|
|
|
|
2016-01-21 17:23:49 +03:00
|
|
|
createStub.restore();
|
|
|
|
});
|
|
|
|
it('triggers select event after selecting an existing tag', function() {
|
|
|
|
var selectHandler = sinon.stub();
|
|
|
|
view.on('select', selectHandler);
|
|
|
|
view.$el.find('input').trigger(new $.Event('select2-selecting', {
|
|
|
|
object: {
|
|
|
|
id: '2',
|
|
|
|
name: 'def'
|
|
|
|
}
|
|
|
|
}));
|
|
|
|
|
|
|
|
expect(selectHandler.calledOnce).toEqual(true);
|
|
|
|
expect(selectHandler.getCall(0).args[0]).toEqual(view.collection.get('2'));
|
|
|
|
});
|
|
|
|
it('triggers deselect event after deselecting an existing tag', function() {
|
|
|
|
var selectHandler = sinon.stub();
|
|
|
|
view.on('deselect', selectHandler);
|
|
|
|
view.$el.find('input').trigger(new $.Event('select2-removing', {
|
|
|
|
choice: {
|
|
|
|
id: '2',
|
|
|
|
name: 'def'
|
|
|
|
}
|
|
|
|
}));
|
|
|
|
|
|
|
|
expect(selectHandler.calledOnce).toEqual(true);
|
|
|
|
expect(selectHandler.getCall(0).args[0]).toEqual('2');
|
2015-11-30 17:40:17 +03:00
|
|
|
});
|
2016-01-27 17:09:59 +03:00
|
|
|
it('triggers select event and still adds to list even in case of conflict', function() {
|
|
|
|
var selectHandler = sinon.stub();
|
|
|
|
view.on('select', selectHandler);
|
|
|
|
var fetchStub = sinon.stub(OC.SystemTags.SystemTagsCollection.prototype, 'fetch');
|
|
|
|
var createStub = sinon.stub(OC.SystemTags.SystemTagsCollection.prototype, 'create');
|
|
|
|
view.$el.find('input').trigger(new $.Event('select2-selecting', {
|
|
|
|
object: {
|
|
|
|
id: -1,
|
|
|
|
name: 'newname',
|
|
|
|
isNew: true
|
|
|
|
}
|
|
|
|
}));
|
|
|
|
|
|
|
|
expect(createStub.calledOnce).toEqual(true);
|
|
|
|
expect(createStub.getCall(0).args[0]).toEqual({
|
|
|
|
name: 'newname',
|
|
|
|
userVisible: true,
|
2016-05-11 17:47:33 +03:00
|
|
|
userAssignable: true,
|
|
|
|
canAssign: true
|
2016-01-27 17:09:59 +03:00
|
|
|
});
|
|
|
|
|
|
|
|
var newModel = new OC.SystemTags.SystemTagModel({
|
|
|
|
id: '123',
|
|
|
|
name: 'newname',
|
|
|
|
userVisible: true,
|
|
|
|
userAssignable: true
|
|
|
|
});
|
|
|
|
|
|
|
|
// not called yet
|
|
|
|
expect(selectHandler.notCalled).toEqual(true);
|
|
|
|
|
|
|
|
select2Stub.withArgs('data').returns([{
|
|
|
|
id: '1',
|
|
|
|
name: 'abc'
|
|
|
|
}]);
|
|
|
|
|
|
|
|
// simulate conflict response for tag creation
|
|
|
|
createStub.yieldTo('error', view.collection, {status: 409});
|
|
|
|
|
|
|
|
// at this point it fetches from the server
|
|
|
|
expect(fetchStub.calledOnce).toEqual(true);
|
|
|
|
// simulate fetch result by adding model to the collection
|
|
|
|
view.collection.add(newModel);
|
|
|
|
fetchStub.yieldTo('success', view.collection);
|
|
|
|
|
|
|
|
expect(select2Stub.lastCall.args[0]).toEqual('data');
|
|
|
|
expect(select2Stub.lastCall.args[1]).toEqual([{
|
|
|
|
id: '1',
|
|
|
|
name: 'abc'
|
|
|
|
},
|
|
|
|
newModel.toJSON()
|
|
|
|
]);
|
|
|
|
|
|
|
|
// select event still called
|
|
|
|
expect(selectHandler.calledOnce).toEqual(true);
|
|
|
|
expect(selectHandler.getCall(0).args[0]).toEqual(newModel);
|
|
|
|
|
|
|
|
createStub.restore();
|
|
|
|
fetchStub.restore();
|
|
|
|
});
|
2015-11-30 17:40:17 +03:00
|
|
|
});
|
2016-01-21 17:23:49 +03:00
|
|
|
describe('tag actions', function() {
|
|
|
|
var opts;
|
2015-11-30 17:40:17 +03:00
|
|
|
|
2016-01-21 17:23:49 +03:00
|
|
|
beforeEach(function() {
|
2015-11-30 17:40:17 +03:00
|
|
|
|
2016-01-21 17:23:49 +03:00
|
|
|
opts = select2Stub.getCall(0).args[0];
|
2015-11-30 17:40:17 +03:00
|
|
|
|
2016-01-21 17:23:49 +03:00
|
|
|
view.collection.add([
|
|
|
|
new OC.SystemTags.SystemTagModel({id: '1', name: 'abc'}),
|
|
|
|
]);
|
2015-11-30 17:40:17 +03:00
|
|
|
|
2016-01-21 17:23:49 +03:00
|
|
|
$dropdown.append(opts.formatResult(view.collection.get('1').toJSON()));
|
2015-11-30 17:40:17 +03:00
|
|
|
|
2016-01-21 17:23:49 +03:00
|
|
|
});
|
|
|
|
it('displays rename form when clicking rename', function() {
|
|
|
|
$dropdown.find('.rename').mouseup();
|
|
|
|
expect($dropdown.find('form.systemtags-rename-form').length).toEqual(1);
|
|
|
|
expect($dropdown.find('form.systemtags-rename-form input').val()).toEqual('abc');
|
|
|
|
});
|
|
|
|
it('renames model and submits change when submitting form', function() {
|
|
|
|
var saveStub = sinon.stub(OC.SystemTags.SystemTagModel.prototype, 'save');
|
|
|
|
$dropdown.find('.rename').mouseup();
|
|
|
|
$dropdown.find('form input').val('abc_renamed');
|
|
|
|
$dropdown.find('form').trigger(new $.Event('submit'));
|
2015-11-30 17:40:17 +03:00
|
|
|
|
2016-01-21 17:23:49 +03:00
|
|
|
expect(saveStub.calledOnce).toEqual(true);
|
|
|
|
expect(saveStub.getCall(0).args[0]).toEqual({'name': 'abc_renamed'});
|
2015-11-30 17:40:17 +03:00
|
|
|
|
2016-01-21 17:23:49 +03:00
|
|
|
expect($dropdown.find('.label').text()).toEqual('abc_renamed');
|
|
|
|
expect($dropdown.find('form').length).toEqual(0);
|
2015-11-30 17:40:17 +03:00
|
|
|
|
2016-01-21 17:23:49 +03:00
|
|
|
saveStub.restore();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
describe('setting data', function() {
|
|
|
|
it('sets value when calling setValues', function() {
|
|
|
|
var vals = ['1', '2'];
|
|
|
|
view.setValues(vals);
|
|
|
|
expect(select2Stub.lastCall.args[0]).toEqual('val');
|
|
|
|
expect(select2Stub.lastCall.args[1]).toEqual(vals);
|
|
|
|
});
|
|
|
|
it('sets data when calling setData', function() {
|
|
|
|
var vals = [{id: '1', name: 'test1'}, {id: '2', name: 'test2'}];
|
|
|
|
view.setData(vals);
|
|
|
|
expect(select2Stub.lastCall.args[0]).toEqual('data');
|
|
|
|
expect(select2Stub.lastCall.args[1]).toEqual(vals);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
2015-11-30 17:40:17 +03:00
|
|
|
|
2016-01-21 17:23:49 +03:00
|
|
|
describe('as admin', function() {
|
2016-12-06 19:50:57 +03:00
|
|
|
var $dropdown;
|
|
|
|
|
2016-01-21 17:23:49 +03:00
|
|
|
beforeEach(function() {
|
|
|
|
view = new OC.SystemTags.SystemTagsInputField({
|
|
|
|
isAdmin: true
|
|
|
|
});
|
|
|
|
$('.testInputContainer').append(view.$el);
|
2016-12-06 19:50:57 +03:00
|
|
|
$dropdown = $('<div class="select2-dropdown"></div>');
|
|
|
|
select2Stub.withArgs('dropdown').returns($dropdown);
|
|
|
|
$('#testArea').append($dropdown);
|
|
|
|
|
|
|
|
view.render();
|
2016-01-21 17:23:49 +03:00
|
|
|
});
|
|
|
|
it('formatResult renders tag name with visibility', function() {
|
|
|
|
var opts = select2Stub.getCall(0).args[0];
|
|
|
|
var $el = $(opts.formatResult({id: '1', name: 'test', userVisible: false, userAssignable: false}));
|
2016-01-27 17:49:11 +03:00
|
|
|
expect($el.find('.label').text()).toEqual('test (invisible)');
|
2016-01-21 17:23:49 +03:00
|
|
|
});
|
|
|
|
it('formatSelection renders tag name with visibility', function() {
|
|
|
|
var opts = select2Stub.getCall(0).args[0];
|
|
|
|
var $el = $(opts.formatSelection({id: '1', name: 'test', userVisible: false, userAssignable: false}));
|
2016-01-27 17:49:11 +03:00
|
|
|
expect($el.text().trim()).toEqual('test (invisible)');
|
2016-01-21 17:23:49 +03:00
|
|
|
});
|
|
|
|
describe('initSelection', function() {
|
|
|
|
var fetchStub;
|
|
|
|
var testTags;
|
|
|
|
|
|
|
|
beforeEach(function() {
|
|
|
|
fetchStub = sinon.stub(OC.SystemTags.SystemTagsCollection.prototype, 'fetch');
|
|
|
|
testTags = [
|
|
|
|
new OC.SystemTags.SystemTagModel({id: '1', name: 'test1'}),
|
|
|
|
new OC.SystemTags.SystemTagModel({id: '2', name: 'test2'}),
|
2016-05-11 17:47:33 +03:00
|
|
|
new OC.SystemTags.SystemTagModel({id: '3', name: 'test3', userAssignable: false, canAssign: false}),
|
|
|
|
new OC.SystemTags.SystemTagModel({id: '4', name: 'test4', userAssignable: false, canAssign: true})
|
2016-01-21 17:23:49 +03:00
|
|
|
];
|
|
|
|
});
|
|
|
|
afterEach(function() {
|
|
|
|
fetchStub.restore();
|
|
|
|
});
|
|
|
|
it('grabs values from the full collection', function() {
|
|
|
|
var $el = view.$el.find('input');
|
2016-05-11 17:47:33 +03:00
|
|
|
$el.val('1,3,4');
|
2016-01-21 17:23:49 +03:00
|
|
|
var opts = select2Stub.getCall(0).args[0];
|
|
|
|
var callback = sinon.stub();
|
|
|
|
opts.initSelection($el, callback);
|
|
|
|
|
|
|
|
expect(fetchStub.calledOnce).toEqual(true);
|
|
|
|
view.collection.add(testTags);
|
|
|
|
fetchStub.yieldTo('success', view.collection);
|
|
|
|
|
|
|
|
expect(callback.calledOnce).toEqual(true);
|
|
|
|
var models = callback.getCall(0).args[0];
|
2016-05-11 17:47:33 +03:00
|
|
|
expect(models.length).toEqual(3);
|
2016-01-21 17:23:49 +03:00
|
|
|
expect(models[0].id).toEqual('1');
|
|
|
|
expect(models[0].name).toEqual('test1');
|
2016-05-11 17:47:33 +03:00
|
|
|
expect(models[0].locked).toBeFalsy();
|
2016-01-21 17:23:49 +03:00
|
|
|
expect(models[1].id).toEqual('3');
|
|
|
|
expect(models[1].name).toEqual('test3');
|
2016-05-11 17:47:33 +03:00
|
|
|
expect(models[1].locked).toBeFalsy();
|
|
|
|
expect(models[2].id).toEqual('4');
|
|
|
|
expect(models[2].name).toEqual('test4');
|
|
|
|
expect(models[2].locked).toBeFalsy();
|
2016-01-21 17:23:49 +03:00
|
|
|
});
|
|
|
|
});
|
|
|
|
describe('autocomplete', function() {
|
|
|
|
var fetchStub, opts;
|
|
|
|
|
|
|
|
beforeEach(function() {
|
|
|
|
fetchStub = sinon.stub(OC.SystemTags.SystemTagsCollection.prototype, 'fetch');
|
|
|
|
opts = select2Stub.getCall(0).args[0];
|
|
|
|
|
|
|
|
view.collection.add([
|
|
|
|
new OC.SystemTags.SystemTagModel({id: '1', name: 'abc'}),
|
|
|
|
new OC.SystemTags.SystemTagModel({id: '2', name: 'def'}),
|
2016-05-11 17:47:33 +03:00
|
|
|
new OC.SystemTags.SystemTagModel({id: '3', name: 'abd', userAssignable: false, canAssign: false}),
|
2016-02-14 22:41:39 +03:00
|
|
|
new OC.SystemTags.SystemTagModel({id: '4', name: 'Deg'}),
|
2016-01-21 17:23:49 +03:00
|
|
|
]);
|
|
|
|
});
|
|
|
|
afterEach(function() {
|
|
|
|
fetchStub.restore();
|
|
|
|
});
|
|
|
|
it('completes results', function() {
|
|
|
|
var callback = sinon.stub();
|
|
|
|
opts.query({
|
|
|
|
term: 'ab',
|
|
|
|
callback: callback
|
|
|
|
});
|
|
|
|
expect(fetchStub.calledOnce).toEqual(true);
|
|
|
|
|
|
|
|
fetchStub.yieldTo('success', view.collection);
|
|
|
|
|
|
|
|
expect(callback.calledOnce).toEqual(true);
|
|
|
|
expect(callback.getCall(0).args[0].results).toEqual([
|
|
|
|
{
|
|
|
|
id: '1',
|
|
|
|
name: 'abc',
|
|
|
|
userVisible: true,
|
2016-05-11 17:47:33 +03:00
|
|
|
userAssignable: true,
|
|
|
|
canAssign: true
|
2016-01-21 17:23:49 +03:00
|
|
|
},
|
|
|
|
{
|
|
|
|
id: '3',
|
|
|
|
name: 'abd',
|
|
|
|
userVisible: true,
|
2016-05-11 17:47:33 +03:00
|
|
|
userAssignable: false,
|
|
|
|
canAssign: false
|
2016-01-21 17:23:49 +03:00
|
|
|
}
|
|
|
|
]);
|
|
|
|
});
|
2016-02-14 22:41:39 +03:00
|
|
|
it('completes case insensitive', function() {
|
|
|
|
var callback = sinon.stub();
|
|
|
|
opts.query({
|
|
|
|
term: 'de',
|
|
|
|
callback: callback
|
|
|
|
});
|
|
|
|
expect(fetchStub.calledOnce).toEqual(true);
|
|
|
|
|
|
|
|
fetchStub.yieldTo('success', view.collection);
|
|
|
|
|
|
|
|
expect(callback.calledOnce).toEqual(true);
|
|
|
|
expect(callback.getCall(0).args[0].results).toEqual([
|
|
|
|
{
|
|
|
|
id: '2',
|
|
|
|
name: 'def',
|
|
|
|
userVisible: true,
|
2016-05-11 17:47:33 +03:00
|
|
|
userAssignable: true,
|
|
|
|
canAssign: true
|
2016-02-14 22:41:39 +03:00
|
|
|
},
|
|
|
|
{
|
|
|
|
id: '4',
|
|
|
|
name: 'Deg',
|
|
|
|
userVisible: true,
|
2016-05-11 17:47:33 +03:00
|
|
|
userAssignable: true,
|
|
|
|
canAssign: true
|
2016-02-14 22:41:39 +03:00
|
|
|
}
|
|
|
|
]);
|
|
|
|
});
|
2015-11-30 17:40:17 +03:00
|
|
|
});
|
2016-12-06 19:50:57 +03:00
|
|
|
describe('tag actions', function() {
|
|
|
|
var opts;
|
|
|
|
|
|
|
|
beforeEach(function() {
|
|
|
|
|
|
|
|
opts = select2Stub.getCall(0).args[0];
|
|
|
|
|
|
|
|
view.collection.add([
|
|
|
|
new OC.SystemTags.SystemTagModel({id: '1', name: 'abc'}),
|
|
|
|
]);
|
|
|
|
|
|
|
|
$dropdown.append(opts.formatResult(view.collection.get('1').toJSON()));
|
|
|
|
|
|
|
|
});
|
|
|
|
it('deletes model and submits change when clicking delete', function() {
|
|
|
|
var destroyStub = sinon.stub(OC.SystemTags.SystemTagModel.prototype, 'destroy');
|
|
|
|
|
|
|
|
expect($dropdown.find('.delete').length).toEqual(0);
|
|
|
|
$dropdown.find('.rename').mouseup();
|
|
|
|
// delete button appears
|
|
|
|
expect($dropdown.find('.delete').length).toEqual(1);
|
|
|
|
$dropdown.find('.delete').mouseup();
|
|
|
|
|
|
|
|
expect(destroyStub.calledOnce).toEqual(true);
|
|
|
|
expect(destroyStub.calledOn(view.collection.get('1')));
|
|
|
|
|
|
|
|
destroyStub.restore();
|
|
|
|
});
|
|
|
|
});
|
2015-11-30 17:40:17 +03:00
|
|
|
});
|
2016-01-21 17:23:49 +03:00
|
|
|
|
|
|
|
describe('as user', function() {
|
2016-12-06 19:50:57 +03:00
|
|
|
var $dropdown;
|
|
|
|
|
2015-11-30 17:40:17 +03:00
|
|
|
beforeEach(function() {
|
2016-01-21 17:23:49 +03:00
|
|
|
view = new OC.SystemTags.SystemTagsInputField({
|
|
|
|
isAdmin: false
|
|
|
|
});
|
|
|
|
$('.testInputContainer').append(view.$el);
|
2016-12-06 19:50:57 +03:00
|
|
|
$dropdown = $('<div class="select2-dropdown"></div>');
|
|
|
|
select2Stub.withArgs('dropdown').returns($dropdown);
|
|
|
|
$('#testArea').append($dropdown);
|
|
|
|
|
|
|
|
view.render();
|
2015-11-30 17:40:17 +03:00
|
|
|
});
|
2016-01-21 17:23:49 +03:00
|
|
|
it('formatResult renders tag name only', function() {
|
|
|
|
var opts = select2Stub.getCall(0).args[0];
|
|
|
|
var $el = $(opts.formatResult({id: '1', name: 'test'}));
|
|
|
|
expect($el.find('.label').text()).toEqual('test');
|
|
|
|
});
|
|
|
|
it('formatSelection renders tag name only', function() {
|
|
|
|
var opts = select2Stub.getCall(0).args[0];
|
|
|
|
var $el = $(opts.formatSelection({id: '1', name: 'test'}));
|
2016-01-27 17:49:11 +03:00
|
|
|
expect($el.text().trim()).toEqual('test');
|
2016-01-21 17:23:49 +03:00
|
|
|
});
|
|
|
|
describe('initSelection', function() {
|
|
|
|
var fetchStub;
|
|
|
|
var testTags;
|
|
|
|
|
|
|
|
beforeEach(function() {
|
|
|
|
fetchStub = sinon.stub(OC.SystemTags.SystemTagsCollection.prototype, 'fetch');
|
|
|
|
testTags = [
|
|
|
|
new OC.SystemTags.SystemTagModel({id: '1', name: 'test1'}),
|
|
|
|
new OC.SystemTags.SystemTagModel({id: '2', name: 'test2'}),
|
2016-05-11 17:47:33 +03:00
|
|
|
new OC.SystemTags.SystemTagModel({id: '3', name: 'test3', userAssignable: false, canAssign: false}),
|
|
|
|
new OC.SystemTags.SystemTagModel({id: '4', name: 'test4', userAssignable: false, canAssign: true})
|
2016-01-21 17:23:49 +03:00
|
|
|
];
|
|
|
|
view.render();
|
|
|
|
});
|
|
|
|
afterEach(function() {
|
|
|
|
fetchStub.restore();
|
|
|
|
});
|
|
|
|
it('grabs values from the full collection', function() {
|
|
|
|
var $el = view.$el.find('input');
|
2016-05-11 17:47:33 +03:00
|
|
|
$el.val('1,3,4');
|
2016-01-21 17:23:49 +03:00
|
|
|
var opts = select2Stub.getCall(0).args[0];
|
|
|
|
var callback = sinon.stub();
|
|
|
|
opts.initSelection($el, callback);
|
|
|
|
|
|
|
|
expect(fetchStub.calledOnce).toEqual(true);
|
|
|
|
view.collection.add(testTags);
|
|
|
|
fetchStub.yieldTo('success', view.collection);
|
|
|
|
|
|
|
|
expect(callback.calledOnce).toEqual(true);
|
|
|
|
var models = callback.getCall(0).args[0];
|
2016-05-11 17:47:33 +03:00
|
|
|
expect(models.length).toEqual(3);
|
2016-01-21 17:23:49 +03:00
|
|
|
expect(models[0].id).toEqual('1');
|
|
|
|
expect(models[0].name).toEqual('test1');
|
2016-05-11 17:47:33 +03:00
|
|
|
expect(models[0].locked).toBeFalsy();
|
2016-01-21 17:23:49 +03:00
|
|
|
expect(models[1].id).toEqual('3');
|
|
|
|
expect(models[1].name).toEqual('test3');
|
2016-05-18 12:23:23 +03:00
|
|
|
// restricted / cannot assign locks the entry
|
2016-05-11 17:47:33 +03:00
|
|
|
expect(models[1].locked).toEqual(true);
|
|
|
|
expect(models[2].id).toEqual('4');
|
|
|
|
expect(models[2].name).toEqual('test4');
|
|
|
|
expect(models[2].locked).toBeFalsy();
|
2016-01-21 17:23:49 +03:00
|
|
|
});
|
2015-11-30 17:40:17 +03:00
|
|
|
});
|
2016-01-21 17:23:49 +03:00
|
|
|
describe('autocomplete', function() {
|
|
|
|
var fetchStub, opts;
|
|
|
|
|
|
|
|
beforeEach(function() {
|
|
|
|
fetchStub = sinon.stub(OC.SystemTags.SystemTagsCollection.prototype, 'fetch');
|
|
|
|
view.render();
|
|
|
|
opts = select2Stub.getCall(0).args[0];
|
|
|
|
|
|
|
|
view.collection.add([
|
|
|
|
new OC.SystemTags.SystemTagModel({id: '1', name: 'abc'}),
|
|
|
|
new OC.SystemTags.SystemTagModel({id: '2', name: 'def'}),
|
2016-05-11 17:47:33 +03:00
|
|
|
new OC.SystemTags.SystemTagModel({id: '3', name: 'abd', userAssignable: false, canAssign: false}),
|
2016-02-14 22:41:39 +03:00
|
|
|
new OC.SystemTags.SystemTagModel({id: '4', name: 'Deg'}),
|
2016-05-11 17:47:33 +03:00
|
|
|
new OC.SystemTags.SystemTagModel({id: '5', name: 'abe', userAssignable: false, canAssign: true})
|
2016-01-21 17:23:49 +03:00
|
|
|
]);
|
|
|
|
});
|
|
|
|
afterEach(function() {
|
|
|
|
fetchStub.restore();
|
|
|
|
});
|
|
|
|
it('completes results excluding non-assignable tags', function() {
|
|
|
|
var callback = sinon.stub();
|
|
|
|
opts.query({
|
|
|
|
term: 'ab',
|
|
|
|
callback: callback
|
|
|
|
});
|
|
|
|
expect(fetchStub.calledOnce).toEqual(true);
|
|
|
|
|
|
|
|
fetchStub.yieldTo('success', view.collection);
|
|
|
|
|
|
|
|
expect(callback.calledOnce).toEqual(true);
|
|
|
|
expect(callback.getCall(0).args[0].results).toEqual([
|
|
|
|
{
|
|
|
|
id: '1',
|
|
|
|
name: 'abc',
|
|
|
|
userVisible: true,
|
2016-05-11 17:47:33 +03:00
|
|
|
userAssignable: true,
|
|
|
|
canAssign: true
|
|
|
|
},
|
|
|
|
{
|
|
|
|
id: '5',
|
|
|
|
name: 'abe',
|
|
|
|
userVisible: true,
|
|
|
|
userAssignable: false,
|
|
|
|
canAssign: true
|
2016-01-21 17:23:49 +03:00
|
|
|
}
|
|
|
|
]);
|
|
|
|
});
|
2016-02-14 22:41:39 +03:00
|
|
|
it('completes case insensitive', function() {
|
|
|
|
var callback = sinon.stub();
|
|
|
|
opts.query({
|
|
|
|
term: 'de',
|
|
|
|
callback: callback
|
|
|
|
});
|
|
|
|
expect(fetchStub.calledOnce).toEqual(true);
|
|
|
|
|
|
|
|
fetchStub.yieldTo('success', view.collection);
|
|
|
|
|
|
|
|
expect(callback.calledOnce).toEqual(true);
|
|
|
|
expect(callback.getCall(0).args[0].results).toEqual([
|
|
|
|
{
|
|
|
|
id: '2',
|
|
|
|
name: 'def',
|
|
|
|
userVisible: true,
|
2016-05-11 17:47:33 +03:00
|
|
|
userAssignable: true,
|
|
|
|
canAssign: true
|
2016-02-14 22:41:39 +03:00
|
|
|
},
|
|
|
|
{
|
|
|
|
id: '4',
|
|
|
|
name: 'Deg',
|
|
|
|
userVisible: true,
|
2016-05-11 17:47:33 +03:00
|
|
|
userAssignable: true,
|
|
|
|
canAssign: true
|
2016-02-14 22:41:39 +03:00
|
|
|
}
|
|
|
|
]);
|
|
|
|
});
|
2015-11-30 17:40:17 +03:00
|
|
|
});
|
2016-12-06 19:50:57 +03:00
|
|
|
describe('tag actions', function() {
|
|
|
|
var opts;
|
|
|
|
|
|
|
|
beforeEach(function() {
|
|
|
|
|
|
|
|
opts = select2Stub.getCall(0).args[0];
|
|
|
|
|
|
|
|
view.collection.add([
|
|
|
|
new OC.SystemTags.SystemTagModel({id: '1', name: 'abc'}),
|
|
|
|
]);
|
|
|
|
|
|
|
|
$dropdown.append(opts.formatResult(view.collection.get('1').toJSON()));
|
|
|
|
|
|
|
|
});
|
|
|
|
it('deletes model and submits change when clicking delete', function() {
|
|
|
|
var destroyStub = sinon.stub(OC.SystemTags.SystemTagModel.prototype, 'destroy');
|
|
|
|
|
|
|
|
expect($dropdown.find('.delete').length).toEqual(0);
|
|
|
|
$dropdown.find('.rename').mouseup();
|
|
|
|
// delete button appears only for admins
|
|
|
|
expect($dropdown.find('.delete').length).toEqual(0);
|
|
|
|
$dropdown.find('.delete').mouseup();
|
|
|
|
|
|
|
|
expect(destroyStub.notCalled).toEqual(true);
|
|
|
|
|
|
|
|
destroyStub.restore();
|
|
|
|
});
|
|
|
|
});
|
2015-11-30 17:40:17 +03:00
|
|
|
});
|
|
|
|
});
|