Merge branch '21128-toolbar-context-menu'
[arvados-workbench2.git] / cypress / integration / collection.spec.js
index 75ae8237d10a3409f9be215128d2874ca2850df9..54c570f7c4453fdafa3fe5bd4cd27795eadcb1e1 100644 (file)
@@ -32,6 +32,45 @@ describe("Collection panel tests", function () {
         cy.clearLocalStorage();
     });
 
+    it('shows the appropriate buttons in the toolbar', () => {
+
+        const msButtonTooltips = [
+            'API Details',
+            'Add to Favorites',
+            'Copy to clipboard',
+            'Edit collection',
+            'Make a copy',
+            'Move to',
+            'Move to trash',
+            'Open in new tab',
+            'Open with 3rd party client',
+            'Share',
+            'View details',
+        ];
+
+        cy.loginAs(activeUser);
+        const name = `Test collection ${Math.floor(Math.random() * 999999)}`;
+        cy.get("[data-cy=side-panel-button]").click({force: true});
+        cy.get("[data-cy=side-panel-new-collection]").click();
+        cy.get("[data-cy=form-dialog]")
+            .should("contain", "New collection")
+            .within(() => {
+                cy.get("[data-cy=name-field]").within(() => {
+                    cy.get("input").type(name);
+                });
+                cy.get("[data-cy=form-submit-btn]").click();
+            });
+            cy.get("[data-cy=side-panel-tree]").contains("Home Projects").click();
+            cy.waitForDom()
+            cy.get('[data-cy=data-table-row]').contains(name).should('exist').parent().parent().parent().parent().click()
+            cy.get('[data-cy=multiselect-button]').should('have.length', msButtonTooltips.length)
+            for (let i = 0; i < msButtonTooltips.length; i++) {
+                cy.get('[data-cy=multiselect-button]').eq(i).trigger('mouseover');
+                cy.get('body').contains(msButtonTooltips[i]).should('exist')
+                cy.get('[data-cy=multiselect-button]').eq(i).trigger('mouseout');
+            }
+    })
+
     it("allows to download mountain duck config for a collection", () => {
         cy.createCollection(adminUser.token, {
             name: `Test collection ${Math.floor(Math.random() * 999999)}`,
@@ -125,6 +164,8 @@ describe("Collection panel tests", function () {
         cy.get("[data-cy=form-dialog]").should("exist").and("contain", "Collection with the same name already exists");
     });
 
+    
+
     it("uses the property editor (from edit dialog) with vocabulary terms", function () {
         cy.createCollection(adminUser.token, {
             name: `Test collection ${Math.floor(Math.random() * 999999)}`,
@@ -168,6 +209,8 @@ describe("Collection panel tests", function () {
             });
     });
 
+    
+
     it("uses the editor (from details panel) with vocabulary terms", function () {
         cy.createCollection(adminUser.token, {
             name: `Test collection ${Math.floor(Math.random() * 999999)}`,
@@ -383,6 +426,7 @@ describe("Collection panel tests", function () {
                     "table%&?*2",
                     "bar", // make sure we can go back to the original name as a last step
                 ];
+                cy.intercept({ method: "PUT", url: "**/arvados/v1/collections/*" }).as("renameRequest");
                 eachPair(names, (from, to) => {
                     cy.waitForDom().get("[data-cy=collection-files-panel]").contains(`${from}`).rightclick();
                     cy.get("[data-cy=context-menu]").contains("Rename").click();
@@ -392,6 +436,7 @@ describe("Collection panel tests", function () {
                             cy.get("input").type("{selectall}{backspace}").type(to, { parseSpecialCharSequences: false });
                         });
                     cy.get("[data-cy=form-submit-btn]").click();
+                    cy.wait("@renameRequest");
                     cy.get("[data-cy=collection-files-panel]").should("not.contain", `${from}`).and("contain", `${to}`);
                 });
             });
@@ -753,12 +798,12 @@ describe("Collection panel tests", function () {
                 cy.get("[data-cy=collection-files-panel]").should("contain", "foo").and("contain", "bar");
 
                 // Modify collection, expect version number change
-                // cy.get('[data-cy=collection-files-panel]').contains('foo').rightclick();
-                // cy.get('[data-cy=context-menu]').contains('Remove').click();
-                // cy.get('[data-cy=confirmation-dialog]').should('contain', 'Removing file');
-                // cy.get('[data-cy=confirmation-dialog-ok-btn]').click();
-                // cy.get('[data-cy=collection-version-number]').should('contain', '2');
-                // cy.get('[data-cy=collection-files-panel]').should('not.contain', 'foo').and('contain', 'bar');
+                cy.get("[data-cy=collection-files-panel]").contains("foo").rightclick();
+                cy.get("[data-cy=context-menu]").contains("Remove").click();
+                cy.get("[data-cy=confirmation-dialog]").should("contain", "Removing file");
+                cy.get("[data-cy=confirmation-dialog-ok-btn]").click();
+                cy.get("[data-cy=collection-version-number]").should("contain", "2");
+                cy.get("[data-cy=collection-files-panel]").should("not.contain", "foo").and("contain", "bar");
 
                 // Click on version number, check version browser. Click on past version.
                 cy.get("[data-cy=collection-version-browser]").should("not.exist");
@@ -772,7 +817,7 @@ describe("Collection panel tests", function () {
                         cy.get("[data-cy=collection-version-browser-select-1]")
                             .should("contain", "1")
                             .and("contain", "6 B")
-                            .and("contain", adminUser.user.uuid);
+                            .and("contain", adminUser.user.full_name);
                         // Version 2: 3 bytes in size (one file removed)
                         cy.get("[data-cy=collection-version-browser-select-2]")
                             .should("contain", "2")
@@ -823,6 +868,7 @@ describe("Collection panel tests", function () {
                 cy.get("[data-cy=collection-version-browser-select-3]").should("contain", "3").and("contain", "3 B");
 
                 // Check context menus on version browser
+                cy.waitForDom();
                 cy.get("[data-cy=collection-version-browser-select-3]").rightclick();
                 cy.get("[data-cy=context-menu]")
                     .should("contain", "Add to favorites")
@@ -852,7 +898,7 @@ describe("Collection panel tests", function () {
             });
     });
 
-    it("creates collection from selected files of another collection", () => {
+    it("copies selected files into new collection", () => {
         cy.createCollection(adminUser.token, {
             name: `Test Collection ${Math.floor(Math.random() * 999999)}`,
             owner_uuid: activeUser.user.uuid,
@@ -870,7 +916,7 @@ describe("Collection panel tests", function () {
                 });
 
                 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=context-menu]").contains("Copy selected into new collection").click();
 
                 cy.get("[data-cy=form-dialog]").contains("Projects").click();
 
@@ -878,10 +924,203 @@ describe("Collection panel tests", function () {
 
                 cy.waitForDom().get(".layout-pane-primary", { timeout: 12000 }).contains("Projects").click();
 
-                cy.get("main").contains(`Files extracted from: ${this.collection.name}`).should("exist");
+                cy.waitForDom().get("main").contains(`Files extracted from: ${this.collection.name}`).click();
+                cy.get("[data-cy=collection-files-panel]").and("contain", "bar");
             });
     });
 
+    it("copies selected files into existing 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("sourceCollection");
+
+        cy.createCollection(adminUser.token, {
+            name: `Destination Collection ${Math.floor(Math.random() * 999999)}`,
+            owner_uuid: activeUser.user.uuid,
+            preserve_version: true,
+            manifest_text: "",
+        }).as("destinationCollection");
+
+        cy.getAll("@sourceCollection", "@destinationCollection").then(function ([sourceCollection, destinationCollection]) {
+            // Visit collection, check basic information
+            cy.loginAs(activeUser);
+            cy.goToPath(`/collections/${sourceCollection.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("Copy selected into existing collection").click();
+
+            cy.get("[data-cy=form-dialog]").contains(destinationCollection.name).click();
+
+            cy.get("[data-cy=form-submit-btn]").click();
+            cy.wait(2000);
+
+            cy.goToPath(`/collections/${destinationCollection.uuid}`);
+
+            cy.get("main").contains(destinationCollection.name).should("exist");
+            cy.get("[data-cy=collection-files-panel]").and("contain", "bar");
+        });
+    });
+
+    it("copies selected files into separate collections", () => {
+        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("sourceCollection");
+
+        cy.getAll("@sourceCollection").then(function ([sourceCollection]) {
+            // Visit collection, check basic information
+            cy.loginAs(activeUser);
+            cy.goToPath(`/collections/${sourceCollection.uuid}`);
+
+            // Select both files
+            cy.waitForDom()
+                .get("[data-cy=collection-files-panel]")
+                .within(() => {
+                    cy.get("input[type=checkbox]").first().click();
+                    cy.get("input[type=checkbox]").last().click();
+                });
+
+            // Copy to separate collections
+            cy.get("[data-cy=collection-files-panel-options-btn]").click();
+            cy.get("[data-cy=context-menu]").contains("Copy selected into separate collections").click();
+            cy.get("[data-cy=form-dialog]").contains("Projects").click();
+            cy.get("[data-cy=form-submit-btn]").click();
+
+            // Verify created collections
+            cy.waitForDom().get(".layout-pane-primary", { timeout: 12000 }).contains("Projects").click();
+            cy.get("main").contains(`File copied from collection ${sourceCollection.name}/foo`).click();
+            cy.get("[data-cy=collection-files-panel]").and("contain", "foo");
+            cy.get(".layout-pane-primary").contains("Projects").click();
+            cy.get("main").contains(`File copied from collection ${sourceCollection.name}/bar`).click();
+            cy.get("[data-cy=collection-files-panel]").and("contain", "bar");
+
+            // Verify separate collection menu items not present when single file selected
+            // Wait for dom for collection to re-render
+            cy.waitForDom()
+                .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]").should("not.contain", "Copy selected into separate collections");
+            cy.get("[data-cy=context-menu]").should("not.contain", "Move selected into separate collections");
+        });
+    });
+
+    it("moves selected files into new 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("Move selected into new collection").click();
+
+                cy.get("[data-cy=form-dialog]").contains("Projects").click();
+
+                cy.get("[data-cy=form-submit-btn]").click();
+
+                cy.waitForDom().get(".layout-pane-primary", { timeout: 12000 }).contains("Projects").click();
+
+                cy.get("main").contains(`Files moved from: ${this.collection.name}`).click();
+                cy.get("[data-cy=collection-files-panel]").and("contain", "bar");
+            });
+    });
+
+    it("moves selected files into existing 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("sourceCollection");
+
+        cy.createCollection(adminUser.token, {
+            name: `Destination Collection ${Math.floor(Math.random() * 999999)}`,
+            owner_uuid: activeUser.user.uuid,
+            preserve_version: true,
+            manifest_text: "",
+        }).as("destinationCollection");
+
+        cy.getAll("@sourceCollection", "@destinationCollection").then(function ([sourceCollection, destinationCollection]) {
+            // Visit collection, check basic information
+            cy.loginAs(activeUser);
+            cy.goToPath(`/collections/${sourceCollection.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("Move selected into existing collection").click();
+
+            cy.get("[data-cy=form-dialog]").contains(destinationCollection.name).click();
+
+            cy.get("[data-cy=form-submit-btn]").click();
+            cy.wait(2000);
+
+            cy.goToPath(`/collections/${destinationCollection.uuid}`);
+
+            cy.get("main").contains(destinationCollection.name).should("exist");
+            cy.get("[data-cy=collection-files-panel]").and("contain", "bar");
+        });
+    });
+
+    it("moves selected files into separate collections", () => {
+        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("sourceCollection");
+
+        cy.getAll("@sourceCollection").then(function ([sourceCollection]) {
+            // Visit collection, check basic information
+            cy.loginAs(activeUser);
+            cy.goToPath(`/collections/${sourceCollection.uuid}`);
+
+            // Select both files
+            cy.get("[data-cy=collection-files-panel]").within(() => {
+                cy.get("input[type=checkbox]").first().click();
+                cy.get("input[type=checkbox]").last().click();
+            });
+
+            // Copy to separate collections
+            cy.get("[data-cy=collection-files-panel-options-btn]").click();
+            cy.get("[data-cy=context-menu]").contains("Move selected into separate collections").click();
+            cy.get("[data-cy=form-dialog]").contains("Projects").click();
+            cy.get("[data-cy=form-submit-btn]").click();
+
+            // Verify created collections
+            cy.waitForDom().get(".layout-pane-primary", { timeout: 12000 }).contains("Projects").click();
+            cy.get("main").contains(`File moved from collection ${sourceCollection.name}/foo`).click();
+            cy.get("[data-cy=collection-files-panel]").and("contain", "foo");
+            cy.get(".layout-pane-primary").contains("Projects").click();
+            cy.get("main").contains(`File moved from collection ${sourceCollection.name}/bar`).click();
+            cy.get("[data-cy=collection-files-panel]").and("contain", "bar");
+        });
+    });
+
     it("creates new collection with properties on home project", function () {
         cy.loginAs(activeUser);
         cy.goToPath(`/projects/${activeUser.user.uuid}`);