X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/58db72fee358d5987139a1b8526c0ca873e07dbf..8e191ecaf0e507dd1d685ca3ebeab954652d8e9e:/cypress/support/commands.js diff --git a/cypress/support/commands.js b/cypress/support/commands.js index 07290e55..842c9551 100644 --- a/cypress/support/commands.js +++ b/cypress/support/commands.js @@ -133,6 +133,12 @@ Cypress.Commands.add( } ) +Cypress.Commands.add( + "getCollection", (token, uuid) => { + return cy.getResource(token, 'collections', uuid) + } +) + Cypress.Commands.add( "createCollection", (token, data) => { return cy.createResource(token, 'collections', { @@ -150,13 +156,89 @@ Cypress.Commands.add( } ) +Cypress.Commands.add( + "getContainer", (token, uuid) => { + return cy.getResource(token, 'containers', uuid) + } +) + +Cypress.Commands.add( + "updateContainer", (token, uuid, data) => { + return cy.updateResource(token, 'containers', uuid, { + container: JSON.stringify(data) + }) + } +) + +Cypress.Commands.add( + 'createContainerRequest', (token, data) => { + return cy.createResource(token, 'container_requests', { + container_request: JSON.stringify(data), + ensure_unique_name: true + }) + } +) + +Cypress.Commands.add( + "updateContainerRequest", (token, uuid, data) => { + return cy.updateResource(token, 'container_requests', uuid, { + container_request: JSON.stringify(data) + }) + } +) + +Cypress.Commands.add( + "createLog", (token, data) => { + return cy.createResource(token, 'logs', { + log: JSON.stringify(data) + }) + } +) + +Cypress.Commands.add( + "logsForContainer", (token, uuid, logType, logTextArray = []) => { + let logs = []; + for (const logText of logTextArray) { + logs.push(cy.createLog(token, { + object_uuid: uuid, + event_type: logType, + properties: { + text: logText + } + }).as('lastLogRecord')) + } + cy.getAll('@lastLogRecord').then(function () { + return logs; + }) + } +) + +Cypress.Commands.add( + "createVirtualMachine", (token, data) => { + return cy.createResource(token, 'virtual_machines', { + virtual_machine: JSON.stringify(data), + ensure_unique_name: true + }) + } +) + +Cypress.Commands.add( + "getResource", (token, suffix, uuid) => { + return cy.doRequest('GET', `/arvados/v1/${suffix}/${uuid}`, null, {}, token) + .its('body') + .then(function (resource) { + return resource; + }) + } +) + Cypress.Commands.add( "createResource", (token, suffix, data) => { 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; + .its('body') + .then(function (resource) { + createdResources.push({suffix, uuid: resource.uuid}); + return resource; }) } ) @@ -164,19 +246,19 @@ Cypress.Commands.add( Cypress.Commands.add( "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; + .its('body') + .then(function (resource) { + return resource; }) } ) Cypress.Commands.add( "updateResource", (token, suffix, uuid, data) => { - return cy.doRequest('PUT', '/arvados/v1/' + suffix + '/' + uuid, data, null, token, true) - .its('body').as('resource') - .then(function () { - return this.resource; + return cy.doRequest('PATCH', '/arvados/v1/' + suffix + '/' + uuid, data, null, token, true) + .its('body') + .then(function (resource) { + return resource; }) } ) @@ -318,4 +400,77 @@ function b64toBlob(b64Data, contentType = '', sliceSize = 512) { const blob = new Blob(byteArrays, { type: contentType }); return blob -} \ No newline at end of file +} + +// From https://github.com/cypress-io/cypress/issues/7306#issuecomment-1076451070= +// This command requires the async package (https://www.npmjs.com/package/async) +Cypress.Commands.add('waitForDom', () => { + cy.window().then({ + // Don't timeout before waitForDom finishes + timeout: 10000 + }, win => { + let timeElapsed = 0; + + cy.log("Waiting for DOM mutations to complete"); + + return new Cypress.Promise((resolve) => { + // set the required variables + let async = require("async"); + let observerConfig = { attributes: true, childList: true, subtree: true }; + let items = Array.apply(null, { length: 50 }).map(Number.call, Number); + win.mutationCount = 0; + win.previousMutationCount = null; + + // create an observer instance + let observer = new win.MutationObserver((mutations) => { + mutations.forEach((mutation) => { + // Only record "attributes" type mutations that are not a "class" mutation. + // If the mutation is not an "attributes" type, then we always record it. + if (mutation.type === 'attributes' && mutation.attributeName !== 'class') { + win.mutationCount += 1; + } else if (mutation.type !== 'attributes') { + win.mutationCount += 1; + } + }); + + // initialize the previousMutationCount + if (win.previousMutationCount == null) win.previousMutationCount = 0; + }); + + // watch the document body for the specified mutations + observer.observe(win.document.body, observerConfig); + + // check the DOM for mutations up to 50 times for a maximum time of 5 seconds + async.eachSeries(items, function iteratee(item, callback) { + // keep track of the elapsed time so we can log it at the end of the command + timeElapsed = timeElapsed + 100; + + // make each iteration of the loop 100ms apart + setTimeout(() => { + if (win.mutationCount === win.previousMutationCount) { + // pass an argument to the async callback to exit the loop + return callback('Resolved - DOM changes complete.'); + } else if (win.previousMutationCount != null) { + // only set the previous count if the observer has checked the DOM at least once + win.previousMutationCount = win.mutationCount; + return callback(); + } else if (win.mutationCount === 0 && win.previousMutationCount == null && item === 4) { + // this is an early exit in case nothing is changing in the DOM. That way we only + // wait 500ms instead of the full 5 seconds when no DOM changes are occurring. + return callback('Resolved - Exiting early since no DOM changes were detected.'); + } else { + // proceed to the next iteration + return callback(); + } + }, 100); + }, function done() { + // Log the total wait time so users can see it + cy.log(`DOM mutations ${timeElapsed >= 5000 ? "did not complete" : "completed"} in ${timeElapsed} ms`); + + // disconnect the observer and resolve the promise + observer.disconnect(); + resolve(); + }); + }); + }); + });