16971: Fixed failing tests
[arvados-workbench2.git] / cypress / support / commands.js
index 3359055242609f4cfa99fc26835c32f4855cc306..069ed96dcf3631afec10e55478f6f635f96b6d4b 100644 (file)
 
 const controllerURL = Cypress.env('controller_url');
 const systemToken = Cypress.env('system_token');
+let createdResources = [];
+
+// Clean up on a 'before' hook to allow post-mortem analysis on individual tests.
+beforeEach(function () {
+    if (createdResources.length === 0) {
+        return;
+    }
+    cy.log(`Cleaning ${createdResources.length} previously created resource(s)`);
+    createdResources.forEach(function({suffix, uuid}) {
+        // Don't fail when a resource isn't already there, some objects may have
+        // been removed, directly or indirectly, from the test that created them.
+        cy.deleteResource(systemToken, suffix, uuid, false);
+    });
+    createdResources = [];
+});
 
 Cypress.Commands.add(
     "doRequest", (method = 'GET', path = '', data = null, qs = null,
-        token = systemToken, auth = false, followRedirect = true) => {
+        token = systemToken, auth = false, followRedirect = true, failOnStatusCode = true) => {
     return cy.request({
         method: method,
-        url: `${controllerURL}/${path}`,
+        url: `${controllerURL.replace(/\/+$/, '')}/${path.replace(/^\/+/, '')}`,
         body: data,
         qs: auth ? qs : Object.assign({ api_token: token }, qs),
         auth: auth ? { bearer: `${token}` } : undefined,
-        followRedirect: followRedirect
-    })
-}
-)
-
-// This resets the DB removing all content and seeding it with the fixtures.
-// TODO: Maybe we can add an optional param to avoid the loading part?
-Cypress.Commands.add(
-    "resetDB", () => {
-        cy.request('POST', `${controllerURL}/database/reset?api_token=${systemToken}`);
-    }
-)
+        followRedirect: followRedirect,
+        failOnStatusCode: failOnStatusCode
+    });
+});
 
 Cypress.Commands.add(
     "getUser", (username, first_name = '', last_name = '', is_admin = false, is_active = true) => {
@@ -148,14 +155,15 @@ Cypress.Commands.add(
         return cy.doRequest('POST', '/arvados/v1/' + suffix, data, null, token, true)
             .its('body').as('resource')
             .then(function () {
+                createdResources.push({suffix, uuid: this.resource.uuid});
                 return this.resource;
             })
     }
 )
 
 Cypress.Commands.add(
-    "deleteResource", (token, suffix, uuid) => {
-        return cy.doRequest('DELETE', '/arvados/v1/' + suffix + '/' + uuid)
+    "deleteResource", (token, suffix, uuid, failOnStatusCode = true) => {
+        return cy.doRequest('DELETE', '/arvados/v1/' + suffix + '/' + uuid, null, null, token, false, true, failOnStatusCode)
             .its('body').as('resource')
             .then(function () {
                 return this.resource;
@@ -175,19 +183,53 @@ Cypress.Commands.add(
 
 Cypress.Commands.add(
     "loginAs", (user) => {
+        cy.clearCookies()
+        cy.clearLocalStorage()
         cy.visit(`/token/?api_token=${user.token}`);
-        cy.url().should('contain', '/projects/');
+        cy.url({timeout: 10000}).should('contain', '/projects/');
         cy.get('div#root').should('contain', 'Arvados Workbench (zzzzz)');
         cy.get('div#root').should('not.contain', 'Your account is inactive');
     }
 )
 
+Cypress.Commands.add(
+    "testEditProjectOrCollection", (container, oldName, newName, newDescription, isProject = true) => {
+        cy.get(container).contains(oldName).rightclick();
+        cy.get('[data-cy=context-menu]').contains(isProject ? 'Edit project' : 'Edit collection').click();
+        cy.get('[data-cy=form-dialog]').within(() => {
+            cy.get('input[name=name]').clear().type(newName);
+            cy.get(isProject ? 'div[contenteditable=true]' : 'input[name=description]').clear().type(newDescription);
+            cy.get('[data-cy=form-submit-btn]').click();
+        });
+
+        cy.get(container).contains(newName).rightclick();
+        cy.get('[data-cy=context-menu]').contains(isProject ? 'Edit project' : 'Edit collection').click();
+        cy.get('[data-cy=form-dialog]').within(() => {
+            cy.get('input[name=name]').should('have.value', newName);
+
+            if (isProject) {
+                cy.get('span[data-text=true]').contains(newDescription);
+            } else {
+                cy.get('input[name=description]').should('have.value', newDescription);
+            }
+
+            cy.get('[data-cy=form-cancel-btn]').click();
+        });
+    }
+)
+
 Cypress.Commands.add(
     "doSearch", (searchTerm) => {
         cy.get('[data-cy=searchbar-input-field]').type(`{selectall}${searchTerm}{enter}`);
     }
 )
 
+Cypress.Commands.add(
+    "goToPath", (path) => {
+        return cy.window().its('appHistory').invoke('push', path);
+    }
+)
+
 Cypress.Commands.add('getAll', (...elements) => {
     const promise = cy.wrap([], { log: false })
 
@@ -207,37 +249,35 @@ Cypress.Commands.add('shareWith', (srcUserToken, targetUserUUID, itemUUID, permi
     });
 })
 
-Cypress.Commands.add('addToFavorites', (activeUserToken, activeUserUUID, itemUUID) => {
-    cy.createLink(activeUserToken, {
+Cypress.Commands.add('addToFavorites', (userToken, userUUID, itemUUID) => {
+    cy.createLink(userToken, {
         head_uuid: itemUUID,
         link_class: 'star',
         name: '',
-        owner_uuid: activeUserUUID,
-        tail_uuid: activeUserUUID,
+        owner_uuid: userUUID,
+        tail_uuid: userUUID,
     });
 })
 
-Cypress.Commands.add('createSharedProjects', (adminUser, activeUser) => {
-    cy.createGroup(adminUser.token, {
-        name: `my-shared-writable-project ${Math.floor(Math.random() * 999999)}`,
-        group_class: 'project',
-    }).as('mySharedWritableProject').then((mySharedWritableProject) => {
-        cy.shareWith(adminUser.token, activeUser.user.uuid, mySharedWritableProject.uuid, 'can_write');
-        cy.addToFavorites(activeUser.token, activeUser.user.uuid, mySharedWritableProject.uuid);
-    });
-
-    cy.createGroup(adminUser.token, {
-        name: `my-shared-readonly-project ${Math.floor(Math.random() * 999999)}`,
-        group_class: 'project',
-    }).as('mySharedReadonlyProject').then((mySharedReadonlyProject) => {
-        cy.shareWith(adminUser.token, activeUser.user.uuid, mySharedReadonlyProject.uuid, 'can_read');
-        cy.addToFavorites(activeUser.token, activeUser.user.uuid, mySharedReadonlyProject.uuid);
-    });
+Cypress.Commands.add('createProject', ({
+    owningUser,
+    targetUser,
+    projectName,
+    canWrite,
+    addToFavorites
+}) => {
+    const writePermission = canWrite ? 'can_write' : 'can_read';
 
-    cy.createGroup(activeUser.token, {
-        name: `my-project ${Math.floor(Math.random() * 999999)}`,
+    cy.createGroup(owningUser.token, {
+        name: `${projectName} ${Math.floor(Math.random() * 999999)}`,
         group_class: 'project',
-    }).as('myProject1').then((myProject1) => {
-        cy.addToFavorites(activeUser.token, activeUser.user.uuid, myProject1.uuid);
+    }).as(`${projectName}`).then((project) => {
+        if (targetUser && targetUser !== owningUser) {
+            cy.shareWith(owningUser.token, targetUser.user.uuid, project.uuid, writePermission);
+        }
+        if (addToFavorites) {
+            const user = targetUser ? targetUser : owningUser;
+            cy.addToFavorites(user.token, user.user.uuid, project.uuid);
+        }
     });
-})
\ No newline at end of file
+});
\ No newline at end of file