X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/8df73e82d637d7b2e81952fdc96a12a1011be99e..be9b5b23f584d08adcee0d3ca4a31558c1aa938d:/cypress/integration/collection.spec.js diff --git a/cypress/integration/collection.spec.js b/cypress/integration/collection.spec.js index 308ce5f7..6c1727fb 100644 --- a/cypress/integration/collection.spec.js +++ b/cypress/integration/collection.spec.js @@ -43,7 +43,7 @@ describe('Collection panel tests', function () { cy.goToPath(`/collections/${testCollection.uuid}`); cy.get('[data-cy=collection-panel-options-btn]').click(); - cy.get('[data-cy=context-menu]').contains('Open as network folder or S3 bucket').click(); + cy.get('[data-cy=context-menu]').contains('Open with 3rd party client').click(); cy.get('[data-cy=download-button').click(); const filename = path.join(downloadsFolder, `${testCollection.name}.duck`); @@ -97,14 +97,37 @@ describe('Collection panel tests', function () { }); // Confirm proper vocabulary labels are displayed on the UI. cy.get('[data-cy=collection-properties-panel]') - .should('contain', 'Color') - .and('contain', 'Magenta'); + .should('contain', 'Color: Magenta'); // Confirm proper vocabulary IDs were saved on the backend. cy.doRequest('GET', `/arvados/v1/collections/${this.testCollection.uuid}`) .its('body').as('collection') .then(function () { expect(this.collection.properties.IDTAGCOLORS).to.equal('IDVALCOLORS3'); }); + + // Case-insensitive on-blur auto-selection test + // Key: Size (IDTAGSIZES) - Value: Small (IDVALSIZES2) + cy.get('[data-cy=resource-properties-form]').within(() => { + cy.get('[data-cy=property-field-key]').within(() => { + cy.get('input').type('sIzE'); + }); + cy.get('[data-cy=property-field-value]').within(() => { + cy.get('input').type('sMaLL'); + }); + // Cannot "type()" TAB on Cypress so let's click another field + // to trigger the onBlur event. + cy.get('[data-cy=property-field-key]').click(); + cy.root().submit(); + }); + // Confirm proper vocabulary labels are displayed on the UI. + cy.get('[data-cy=collection-properties-panel]') + .should('contain', 'Size: S'); + // Confirm proper vocabulary IDs were saved on the backend. + cy.doRequest('GET', `/arvados/v1/collections/${this.testCollection.uuid}`) + .its('body').as('collection') + .then(function () { + expect(this.collection.properties.IDTAGSIZES).to.equal('IDVALSIZES2'); + }); }); }); @@ -122,12 +145,22 @@ describe('Collection panel tests', function () { }).as('sharedGroup').then(function () { // Creates the collection using the admin token so we can set up // a bogus manifest text without block signatures. - cy.createCollection(adminUser.token, { - name: 'Test collection', - owner_uuid: this.sharedGroup.uuid, - properties: { someKey: 'someValue' }, - manifest_text: `. 37b51d194a7513e45b56f6524f2d51f2+3 0:3:${fileName}\n./${subDirName} 37b51d194a7513e45b56f6524f2d51f2+3 0:3:${fileName}\n` - }) + cy.doRequest('GET', '/arvados/v1/config', null, null) + .its('body').should((clusterConfig) => { + expect(clusterConfig.Collections, "clusterConfig").to.have.property("TrustAllContent", false); + expect(clusterConfig.Services, "clusterConfig").to.have.property("WebDAV").have.property("ExternalURL"); + expect(clusterConfig.Services, "clusterConfig").to.have.property("WebDAVDownload").have.property("ExternalURL"); + const inlineUrl = clusterConfig.Services.WebDAV.ExternalURL !== "" + ? clusterConfig.Services.WebDAV.ExternalURL + : clusterConfig.Services.WebDAVDownload.ExternalURL; + expect(inlineUrl).to.not.contain("*"); + }) + .createCollection(adminUser.token, { + name: 'Test collection', + owner_uuid: this.sharedGroup.uuid, + properties: { someKey: 'someValue' }, + manifest_text: `. 37b51d194a7513e45b56f6524f2d51f2+3 0:3:${fileName}\n./${subDirName} 37b51d194a7513e45b56f6524f2d51f2+3 0:3:${fileName}\n` + }) .as('testCollection').then(function () { // Share the group with active user. cy.createLink(adminUser.token, { @@ -178,6 +211,7 @@ describe('Collection panel tests', function () { } // Check that the file listing show both read & write operations cy.get('[data-cy=collection-files-panel]').within(() => { + cy.wait(1000); cy.root().should('contain', fileName); if (isWritable) { cy.get('[data-cy=upload-button]') @@ -189,7 +223,7 @@ describe('Collection panel tests', function () { .contains(fileName).rightclick({ force: true }); cy.get('[data-cy=context-menu]') .should('contain', 'Download') - .and('contain', 'Open in new tab') + .and('not.contain', 'Open in new tab') .and('contain', 'Copy to clipboard') .and(`${isWritable ? '' : 'not.'}contain`, 'Rename') .and(`${isWritable ? '' : 'not.'}contain`, 'Remove'); @@ -198,7 +232,7 @@ describe('Collection panel tests', function () { .contains(subDirName).rightclick({ force: true }); cy.get('[data-cy=context-menu]') .should('not.contain', 'Download') - .and('contain', 'Open in new tab') + .and('not.contain', 'Open in new tab') .and('contain', 'Copy to clipboard') .and(`${isWritable ? '' : 'not.'}contain`, 'Rename') .and(`${isWritable ? '' : 'not.'}contain`, 'Remove'); @@ -279,7 +313,7 @@ describe('Collection panel tests', function () { }); }); - it('renames a file to a different directory', function () { + it.skip('renames a file to a different directory', function () { // Creates the collection using the admin token so we can set up // a bogus manifest text without block signatures. cy.createCollection(adminUser.token, { @@ -336,6 +370,71 @@ describe('Collection panel tests', function () { }); }); + it('renames a file to a different directory', function () { + // Creates the collection using the admin token so we can set up + // a bogus manifest text without block signatures. + cy.createCollection(adminUser.token, { + name: `Test collection ${Math.floor(Math.random() * 999999)}`, + owner_uuid: activeUser.user.uuid, + manifest_text: ". 37b51d194a7513e45b56f6524f2d51f2+3 0:3:bar\n" + }) + .as('testCollection').then(function () { + cy.loginAs(activeUser); + cy.goToPath(`/collections/${this.testCollection.uuid}`); + + ['subdir', 'G%C3%BCnter\'s%20file', 'table%&?*2'].forEach((subdir) => { + cy.get('[data-cy=collection-files-panel]') + .contains('bar').rightclick({force: true}); + cy.get('[data-cy=context-menu]') + .contains('Rename') + .click(); + cy.get('[data-cy=form-dialog]') + .should('contain', 'Rename') + .within(() => { + cy.get('input').type(`{selectall}{backspace}${subdir}/foo`); + }); + cy.get('[data-cy=form-submit-btn]').click(); + cy.get('[data-cy=collection-files-panel]') + .should('not.contain', 'bar') + .and('contain', subdir); + cy.wait(1000); + cy.get('[data-cy=collection-files-panel]').contains(subdir).click(); + // Rename 'subdir/foo' to 'foo' + cy.wait(1000); + cy.get('[data-cy=collection-files-panel]') + .contains('foo').rightclick(); + cy.get('[data-cy=context-menu]') + .contains('Rename') + .click(); + cy.get('[data-cy=form-dialog]') + .should('contain', 'Rename') + .within(() => { + cy.get('input') + .should('have.value', `${subdir}/foo`) + .type(`{selectall}{backspace}bar`); + }); + cy.get('[data-cy=form-submit-btn]').click(); + + cy.wait(1000); + cy.get('[data-cy=collection-files-panel]') + .contains('Home') + .click(); + + cy.wait(2000); + cy.get('[data-cy=collection-files-panel]') + .should('contain', subdir) // empty dir kept + .and('contain', 'bar'); + + cy.get('[data-cy=collection-files-panel]') + .contains(subdir).rightclick(); + cy.get('[data-cy=context-menu]') + .contains('Remove') + .click(); + cy.get('[data-cy=confirmation-dialog-ok-btn]').click(); + }); + }); + }); + it('tries to rename a file with illegal names', function () { // Creates the collection using the admin token so we can set up // a bogus manifest text without block signatures. @@ -534,10 +633,14 @@ describe('Collection panel tests', function () { .within(() => { // Version 1: 6 bytes in size cy.get('[data-cy=collection-version-browser-select-1]') - .should('contain', '1').and('contain', '6 B'); + .should('contain', '1') + .and('contain', '6 B') + .and('contain', adminUser.user.uuid); // Version 2: 3 bytes in size (one file removed) cy.get('[data-cy=collection-version-browser-select-2]') - .should('contain', '2').and('contain', '3 B'); + .should('contain', '2') + .and('contain', '3 B') + .and('contain', activeUser.user.full_name); cy.get('[data-cy=collection-version-browser-select-3]') .should('not.exist'); cy.get('[data-cy=collection-version-browser-select-1]') @@ -636,19 +739,28 @@ describe('Collection panel tests', function () { const collName = `[Test collection (${Math.floor(999999 * Math.random())})]`; cy.get('[data-cy=form-dialog]') .should('contain', 'New collection') + .and('contain', 'Storage classes') + .and('contain', 'default') + .and('contain', 'foo') + .and('contain', 'bar') .within(() => { cy.get('[data-cy=parent-field]').within(() => { cy.get('input').should('have.value', 'Home project'); - }) + }); cy.get('[data-cy=name-field]').within(() => { cy.get('input').type(collName); - }) + }); + cy.get('[data-cy=checkbox-foo]').click(); }) cy.get('[data-cy=form-submit-btn]').click(); // Confirm that the user was taken to the newly created thing cy.get('[data-cy=form-dialog]').should('not.exist'); cy.get('[data-cy=breadcrumb-first]').should('contain', 'Projects'); cy.get('[data-cy=breadcrumb-last]').should('contain', collName); + cy.get('[data-cy=collection-info-panel]') + .should('contain', 'default') + .and('contain', 'foo') + .and('not.contain', 'bar'); }); it('shows responsible person for collection if available', () => { @@ -681,4 +793,84 @@ describe('Collection panel tests', function () { .contains(adminUser.user.uuid); }); }); + + describe('file upload', () => { + beforeEach(() => { + cy.createCollection(adminUser.token, { + name: `Test collection ${Math.floor(Math.random() * 999999)}`, + owner_uuid: activeUser.user.uuid, + manifest_text: ". 37b51d194a7513e45b56f6524f2d51f2+3 0:3:bar\n" + }) + .as('testCollection1'); + }); + + it('allows to cancel running upload', () => { + cy.getAll('@testCollection1') + .then(function([testCollection1]) { + cy.loginAs(activeUser); + + cy.goToPath(`/collections/${testCollection1.uuid}`); + + cy.get('[data-cy=upload-button]').click(); + + cy.fixture('files/5mb.bin', 'base64').then(content => { + cy.get('[data-cy=drag-and-drop]').upload(content, '5mb_a.bin'); + cy.get('[data-cy=drag-and-drop]').upload(content, '5mb_b.bin'); + + cy.get('[data-cy=form-submit-btn]').click(); + + cy.get('button').contains('Cancel').click(); + + cy.get('[data-cy=form-submit-btn]').should('not.exist'); + }); + }); + }); + + it('allows to cancel single file from the running upload', () => { + cy.getAll('@testCollection1') + .then(function([testCollection1]) { + cy.loginAs(activeUser); + + cy.goToPath(`/collections/${testCollection1.uuid}`); + + cy.get('[data-cy=upload-button]').click(); + + cy.fixture('files/5mb.bin', 'base64').then(content => { + cy.get('[data-cy=drag-and-drop]').upload(content, '5mb_a.bin'); + cy.get('[data-cy=drag-and-drop]').upload(content, '5mb_b.bin'); + + cy.get('[data-cy=form-submit-btn]').click(); + + cy.get('button[aria-label=Remove]').eq(1).click(); + + cy.get('[data-cy=form-submit-btn]').should('not.exist'); + + cy.get('[data-cy=collection-files-panel]').contains('5mb_a.bin').should('exist'); + }); + }); + }); + + it('allows to cancel all files from the running upload', () => { + cy.getAll('@testCollection1') + .then(function([testCollection1]) { + cy.loginAs(activeUser); + + cy.goToPath(`/collections/${testCollection1.uuid}`); + + cy.get('[data-cy=upload-button]').click(); + + cy.fixture('files/5mb.bin', 'base64').then(content => { + cy.get('[data-cy=drag-and-drop]').upload(content, '5mb_a.bin'); + cy.get('[data-cy=drag-and-drop]').upload(content, '5mb_b.bin'); + + cy.get('[data-cy=form-submit-btn]').click(); + + cy.get('button[aria-label=Remove]').should('exist'); + cy.get('button[aria-label=Remove]').click({ multiple: true, force: true }); + + cy.get('[data-cy=form-submit-btn]').should('not.exist'); + }); + }); + }); + }); })