X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/58db72fee358d5987139a1b8526c0ca873e07dbf..082c1782d96a4b1c897df64d9b325d102a5c1144:/cypress/integration/collection.spec.js diff --git a/cypress/integration/collection.spec.js b/cypress/integration/collection.spec.js index 82a26cef..568121f1 100644 --- a/cypress/integration/collection.spec.js +++ b/cypress/integration/collection.spec.js @@ -75,7 +75,7 @@ describe('Collection panel tests', function () { }); }); - it('uses the property editor with vocabulary terms', function () { + it('uses the property editor (from edit dialog) with vocabulary terms', function () { cy.createCollection(adminUser.token, { name: `Test collection ${Math.floor(Math.random() * 999999)}`, owner_uuid: activeUser.user.uuid, @@ -85,6 +85,14 @@ describe('Collection panel tests', function () { cy.loginAs(activeUser); cy.goToPath(`/collections/${this.testCollection.uuid}`); + cy.get('[data-cy=collection-info-panel') + .should('contain', this.testCollection.name) + .and('not.contain', 'Color: Magenta'); + + cy.get('[data-cy=collection-panel-options-btn]').click(); + cy.get('[data-cy=context-menu]').contains('Edit collection').click(); + cy.get('[data-cy=form-dialog]').should('contain', 'Properties'); + // Key: Color (IDTAGCOLORS) - Value: Magenta (IDVALCOLORS3) cy.get('[data-cy=resource-properties-form]').within(() => { cy.get('[data-cy=property-field-key]').within(() => { @@ -96,14 +104,56 @@ describe('Collection panel tests', function () { cy.root().submit(); }); // Confirm proper vocabulary labels are displayed on the UI. - cy.get('[data-cy=collection-properties-panel]') - .should('contain', 'Color: Magenta'); + cy.get('[data-cy=form-dialog]').should('contain', 'Color: Magenta'); + cy.get('[data-cy=form-dialog]').contains('Save').click(); + cy.get('[data-cy=form-dialog]').should('not.exist'); // 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'); }); + // Confirm the property is displayed on the UI. + cy.get('[data-cy=collection-info-panel') + .should('contain', this.testCollection.name) + .and('contain', 'Color: Magenta'); + }); + }); + + it('uses the editor (from details panel) with vocabulary terms', function () { + 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}`); + + cy.get('[data-cy=collection-info-panel') + .should('contain', this.testCollection.name) + .and('not.contain', 'Color: Magenta') + .and('not.contain', 'Size: S'); + cy.get('[data-cy=additional-info-icon]').click(); + + cy.get('[data-cy=details-panel]').within(() => { + cy.get('[data-cy=details-panel-edit-btn]').click(); + }); + cy.get('[data-cy=form-dialog').contains('Edit Collection'); + + // Key: Color (IDTAGCOLORS) - Value: Magenta (IDVALCOLORS3) + cy.get('[data-cy=resource-properties-form]').within(() => { + cy.get('[data-cy=property-field-key]').within(() => { + cy.get('input').type('Color'); + }); + cy.get('[data-cy=property-field-value]').within(() => { + cy.get('input').type('Magenta'); + }); + cy.root().submit(); + }); + // Confirm proper vocabulary labels are displayed on the UI. + cy.get('[data-cy=form-dialog]') + .should('contain', 'Color: Magenta'); // Case-insensitive on-blur auto-selection test // Key: Size (IDTAGSIZES) - Value: Small (IDVALSIZES2) @@ -120,14 +170,25 @@ describe('Collection panel tests', function () { cy.root().submit(); }); // Confirm proper vocabulary labels are displayed on the UI. - cy.get('[data-cy=collection-properties-panel]') + cy.get('[data-cy=form-dialog]') .should('contain', 'Size: S'); + + cy.get('[data-cy=form-dialog]').contains('Save').click(); + cy.get('[data-cy=form-dialog]').should('not.exist'); + // 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'); expect(this.collection.properties.IDTAGSIZES).to.equal('IDVALSIZES2'); }); + + // Confirm properties display on the UI. + cy.get('[data-cy=collection-info-panel') + .should('contain', this.testCollection.name) + .and('contain', 'Color: Magenta') + .and('contain', 'Size: S'); }); }); @@ -186,33 +247,13 @@ describe('Collection panel tests', function () { .should('contain', 'Add to favorites') .and(`${isWritable ? '' : 'not.'}contain`, 'Edit collection'); cy.get('body').click(); // Collapse the menu avoiding details panel expansion - cy.get('[data-cy=collection-properties-panel]') - .should('contain', 'someKey') - .and('contain', 'someValue') - .and('not.contain', 'anotherKey') - .and('not.contain', 'anotherValue') - if (isWritable === true) { - // Check that properties can be added. - cy.get('[data-cy=resource-properties-form]').within(() => { - cy.get('[data-cy=property-field-key]').within(() => { - cy.get('input').type('anotherKey'); - }); - cy.get('[data-cy=property-field-value]').within(() => { - cy.get('input').type('anotherValue'); - }); - cy.root().submit(); - }) - cy.get('[data-cy=collection-properties-panel]') - .should('contain', 'anotherKey') - .and('contain', 'anotherValue') - } else { - // Properties form shouldn't be displayed. - cy.get('[data-cy=resource-properties-form]').should('not.exist'); - } + cy.get('[data-cy=collection-info-panel]') + .should('contain', 'someKey: someValue') + .and('not.contain', 'anotherKey: anotherValue'); // 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); + cy.get('[data-cy=collection-files-right-panel]', { timeout: 5000 }) + .should('contain', fileName); if (isWritable) { cy.get('[data-cy=upload-button]') .should(`${isWritable ? '' : 'not.'}contain`, 'Upload data'); @@ -293,7 +334,7 @@ describe('Collection panel tests', function () { 'bar' // make sure we can go back to the original name as a last step ]; eachPair(names, (from, to) => { - cy.get('[data-cy=collection-files-panel]') + cy.waitForDom().get('[data-cy=collection-files-panel]') .contains(`${from}`).rightclick(); cy.get('[data-cy=context-menu]') .contains('Rename') @@ -313,63 +354,6 @@ describe('Collection panel tests', 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, { - 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); - // Look for the "arrow icon" and expand the "subdir" directory. - cy.get('[data-cy=virtual-file-tree] > div > i').click(); - // Rename 'subdir/foo' to 'foo' - 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.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('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. @@ -642,6 +626,34 @@ describe('Collection panel tests', function () { }); }); + it('automatically updates the collection UI contents without using the Refresh button', function () { + const collName = `Test Collection ${Math.floor(Math.random() * 999999)}`; + const fileName = 'foobar' + + cy.createCollection(adminUser.token, { + name: collName, + owner_uuid: activeUser.user.uuid, + }).as('testCollection'); + + cy.getAll('@testCollection').then(function ([testCollection]) { + cy.loginAs(activeUser); + cy.goToPath(`/collections/${testCollection.uuid}`); + cy.get('[data-cy=collection-files-panel]').should('contain', 'This collection is empty'); + cy.get('[data-cy=collection-files-panel]').should('not.contain', fileName); + cy.get('[data-cy=collection-info-panel]').should('contain', collName); + + cy.updateCollection(adminUser.token, testCollection.uuid, { + name: `${collName + ' updated'}`, + manifest_text: `. 37b51d194a7513e45b56f6524f2d51f2+3 0:3:${fileName}\n`, + }).as('updatedCollection'); + cy.getAll('@updatedCollection').then(function ([updatedCollection]) { + expect(updatedCollection.name).to.equal(`${collName + ' updated'}`); + cy.get('[data-cy=collection-info-panel]').should('contain', updatedCollection.name); + cy.get('[data-cy=collection-files-panel]').should('contain', fileName); + }); + }); + }) + it('makes a copy of an existing collection', function() { const collName = `Test Collection ${Math.floor(Math.random() * 999999)}`; const copyName = `Copy of: ${collName}`; @@ -807,7 +819,36 @@ describe('Collection panel tests', function () { }); }); - it('creates new collection on home project', function () { + it('creates collection from selected files of another collection', () => { + cy.createCollection(adminUser.token, { + name: `Test Collection ${Math.floor(Math.random() * 999999)}`, + owner_uuid: activeUser.user.uuid, + preserve_version: true, + manifest_text: ". 37b51d194a7513e45b56f6524f2d51f2+3 0:3:foo 0:3:bar\n" + }) + .as('collection').then(function () { + // Visit collection, check basic information + cy.loginAs(activeUser) + cy.goToPath(`/collections/${this.collection.uuid}`); + + cy.get('[data-cy=collection-files-panel]').within(() => { + cy.get('input[type=checkbox]').first().click(); + }); + + cy.get('[data-cy=collection-files-panel-options-btn]').click(); + cy.get('[data-cy=context-menu]').contains('Create a new collection with selected').click(); + + cy.get('[data-cy=form-dialog]').contains('Projects').click(); + + cy.get('[data-cy=form-submit-btn]').click(); + + cy.get('.layout-pane-primary', { timeout: 12000 }).contains('Projects').click(); + + cy.get('main').contains(`Files extracted from: ${this.collection.name}`).should('exist'); + }); + }); + + it('creates new collection with properties on home project', function () { cy.loginAs(activeUser); cy.goToPath(`/projects/${activeUser.user.uuid}`); cy.get('[data-cy=breadcrumb-first]').should('contain', 'Projects'); @@ -817,6 +858,8 @@ describe('Collection panel tests', function () { cy.get('[data-cy=side-panel-new-collection]').click(); // Name between brackets tests bugfix #17582 const collName = `[Test collection (${Math.floor(999999 * Math.random())})]`; + + // Select a storage class. cy.get('[data-cy=form-dialog]') .should('contain', 'New collection') .and('contain', 'Storage classes') @@ -832,15 +875,42 @@ describe('Collection panel tests', function () { }); cy.get('[data-cy=checkbox-foo]').click(); }) + + // Add a property. + // Key: Color (IDTAGCOLORS) - Value: Magenta (IDVALCOLORS3) + cy.get('[data-cy=form-dialog]').should('not.contain', 'Color: Magenta'); + cy.get('[data-cy=resource-properties-form]').within(() => { + cy.get('[data-cy=property-field-key]').within(() => { + cy.get('input').type('Color'); + }); + cy.get('[data-cy=property-field-value]').within(() => { + cy.get('input').type('Magenta'); + }); + cy.root().submit(); + }); + // Confirm proper vocabulary labels are displayed on the UI. + cy.get('[data-cy=form-dialog]').should('contain', 'Color: Magenta'); + cy.get('[data-cy=form-submit-btn]').click(); - // Confirm that the user was taken to the newly created thing + // Confirm that the user was taken to the newly created collection 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('contain', 'Color: Magenta') .and('not.contain', 'bar'); + // Confirm that the collection's properties has the real values. + cy.doRequest('GET', '/arvados/v1/collections', null, { + filters: `[["name", "=", "${collName}"]]`, + }) + .its('body.items').as('collections') + .then(function() { + expect(this.collections).to.have.lengthOf(1); + expect(this.collections[0].properties).to.have.property( + 'IDTAGCOLORS', 'IDVALCOLORS3'); + }); }); it('shows responsible person for collection if available', () => { @@ -848,17 +918,15 @@ describe('Collection panel tests', function () { name: `Test collection ${Math.floor(Math.random() * 999999)}`, owner_uuid: activeUser.user.uuid, manifest_text: ". 37b51d194a7513e45b56f6524f2d51f2+3 0:3:bar\n" - }) - .as('testCollection1'); + }).as('testCollection1'); cy.createCollection(adminUser.token, { name: `Test collection ${Math.floor(Math.random() * 999999)}`, owner_uuid: adminUser.user.uuid, manifest_text: ". 37b51d194a7513e45b56f6524f2d51f2+3 0:3:bar\n" - }) - .as('testCollection2').then(function (testCollection2) { - cy.shareWith(adminUser.token, activeUser.user.uuid, testCollection2.uuid, 'can_write'); - }); + }).as('testCollection2').then(function (testCollection2) { + cy.shareWith(adminUser.token, activeUser.user.uuid, testCollection2.uuid, 'can_write'); + }); cy.getAll('@testCollection1', '@testCollection2') .then(function ([testCollection1, testCollection2]) { @@ -879,9 +947,38 @@ describe('Collection panel tests', function () { 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'); + manifest_text: "./subdir 37b51d194a7513e45b56f6524f2d51f2+3 0:3:foo\n. 37b51d194a7513e45b56f6524f2d51f2+3 0:3:bar\n" + }).as('testCollection1'); + }); + + it('uploads a file and checks the collection UI to be fresh', () => { + cy.getAll('@testCollection1') + .then(function([testCollection1]) { + cy.loginAs(activeUser); + cy.goToPath(`/collections/${testCollection1.uuid}`); + cy.get('[data-cy=upload-button]').click(); + cy.get('[data-cy=collection-files-panel]') + .contains('5mb_a.bin').should('not.exist'); + cy.get('[data-cy=collection-file-count]').should('contain', '2'); + cy.fixture('files/5mb.bin', 'base64').then(content => { + cy.get('[data-cy=drag-and-drop]').upload(content, '5mb_a.bin'); + cy.get('[data-cy=form-submit-btn]').click(); + cy.get('[data-cy=form-submit-btn]').should('not.exist'); + cy.get('[data-cy=collection-files-panel]') + .contains('5mb_a.bin').should('exist'); + cy.get('[data-cy=collection-file-count]').should('contain', '3'); + + cy.get('[data-cy=collection-files-panel]').contains('subdir').click(); + 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_b.bin'); + cy.get('[data-cy=form-submit-btn]').click(); + cy.get('[data-cy=form-submit-btn]').should('not.exist'); + cy.get('[data-cy=collection-files-right-panel]') + .contains('5mb_b.bin').should('exist'); + }); + }); + }); }); it('allows to cancel running upload', () => {