diff options
author | John Molakvoæ <skjnldsv@users.noreply.github.com> | 2025-06-03 08:38:35 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-06-03 08:38:35 +0200 |
commit | f25d66008b7af7291b78521708f76bc9da6f2365 (patch) | |
tree | c608e2a7a7924869a14a02c662c35edb0dc61045 | |
parent | b54803b476347c5e8b2834feca7f95a564d30cb3 (diff) | |
parent | db7b0ae154cdb1e8bf9873190a1dd3aff468c651 (diff) | |
download | nextcloud-server-f25d66008b7af7291b78521708f76bc9da6f2365.tar.gz nextcloud-server-f25d66008b7af7291b78521708f76bc9da6f2365.zip |
Merge pull request #53268 from nextcloud/cleanup/karma
test: cleanup karma (jsunit) tests and move files_external to Cypress
-rw-r--r-- | apps/files_external/tests/appSpec.js | 84 | ||||
-rw-r--r-- | apps/files_external/tests/js/mountsfilelistSpec.js | 148 | ||||
-rw-r--r-- | apps/files_external/tests/js/settingsSpec.js | 447 | ||||
-rw-r--r-- | cypress/e2e/files_external/settings.cy.ts | 130 | ||||
-rw-r--r-- | tests/karma.config.js | 79 |
5 files changed, 132 insertions, 756 deletions
diff --git a/apps/files_external/tests/appSpec.js b/apps/files_external/tests/appSpec.js deleted file mode 100644 index 4d150cd36bb..00000000000 --- a/apps/files_external/tests/appSpec.js +++ /dev/null @@ -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 - }) - }) -}) diff --git a/apps/files_external/tests/js/mountsfilelistSpec.js b/apps/files_external/tests/js/mountsfilelistSpec.js deleted file mode 100644 index fa6de978c81..00000000000 --- a/apps/files_external/tests/js/mountsfilelistSpec.js +++ /dev/null @@ -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); - }); - }); -}); diff --git a/apps/files_external/tests/js/settingsSpec.js b/apps/files_external/tests/js/settingsSpec.js deleted file mode 100644 index f79191151d1..00000000000 --- a/apps/files_external/tests/js/settingsSpec.js +++ /dev/null @@ -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 - }); -}); diff --git a/cypress/e2e/files_external/settings.cy.ts b/cypress/e2e/files_external/settings.cy.ts new file mode 100644 index 00000000000..9f017bbf951 --- /dev/null +++ b/cypress/e2e/files_external/settings.cy.ts @@ -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) +} diff --git a/tests/karma.config.js b/tests/karma.config.js index 072bb9d766a..cf2a399f202 100644 --- a/tests/karma.config.js +++ b/tests/karma.config.js @@ -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/**/*', |