20219: Rename doKeepRequest to doWebDAVRequest for clarity
[arvados-workbench2.git] / cypress / support / commands.js
index e98000fc71403462a2f67ffbb0008c804da5c4b0..2bb2ec278f6b5453e97c1fc3c5f3bac2bebe6355 100644 (file)
 // -- 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,12 @@ Cypress.Commands.add(
     }
 )
 
+Cypress.Commands.add(
+    "collectionReplaceFiles", (token, uuid, data) => {
+        return cy.updateResource(token, 'collections', uuid, JSON.stringify(data))
+    }
+)
+
 Cypress.Commands.add(
     "getContainer", (token, uuid) => {
         return cy.getResource(token, 'containers', uuid)
@@ -188,6 +214,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 +237,88 @@ 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, {
+                            collection: {
+                                preserve_version: true,
+                            },
+                            replace_files: {
+                                [`/${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', {