mirror of
https://github.com/nextcloud/server.git
synced 2026-04-22 23:03:00 -04:00
test: cleanup karma (jsunit) tests and move files_external to Cypress
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
This commit is contained in:
parent
4cd026ad43
commit
db7b0ae154
5 changed files with 132 additions and 756 deletions
|
|
@ -1,84 +0,0 @@
|
|||
/**
|
||||
* SPDX-FileCopyrightText: 2014 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
import $ from 'jquery'
|
||||
|
||||
describe('OCA.Files_External.App tests', function() {
|
||||
const App = OCA.Files_External.App
|
||||
let fileList
|
||||
|
||||
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-extstoragemounts" class="hidden">'
|
||||
+ '</div>'
|
||||
+ '</div>'
|
||||
+ '</div>',
|
||||
)
|
||||
fileList = App.initList($('#app-content-extstoragemounts'))
|
||||
})
|
||||
afterEach(function() {
|
||||
App.fileList = null
|
||||
fileList.destroy()
|
||||
fileList = null
|
||||
})
|
||||
|
||||
describe('initialization', function() {
|
||||
it('inits external mounts list on show', function() {
|
||||
expect(App.fileList).toBeDefined()
|
||||
})
|
||||
})
|
||||
describe('file actions', function() {
|
||||
it('provides default file actions', function() {
|
||||
const fileActions = fileList.fileActions
|
||||
|
||||
expect(fileActions.actions.all).toBeDefined()
|
||||
expect(fileActions.actions.all.Delete).toBeDefined()
|
||||
expect(fileActions.actions.all.Rename).toBeDefined()
|
||||
expect(fileActions.actions.all.Download).toBeDefined()
|
||||
|
||||
expect(fileActions.defaults.dir).toEqual('Open')
|
||||
})
|
||||
it('redirects to files app when opening a directory', function() {
|
||||
const 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>'))
|
||||
|
||||
const setActiveViewStub = sinon.stub(OCA.Files.App, 'setActiveView')
|
||||
// create dummy table so we can click the dom
|
||||
const $table = '<table><thead></thead><tbody class="files-fileList"></tbody></table>'
|
||||
$('#app-content-extstoragemounts').append($table)
|
||||
|
||||
App._inFileList = null
|
||||
fileList = App.initList($('#app-content-extstoragemounts'))
|
||||
|
||||
fileList.setFiles([{
|
||||
name: 'testdir',
|
||||
type: 'dir',
|
||||
path: '/somewhere/inside/subdir',
|
||||
counterParts: ['user2'],
|
||||
shareOwner: 'user2',
|
||||
}])
|
||||
|
||||
fileList.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
|
||||
})
|
||||
})
|
||||
})
|
||||
|
|
@ -1,148 +0,0 @@
|
|||
/**
|
||||
* SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-FileCopyrightText: 2014-2016 ownCloud, Inc.
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
describe('OCA.Files_External.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">' +
|
||||
// init horrible parameters
|
||||
'<input type="hidden" id="permissions" value="31"></input>' +
|
||||
// dummy controls
|
||||
'<div class="files-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 class="files-filestable">' +
|
||||
'<thead><tr>' +
|
||||
'<th class="hidden column-name">' +
|
||||
' <div id="column-name-container">' +
|
||||
' <a class="name sort columntitle" data-sort="name"><span>Name</span><span class="sort-indicator"></span></a>' +
|
||||
' </div>' +
|
||||
'</th>' +
|
||||
'<th id="headerBackend" class="hidden column-backend">' +
|
||||
' <a class="backend sort columntitle" data-sort="backend"><span>Storage type</span><span class="sort-indicator"></span></a>' +
|
||||
'</th>' +
|
||||
'<th id="headerScope" class="hidden column-scope column-last">' +
|
||||
' <a class="scope sort columntitle" data-sort="scope"><span>Scope</span><span class="sort-indicator"></span></a>' +
|
||||
'</th>' +
|
||||
'</tr></thead>' +
|
||||
'<tbody class="files-fileList"></tbody>' +
|
||||
'<tfoot></tfoot>' +
|
||||
'</table>' +
|
||||
'<div class="emptyfilelist emptycontent">Empty content message</div>' +
|
||||
'</div>'
|
||||
);
|
||||
});
|
||||
afterEach(function() {
|
||||
testFiles = undefined;
|
||||
fileList.destroy();
|
||||
fileList = undefined;
|
||||
|
||||
notificationStub.restore();
|
||||
alertStub.restore();
|
||||
});
|
||||
|
||||
describe('loading file list for external storage', function() {
|
||||
var ocsResponse;
|
||||
var reloading;
|
||||
|
||||
beforeEach(function() {
|
||||
fileList = new OCA.Files_External.FileList(
|
||||
$('#app-content')
|
||||
);
|
||||
|
||||
reloading = fileList.reload();
|
||||
|
||||
/* jshint camelcase: false */
|
||||
ocsResponse = {
|
||||
ocs: {
|
||||
meta: {
|
||||
status: 'ok',
|
||||
statuscode: 100,
|
||||
message: null
|
||||
},
|
||||
data: [{
|
||||
name: 'smb mount',
|
||||
path: '/mount points',
|
||||
type: 'dir',
|
||||
backend: 'SMB',
|
||||
scope: 'personal',
|
||||
permissions: OC.PERMISSION_READ | OC.PERMISSION_DELETE
|
||||
}, {
|
||||
name: 'sftp mount',
|
||||
path: '/another mount points',
|
||||
type: 'dir',
|
||||
backend: 'SFTP',
|
||||
scope: 'system',
|
||||
permissions: OC.PERMISSION_READ
|
||||
}]
|
||||
}
|
||||
};
|
||||
});
|
||||
it('render storage list', function(done) {
|
||||
var request;
|
||||
var $rows;
|
||||
var $tr;
|
||||
|
||||
expect(fakeServer.requests.length).toEqual(1);
|
||||
request = fakeServer.requests[0];
|
||||
expect(request.url).toEqual(
|
||||
OC.linkToOCS('apps/files_external/api/v1') + 'mounts?format=json'
|
||||
);
|
||||
|
||||
fakeServer.requests[0].respond(
|
||||
200,
|
||||
{ 'Content-Type': 'application/json' },
|
||||
JSON.stringify(ocsResponse)
|
||||
);
|
||||
|
||||
return reloading.then(function() {
|
||||
$rows = fileList.$el.find('tbody tr');
|
||||
expect($rows.length).toEqual(2);
|
||||
|
||||
$tr = $rows.eq(0);
|
||||
expect($tr.attr('data-id')).not.toBeDefined();
|
||||
expect($tr.attr('data-type')).toEqual('dir');
|
||||
expect($tr.attr('data-file')).toEqual('sftp mount');
|
||||
expect($tr.attr('data-path')).toEqual('/another mount points');
|
||||
expect($tr.attr('data-size')).not.toBeDefined();
|
||||
expect($tr.attr('data-permissions')).toEqual('1'); // read only
|
||||
expect($tr.find('a.name').attr('href')).toEqual(
|
||||
OC.getRootPath() +
|
||||
'/index.php/apps/files' +
|
||||
'?dir=/another%20mount%20points/sftp%20mount'
|
||||
);
|
||||
expect($tr.find('.nametext').text().trim()).toEqual('sftp mount');
|
||||
expect($tr.find('.column-scope > span').text().trim()).toEqual('System');
|
||||
expect($tr.find('.column-backend').text().trim()).toEqual('SFTP');
|
||||
|
||||
$tr = $rows.eq(1);
|
||||
expect($tr.attr('data-id')).not.toBeDefined();
|
||||
expect($tr.attr('data-type')).toEqual('dir');
|
||||
expect($tr.attr('data-file')).toEqual('smb mount');
|
||||
expect($tr.attr('data-path')).toEqual('/mount points');
|
||||
expect($tr.attr('data-size')).not.toBeDefined();
|
||||
expect($tr.attr('data-permissions')).toEqual('9'); // read and delete
|
||||
expect($tr.find('a.name').attr('href')).toEqual(
|
||||
OC.getRootPath() +
|
||||
'/index.php/apps/files' +
|
||||
'?dir=/mount%20points/smb%20mount'
|
||||
);
|
||||
expect($tr.find('.nametext').text().trim()).toEqual('smb mount');
|
||||
expect($tr.find('.column-scope > span').text().trim()).toEqual('Personal');
|
||||
expect($tr.find('.column-backend').text().trim()).toEqual('SMB');
|
||||
}).then(done, done);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
@ -1,447 +0,0 @@
|
|||
/**
|
||||
* SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-FileCopyrightText: 2015-2016 ownCloud, Inc.
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
describe('OCA.Files_External.Settings tests', function() {
|
||||
var clock;
|
||||
var select2Stub;
|
||||
var select2ApplicableUsers;
|
||||
|
||||
beforeEach(function() {
|
||||
clock = sinon.useFakeTimers();
|
||||
select2ApplicableUsers = [];
|
||||
select2Stub = sinon.stub($.fn, 'select2').callsFake(function(args) {
|
||||
if (args === 'val') {
|
||||
return select2ApplicableUsers;
|
||||
}
|
||||
return {
|
||||
on: function() { return this; }
|
||||
};
|
||||
});
|
||||
|
||||
// view still requires an existing DOM table
|
||||
$('#testArea').append(
|
||||
'<table id="externalStorage" data-admin="true">' +
|
||||
'<thead></thead>' +
|
||||
'<tbody>' +
|
||||
'<tr id="addMountPoint" data-id="">' +
|
||||
'<td class="status"></td>' +
|
||||
'<td class="mountPoint"><input type="text" name="mountPoint"/></td>' +
|
||||
'<td class="backend">' +
|
||||
'<select class="selectBackend">' +
|
||||
'<option disable selected>Add storage</option>' +
|
||||
'<option value="\\OC\\TestBackend">Test Backend</option>' +
|
||||
'<option value="\\OC\\AnotherTestBackend">Another Test Backend</option>' +
|
||||
'<option value="\\OC\\InputsTestBackend">Inputs test backend</option>' +
|
||||
'</select>' +
|
||||
'</td>' +
|
||||
'<td class="authentication"></td>' +
|
||||
'<td class="configuration"></td>' +
|
||||
'<td class="applicable">' +
|
||||
'<input type="checkbox" class="applicableToAllUsers">' +
|
||||
'<input type="hidden" class="applicableUsers">' +
|
||||
'</td>' +
|
||||
'<td class="mountOptionsToggle">'+
|
||||
'<div class="icon-more" title="Advanced settings" deluminate_imagetype="unknown"></div>'+
|
||||
'<input type="hidden" class="mountOptions"/>'+
|
||||
'</td>'+
|
||||
'<td class="save">'+
|
||||
'<div class="icon-checkmark" title="Save" deluminate_imagetype="unknown"></div>'+
|
||||
'</td>'+
|
||||
'</tr>' +
|
||||
'</tbody>' +
|
||||
'</table>'
|
||||
);
|
||||
// these are usually appended into the data attribute
|
||||
// within the DOM by the server template
|
||||
$('#externalStorage .selectBackend:first').data('configurations', {
|
||||
'\\OC\\TestBackend': {
|
||||
'identifier': '\\OC\\TestBackend',
|
||||
'name': 'Test Backend',
|
||||
'configuration': {
|
||||
'field1': {
|
||||
'value': 'Display Name 1'
|
||||
},
|
||||
'field2': {
|
||||
'value': 'Display Name 2',
|
||||
'flags': 1
|
||||
}
|
||||
},
|
||||
'authSchemes': {
|
||||
'builtin': true,
|
||||
},
|
||||
'priority': 11
|
||||
},
|
||||
'\\OC\\AnotherTestBackend': {
|
||||
'identifier': '\\OC\\AnotherTestBackend',
|
||||
'name': 'Another Test Backend',
|
||||
'configuration': {
|
||||
'field1': {
|
||||
'value': 'Display Name 1'
|
||||
},
|
||||
'field2': {
|
||||
'value': 'Display Name 2',
|
||||
'flags': 1
|
||||
}
|
||||
},
|
||||
'authSchemes': {
|
||||
'builtin': true,
|
||||
},
|
||||
'priority': 12
|
||||
},
|
||||
'\\OC\\InputsTestBackend': {
|
||||
'identifier': '\\OC\\InputsTestBackend',
|
||||
'name': 'Inputs test backend',
|
||||
'configuration': {
|
||||
'field_text': {
|
||||
'value': 'Text field'
|
||||
},
|
||||
'field_password': {
|
||||
'value': ',Password field',
|
||||
'type': 2
|
||||
},
|
||||
'field_bool': {
|
||||
'value': 'Boolean field',
|
||||
'type': 1
|
||||
},
|
||||
'field_hidden': {
|
||||
'value': 'Hidden field',
|
||||
'type': 3
|
||||
},
|
||||
'field_text_optional': {
|
||||
'value': 'Text field optional',
|
||||
'flags': 1
|
||||
},
|
||||
'field_password_optional': {
|
||||
'value': 'Password field optional',
|
||||
'flags': 1,
|
||||
'type': 2
|
||||
}
|
||||
},
|
||||
'authSchemes': {
|
||||
'builtin': true,
|
||||
},
|
||||
'priority': 13
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
$('#externalStorage #addMountPoint .authentication:first').data('mechanisms', {
|
||||
'mechanism1': {
|
||||
'identifier': 'mechanism1',
|
||||
'name': 'Mechanism 1',
|
||||
'configuration': {
|
||||
},
|
||||
'scheme': 'builtin',
|
||||
'visibility': 3
|
||||
},
|
||||
});
|
||||
|
||||
});
|
||||
afterEach(function() {
|
||||
select2Stub.restore();
|
||||
clock.restore();
|
||||
});
|
||||
|
||||
describe('storage configuration', function() {
|
||||
var view;
|
||||
|
||||
function selectBackend(backendName) {
|
||||
view.$el.find('.selectBackend:first').val(backendName).trigger('change');
|
||||
view.$el.find('.applicableToAllUsers').prop('checked', true).trigger('change');
|
||||
}
|
||||
|
||||
beforeEach(function() {
|
||||
var $el = $('#externalStorage');
|
||||
view = new OCA.Files_External.Settings.MountConfigListView($el, {encryptionEnabled: false});
|
||||
});
|
||||
afterEach(function() {
|
||||
view = null;
|
||||
});
|
||||
describe('selecting backend', function() {
|
||||
it('populates the row and creates a new empty one', function() {
|
||||
selectBackend('\\OC\\TestBackend');
|
||||
var $firstRow = view.$el.find('tr:first');
|
||||
expect($firstRow.find('.backend').text()).toEqual('Test Backend');
|
||||
expect($firstRow.find('.selectBackend').length).toEqual(0);
|
||||
|
||||
// TODO: check "remove" button visibility
|
||||
|
||||
// the suggested mount point name
|
||||
expect($firstRow.find('[name=mountPoint]').val()).toEqual('TestBackend');
|
||||
|
||||
// TODO: check that the options have been created
|
||||
|
||||
// TODO: check select2 call on the ".applicableUsers" element
|
||||
|
||||
var $emptyRow = $firstRow.next('tr');
|
||||
expect($emptyRow.length).toEqual(1);
|
||||
expect($emptyRow.find('.selectBackend').length).toEqual(1);
|
||||
expect($emptyRow.find('.applicable select').length).toEqual(0);
|
||||
|
||||
// TODO: check "remove" button visibility
|
||||
});
|
||||
it('shows row even if selection row is hidden', function() {
|
||||
selectBackend('\\OC\\TestBackend');
|
||||
view.$el.find('tr#addMountPoint').hide();
|
||||
expect(view.$el.find('tr:first').is(':visible')).toBe(true);
|
||||
expect(view.$el.find('tr#addMountPoint').is(':visible')).toBe(false);
|
||||
});
|
||||
// TODO: test with personal mounts (no applicable fields)
|
||||
// TODO: test suggested mount point logic
|
||||
});
|
||||
describe('saving storages', function() {
|
||||
var $tr;
|
||||
|
||||
beforeEach(function() {
|
||||
selectBackend('\\OC\\TestBackend');
|
||||
$tr = view.$el.find('tr:first');
|
||||
});
|
||||
it('saves storage after clicking the save button', function() {
|
||||
var $field1 = $tr.find('input[data-parameter=field1]');
|
||||
expect($field1.length).toEqual(1);
|
||||
$field1.val('test');
|
||||
$field1.trigger(new $.Event('keyup', {keyCode: 97}));
|
||||
|
||||
var $mountOptionsField = $tr.find('input.mountOptions');
|
||||
expect($mountOptionsField.length).toEqual(1);
|
||||
$mountOptionsField.val(JSON.stringify({previews:true}));
|
||||
|
||||
var $saveButton = $tr.find('td.save .icon-checkmark');
|
||||
$saveButton.click();
|
||||
|
||||
expect(fakeServer.requests.length).toEqual(1);
|
||||
var request = fakeServer.requests[0];
|
||||
expect(request.url).toEqual(OC.getRootPath() + '/index.php/apps/files_external/globalstorages');
|
||||
expect(JSON.parse(request.requestBody)).toEqual({
|
||||
backend: '\\OC\\TestBackend',
|
||||
authMechanism: 'mechanism1',
|
||||
backendOptions: {
|
||||
'field1': 'test',
|
||||
'field2': ''
|
||||
},
|
||||
mountPoint: 'TestBackend',
|
||||
priority: 11,
|
||||
applicableUsers: [],
|
||||
applicableGroups: [],
|
||||
mountOptions: {
|
||||
'previews': true
|
||||
},
|
||||
testOnly: true
|
||||
});
|
||||
|
||||
// TODO: respond and check data-id
|
||||
});
|
||||
it('saves storage with applicable users', function() {
|
||||
var $field1 = $tr.find('input[data-parameter=field1]');
|
||||
expect($field1.length).toEqual(1);
|
||||
$field1.val('test');
|
||||
$field1.trigger(new $.Event('keyup', {keyCode: 97}));
|
||||
|
||||
$tr.find('.applicableToAllUsers').prop('checked', false).trigger('change');
|
||||
select2ApplicableUsers = ['user1', 'user2', 'group1(group)', 'group2(group)'];
|
||||
|
||||
var $saveButton = $tr.find('td.save .icon-checkmark');
|
||||
$saveButton.click();
|
||||
|
||||
expect(fakeServer.requests.length).toEqual(1);
|
||||
var request = fakeServer.requests[0];
|
||||
expect(request.url).toEqual(OC.getRootPath() + '/index.php/apps/files_external/globalstorages');
|
||||
expect(JSON.parse(request.requestBody)).toEqual({
|
||||
backend: '\\OC\\TestBackend',
|
||||
authMechanism: 'mechanism1',
|
||||
backendOptions: {
|
||||
'field1': 'test',
|
||||
'field2': ''
|
||||
},
|
||||
mountPoint: 'TestBackend',
|
||||
priority: 11,
|
||||
applicableUsers: ['user1', 'user2'],
|
||||
applicableGroups: ['group1', 'group2'],
|
||||
mountOptions: {
|
||||
encrypt: true,
|
||||
previews: true,
|
||||
enable_sharing: false,
|
||||
filesystem_check_changes: 1,
|
||||
encoding_compatibility: false,
|
||||
readonly: false,
|
||||
},
|
||||
testOnly: true
|
||||
});
|
||||
|
||||
// TODO: respond and check data-id
|
||||
});
|
||||
it('does not saves storage without applicable users and unchecked all users checkbox', function() {
|
||||
var $field1 = $tr.find('input[data-parameter=field1]');
|
||||
expect($field1.length).toEqual(1);
|
||||
$field1.val('test');
|
||||
$field1.trigger(new $.Event('keyup', {keyCode: 97}));
|
||||
|
||||
$tr.find('.applicableToAllUsers').prop('checked', false).trigger('change');
|
||||
|
||||
var $saveButton = $tr.find('td.save .icon-checkmark');
|
||||
$saveButton.click();
|
||||
|
||||
expect(fakeServer.requests.length).toEqual(0);
|
||||
});
|
||||
|
||||
it('saves storage after closing mount options popovermenu', function() {
|
||||
$tr.find('.mountOptionsToggle .icon-more').click();
|
||||
$tr.find('[name=previews]').trigger(new $.Event('keyup', {keyCode: 97}));
|
||||
$tr.find('input[data-parameter=field1]').val('test');
|
||||
|
||||
// does not save inside the popovermenu
|
||||
expect(fakeServer.requests.length).toEqual(0);
|
||||
|
||||
$('body').mouseup();
|
||||
|
||||
// but after closing the popovermenu
|
||||
expect(fakeServer.requests.length).toEqual(1);
|
||||
});
|
||||
// TODO: status indicator
|
||||
});
|
||||
describe('validate storage configuration', function() {
|
||||
var $tr;
|
||||
|
||||
beforeEach(function() {
|
||||
selectBackend('\\OC\\InputsTestBackend');
|
||||
$tr = view.$el.find('tr:first');
|
||||
});
|
||||
|
||||
it('lists missing fields in storage errors', function() {
|
||||
$tr.find('.applicableToAllUsers').prop('checked', false).trigger('change');
|
||||
var storage = view.getStorageConfig($tr);
|
||||
|
||||
expect(storage.errors).toEqual({
|
||||
backendOptions: ['field_text', 'field_password'],
|
||||
requiredApplicable: true,
|
||||
});
|
||||
});
|
||||
|
||||
it('does not list applicable when all users checkbox is ticked', function() {
|
||||
var storage = view.getStorageConfig($tr);
|
||||
|
||||
expect(storage.errors).toEqual({
|
||||
backendOptions: ['field_text', 'field_password']
|
||||
});
|
||||
});
|
||||
|
||||
it('highlights missing non-optional fields', function() {
|
||||
_.each([
|
||||
'field_text',
|
||||
'field_password'
|
||||
], function(param) {
|
||||
expect($tr.find('input[data-parameter='+param+']').hasClass('warning-input')).toBe(true);
|
||||
});
|
||||
_.each([
|
||||
'field_bool',
|
||||
'field_hidden',
|
||||
'field_text_optional',
|
||||
'field_password_optional'
|
||||
], function(param) {
|
||||
expect($tr.find('input[data-parameter='+param+']').hasClass('warning-input')).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
it('validates correct storage', function() {
|
||||
$tr.find('[name=mountPoint]').val('mountpoint');
|
||||
|
||||
$tr.find('input[data-parameter=field_text]').val('foo');
|
||||
$tr.find('input[data-parameter=field_password]').val('bar');
|
||||
$tr.find('input[data-parameter=field_text_optional]').val('foobar');
|
||||
// don't set field_password_optional
|
||||
$tr.find('input[data-parameter=field_hidden]').val('baz');
|
||||
|
||||
var storage = view.getStorageConfig($tr);
|
||||
|
||||
expect(storage.validate()).toBe(true);
|
||||
});
|
||||
|
||||
it('checks missing mount point', function() {
|
||||
$tr.find('[name=mountPoint]').val('');
|
||||
|
||||
$tr.find('input[data-parameter=field_text]').val('foo');
|
||||
$tr.find('input[data-parameter=field_password]').val('bar');
|
||||
|
||||
var storage = view.getStorageConfig($tr);
|
||||
|
||||
expect(storage.validate()).toBe(false);
|
||||
});
|
||||
});
|
||||
describe('update storage', function() {
|
||||
// TODO
|
||||
});
|
||||
describe('delete storage', function() {
|
||||
// TODO
|
||||
});
|
||||
describe('recheck storages', function() {
|
||||
// TODO
|
||||
});
|
||||
describe('mount options popovermenu', function() {
|
||||
var $tr;
|
||||
var $td;
|
||||
|
||||
beforeEach(function() {
|
||||
selectBackend('\\OC\\TestBackend');
|
||||
$tr = view.$el.find('tr:first');
|
||||
$td = $tr.find('.mountOptionsToggle');
|
||||
});
|
||||
|
||||
it('shows popovermenu when clicking on toggle button, hides when clicking outside', function() {
|
||||
$td.find('.icon-more').click();
|
||||
|
||||
expect($td.find('.popovermenu.open').length).toEqual(1);
|
||||
|
||||
$('body').mouseup();
|
||||
|
||||
expect($td.find('.popovermenu.open').length).toEqual(0);
|
||||
});
|
||||
|
||||
it('doesnt show the encryption option when encryption is disabled', function () {
|
||||
view._encryptionEnabled = false;
|
||||
$td.find('.icon-more').click();
|
||||
|
||||
expect($td.find('.popovermenu [name=encrypt]:visible').length).toEqual(0);
|
||||
|
||||
$('body').mouseup();
|
||||
|
||||
expect($td.find('.popovermenu.open').length).toEqual(0);
|
||||
});
|
||||
|
||||
it('reads config from mountOptions field', function() {
|
||||
$tr.find('input.mountOptions').val(JSON.stringify({previews:false}));
|
||||
|
||||
$td.find('.icon-more').click();
|
||||
expect($td.find('.popovermenu [name=previews]').prop('checked')).toEqual(false);
|
||||
$('body').mouseup();
|
||||
|
||||
$tr.find('input.mountOptions').val(JSON.stringify({previews:true}));
|
||||
$td.find('.icon-more').click();
|
||||
expect($td.find('.popovermenu [name=previews]').prop('checked')).toEqual(true);
|
||||
});
|
||||
|
||||
it('writes config into mountOptions field', function() {
|
||||
$td.find('.icon-more').click();
|
||||
// defaults to true
|
||||
var $field = $td.find('.popovermenu [name=previews]');
|
||||
expect($field.prop('checked')).toEqual(true);
|
||||
$td.find('.popovermenu [name=filesystem_check_changes]').val(0);
|
||||
$('body').mouseup();
|
||||
|
||||
expect(JSON.parse($tr.find('input.mountOptions').val())).toEqual({
|
||||
encrypt: true,
|
||||
previews: true,
|
||||
enable_sharing: false,
|
||||
filesystem_check_changes: 0,
|
||||
encoding_compatibility: false,
|
||||
readonly: false
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
describe('allow user mounts section', function() {
|
||||
// TODO: test allowUserMounting section
|
||||
});
|
||||
});
|
||||
130
cypress/e2e/files_external/settings.cy.ts
Normal file
130
cypress/e2e/files_external/settings.cy.ts
Normal file
|
|
@ -0,0 +1,130 @@
|
|||
/*!
|
||||
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
describe('files_external settings', () => {
|
||||
before(() => {
|
||||
cy.runOccCommand('app:enable files_external')
|
||||
cy.login({ language: 'en', password: 'admin', userId: 'admin' })
|
||||
})
|
||||
|
||||
beforeEach(() => {
|
||||
cy.runOccCommand('files_external:list --output json')
|
||||
.then((exec) => {
|
||||
const list = JSON.parse(exec.stdout)
|
||||
for (const entry of list) {
|
||||
cy.runOccCommand('files_external:delete ' + entry)
|
||||
}
|
||||
})
|
||||
cy.visit('/settings/admin/externalstorages')
|
||||
})
|
||||
|
||||
it('can see the settings section', () => {
|
||||
cy.findByRole('heading', { name: 'External storage' })
|
||||
.should('be.visible')
|
||||
cy.get('table#externalStorage')
|
||||
.should('be.visible')
|
||||
})
|
||||
|
||||
it('populates the row and creates a new empty one', () => {
|
||||
selectBackend('local')
|
||||
|
||||
// See cell now contains the backend
|
||||
getTable()
|
||||
.findAllByRole('row')
|
||||
.first()
|
||||
.find('.backend')
|
||||
.should('contain.text', 'Local')
|
||||
|
||||
// and the backend select is available but clear
|
||||
getBackendSelect()
|
||||
.should('have.value', null)
|
||||
|
||||
// the suggested mount point name is set to the backend
|
||||
getTable()
|
||||
.findAllByRole('row')
|
||||
.first()
|
||||
.find('input[name="mountPoint"]')
|
||||
.should('have.value', 'Local')
|
||||
})
|
||||
|
||||
it('does not save the storage with missing configuration', function() {
|
||||
selectBackend('local')
|
||||
|
||||
getTable()
|
||||
.findAllByRole('row').first()
|
||||
.should('be.visible')
|
||||
.within(() => {
|
||||
cy.findByRole('checkbox', { name: 'All people' })
|
||||
.check()
|
||||
cy.get('button[title="Save"]')
|
||||
.click()
|
||||
})
|
||||
|
||||
cy.findByRole('dialog', { name: 'Confirm your password' })
|
||||
.should('not.exist')
|
||||
})
|
||||
|
||||
it('does not save the storage with applicable configuration', function() {
|
||||
selectBackend('local')
|
||||
|
||||
getTable()
|
||||
.findAllByRole('row').first()
|
||||
.should('be.visible')
|
||||
.within(() => {
|
||||
cy.get('input[placeholder="Location"]')
|
||||
.type('/tmp')
|
||||
cy.get('button[title="Save"]')
|
||||
.click()
|
||||
})
|
||||
|
||||
cy.findByRole('dialog', { name: 'Confirm your password' })
|
||||
.should('not.exist')
|
||||
})
|
||||
|
||||
it('does save the storage with needed configuration', function() {
|
||||
selectBackend('local')
|
||||
|
||||
getTable()
|
||||
.findAllByRole('row').first()
|
||||
.should('be.visible')
|
||||
.within(() => {
|
||||
cy.findByRole('checkbox', { name: 'All people' })
|
||||
.check()
|
||||
cy.get('input[placeholder="Location"]')
|
||||
.type('/tmp')
|
||||
cy.get('button[title="Save"]')
|
||||
.click()
|
||||
})
|
||||
|
||||
cy.findByRole('dialog', { name: 'Confirm your password' })
|
||||
.should('be.visible')
|
||||
})
|
||||
})
|
||||
|
||||
/**
|
||||
* Get the external storages table
|
||||
*/
|
||||
function getTable() {
|
||||
return cy.get('table#externalStorage')
|
||||
.find('tbody')
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the backend select element
|
||||
*/
|
||||
function getBackendSelect() {
|
||||
return getTable()
|
||||
.findAllByRole('row')
|
||||
.last()
|
||||
.findByRole('combobox')
|
||||
}
|
||||
|
||||
/**
|
||||
* @param backend - Backend to select
|
||||
*/
|
||||
function selectBackend(backend: string): void {
|
||||
getBackendSelect()
|
||||
.select(backend)
|
||||
}
|
||||
|
|
@ -27,30 +27,6 @@ if (!process.env.CHROMIUM_BIN) {
|
|||
|
||||
/* jshint node: true */
|
||||
module.exports = function(config) {
|
||||
function findApps() {
|
||||
/*
|
||||
var fs = require('fs');
|
||||
var apps = fs.readdirSync('apps');
|
||||
return apps;
|
||||
*/
|
||||
// other apps tests don't run yet... needs further research / clean up
|
||||
return [
|
||||
'files',
|
||||
'files_versions',
|
||||
{
|
||||
name: 'files_sharing',
|
||||
srcFiles: [
|
||||
// only test these files, others are not ready and mess
|
||||
// up with the global namespace/classes/state
|
||||
'dist/files_sharing-additionalScripts.js',
|
||||
'dist/files_sharing-files_sharing_tab.js',
|
||||
'dist/files_sharing-main.js',
|
||||
],
|
||||
},
|
||||
'files_trashbin',
|
||||
];
|
||||
}
|
||||
|
||||
// respect NOCOVERAGE env variable
|
||||
// it is useful to disable coverage for debugging
|
||||
// because the coverage preprocessor will wrap the JS files somehow
|
||||
|
|
@ -60,34 +36,15 @@ module.exports = function(config) {
|
|||
enableCoverage ? 'enabled' : 'disabled'
|
||||
);
|
||||
|
||||
// default apps to test when none is specified (TODO: read from filesystem ?)
|
||||
let appsToTest = []
|
||||
if (process.env.KARMA_TESTSUITE) {
|
||||
appsToTest = process.env.KARMA_TESTSUITE.split(' ');
|
||||
} else {
|
||||
appsToTest = ['core'].concat(findApps());
|
||||
}
|
||||
|
||||
console.log('Apps to test: ', appsToTest);
|
||||
|
||||
// read core files from core.json,
|
||||
// these are required by all apps so always need to be loaded
|
||||
// note that the loading order is important that's why they
|
||||
// are specified in a separate file
|
||||
var corePath = 'dist/';
|
||||
var coreModule = require('../core/js/core.json');
|
||||
var testCore = false;
|
||||
var files = [];
|
||||
var index;
|
||||
var preprocessors = {};
|
||||
|
||||
// find out what apps to test from appsToTest
|
||||
index = appsToTest.indexOf('core');
|
||||
if (index > -1) {
|
||||
appsToTest.splice(index, 1);
|
||||
testCore = true;
|
||||
}
|
||||
|
||||
var srcFile, i;
|
||||
// add core library files
|
||||
for (i = 0; i < coreModule.libraries.length; i++) {
|
||||
|
|
@ -113,40 +70,8 @@ module.exports = function(config) {
|
|||
}
|
||||
}
|
||||
|
||||
// TODO: settings pages
|
||||
|
||||
// need to test the core app as well ?
|
||||
if (testCore) {
|
||||
// core tests
|
||||
files.push('core/js/tests/specs/**/*.js');
|
||||
}
|
||||
|
||||
function addApp(app) {
|
||||
// if only a string was specified, expand to structure
|
||||
if (typeof app === 'string') {
|
||||
app = {
|
||||
srcFiles: ['dist/' + app + '-*.js', 'apps/' + app + '/js/**/*.js'],
|
||||
testFiles: 'apps/' + app + '/tests/js/**/*.js'
|
||||
};
|
||||
}
|
||||
|
||||
// add source files/patterns
|
||||
files = files.concat(app.srcFiles || []);
|
||||
// add test files/patterns
|
||||
files = files.concat(app.testFiles || []);
|
||||
if (enableCoverage) {
|
||||
// add coverage entry for each file/pattern
|
||||
for (var i = 0; i < app.srcFiles.length; i++) {
|
||||
preprocessors[app.srcFiles[i]] = 'coverage';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// add source files for apps to test
|
||||
for (i = 0; i < appsToTest.length; i++) {
|
||||
addApp(appsToTest[i]);
|
||||
}
|
||||
|
||||
// core tests
|
||||
files.push('core/js/tests/specs/**/*.js');
|
||||
// serve images to avoid warnings
|
||||
files.push({
|
||||
pattern: 'core/img/**/*',
|
||||
|
|
|
|||
Loading…
Reference in a new issue