X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/a672dd5efb4c8ef394f61a7e7a5e513f80bf1427..d0c19f9eb52b9230d176a6c6e9e7e941c89d9e05:/cypress/support/commands.js diff --git a/cypress/support/commands.js b/cypress/support/commands.js index e98000fc..fadd73e0 100644 --- a/cypress/support/commands.js +++ b/cypress/support/commands.js @@ -28,10 +28,14 @@ // -- This will overwrite an existing command -- // Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... }) +import { extractFilesData } from "services/collection-service/collection-service-files-response"; + const controllerURL = Cypress.env('controller_url'); const systemToken = Cypress.env('system_token'); let createdResources = []; +const containerLogFolderPrefix = 'log for container '; + // Clean up on a 'before' hook to allow post-mortem analysis on individual tests. beforeEach(function () { if (createdResources.length === 0) { @@ -60,6 +64,22 @@ Cypress.Commands.add( }); }); +Cypress.Commands.add( + "doWebDAVRequest", (method = 'GET', path = '', data = null, qs = null, + token = systemToken, auth = false, followRedirect = true, failOnStatusCode = true) => { + return cy.doRequest('GET', '/arvados/v1/config', null, null).then(({body: config}) => { + return cy.request({ + method: method, + url: `${config.Services.WebDAVDownload.ExternalURL.replace(/\/+$/, '')}/${path.replace(/^\/+/, '')}`, + body: data, + qs: auth ? qs : Object.assign({ api_token: token }, qs), + auth: auth ? { bearer: `${token}` } : undefined, + followRedirect: followRedirect, + failOnStatusCode: failOnStatusCode + }); + }); +}); + Cypress.Commands.add( "getUser", (username, first_name = '', last_name = '', is_admin = false, is_active = true) => { // Create user if not already created @@ -151,12 +171,6 @@ 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', { @@ -166,6 +180,12 @@ Cypress.Commands.add( } ) +Cypress.Commands.add( + "getCollection", (token, uuid) => { + return cy.getResource(token, 'collections', uuid) + } +) + Cypress.Commands.add( "updateCollection", (token, uuid, data) => { return cy.updateResource(token, 'collections', uuid, { @@ -174,6 +194,17 @@ Cypress.Commands.add( } ) +Cypress.Commands.add( + "collectionReplaceFiles", (token, uuid, data) => { + return cy.updateResource(token, 'collections', uuid, { + collection: { + preserve_version: true, + }, + replace_files: JSON.stringify(data) + }) + } +) + Cypress.Commands.add( "getContainer", (token, uuid) => { return cy.getResource(token, 'containers', uuid) @@ -188,6 +219,12 @@ Cypress.Commands.add( } ) +Cypress.Commands.add( + "getContainerRequest", (token, uuid) => { + return cy.getResource(token, 'container_requests', uuid) + } +) + Cypress.Commands.add( 'createContainerRequest', (token, data) => { return cy.createResource(token, 'container_requests', { @@ -205,31 +242,83 @@ Cypress.Commands.add( } ) +/** + * Requires an admin token for log_uuid modification to succeed + */ Cypress.Commands.add( - "createLog", (token, data) => { - return cy.createResource(token, 'logs', { - log: JSON.stringify(data) + "appendLog", (token, crUuid, fileName, lines = []) => ( + cy.getContainerRequest(token, crUuid).then((containerRequest) => { + if (containerRequest.log_uuid) { + cy.listContainerRequestLogs(token, crUuid).then((logFiles) => { + const filePath = `${containerRequest.log_uuid}/${containerLogFolderPrefix}${containerRequest.container_uuid}/${fileName}`; + if (logFiles.find((file) => (file.name === fileName))) { + // File exists, fetch and append + return cy.doWebDAVRequest( + "GET", + `c=${filePath}`, + null, + null, + token + ) + .then(({ body: contents }) => cy.doWebDAVRequest( + "PUT", + `c=${filePath}`, + contents.split("\n").concat(lines).join("\n"), + null, + token + )); + } else { + // File not exists, put new file + cy.doWebDAVRequest( + "PUT", + `c=${filePath}`, + lines.join("\n"), + null, + token + ) + } + }); + } else { + // Create log collection + return cy.createCollection(token, { + name: `Test log collection ${Math.floor(Math.random() * 999999)}`, + owner_uuid: containerRequest.owner_uuid, + manifest_text: "" + }).then((collection) => { + // Update CR log_uuid to fake log collection + cy.updateContainerRequest(token, containerRequest.uuid, { + log_uuid: collection.uuid, + }).then(() => ( + // Create empty directory for container uuid + cy.collectionReplaceFiles(token, collection.uuid, { + [`/${containerLogFolderPrefix}${containerRequest.container_uuid}`]: "d41d8cd98f00b204e9800998ecf8427e+0" + }).then(() => ( + // Put new log file with contents into fake log collection + cy.doWebDAVRequest( + 'PUT', + `c=${collection.uuid}/${containerLogFolderPrefix}${containerRequest.container_uuid}/${fileName}`, + lines.join('\n'), + null, + token + ) + )) + )); + }); + } }) - } + ) ) 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; - }) - } -) + "listContainerRequestLogs", (token, crUuid) => ( + cy.getContainerRequest(token, crUuid).then((containerRequest) => ( + cy.doWebDAVRequest('PROPFIND', `c=${containerRequest.log_uuid}/${containerLogFolderPrefix}${containerRequest.container_uuid}`, null, null, token) + .then(({body: data}) => { + return extractFilesData(new DOMParser().parseFromString(data, "text/xml")); + }) + )) + ) +); Cypress.Commands.add( "createVirtualMachine", (token, data) => { @@ -387,9 +476,11 @@ Cypress.Commands.add( { prevSubject: 'element', }, - (subject, file, fileName) => { + (subject, file, fileName, binaryMode = true) => { cy.window().then(window => { - const blob = b64toBlob(file, '', 512); + const blob = binaryMode + ? b64toBlob(file, '', 512) + : new Blob([file], {type: 'text/plain'}); const testFile = new window.File([blob], fileName); cy.wrap(subject).trigger('drop', {