16073: Add process io panel cypress tests
authorStephen Smith <stephen@curii.com>
Tue, 19 Jul 2022 14:05:50 +0000 (10:05 -0400)
committerStephen Smith <stephen@curii.com>
Tue, 19 Jul 2022 14:12:36 +0000 (10:12 -0400)
Arvados-DCO-1.1-Signed-off-by: Stephen Smith <stephen@curii.com>

.licenseignore
cypress/fixtures/files/cat.png [new file with mode: 0644]
cypress/fixtures/webdav-propfind-outputs.xml [new file with mode: 0644]
cypress/integration/process.spec.js

index 7622a59435b0c54d3ed22a3a57691dc4ebd73dea..2440cc334e144c8aecc3fa8a8952069c16634b68 100644 (file)
@@ -15,6 +15,8 @@ public/*
 src/lib/cwl-svg/*
 tools/arvados_config.yml
 cypress/fixtures/files/5mb.bin
+cypress/fixtures/files/cat.png
+cypress/fixtures/webdav-propfind-outputs.xml
 .yarn/releases/*
 package.json
 yarn.lock
diff --git a/cypress/fixtures/files/cat.png b/cypress/fixtures/files/cat.png
new file mode 100644 (file)
index 0000000..6ebc4ba
Binary files /dev/null and b/cypress/fixtures/files/cat.png differ
diff --git a/cypress/fixtures/webdav-propfind-outputs.xml b/cypress/fixtures/webdav-propfind-outputs.xml
new file mode 100644 (file)
index 0000000..4bd1659
--- /dev/null
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<D:multistatus xmlns:D="DAV:">
+  <D:response>
+    <D:href>/c=zzzzz-4zz18-zzzzzzzzzzzzzzz/</D:href>
+    <D:propstat>
+      <D:prop>
+        <D:resourcetype>
+          <D:collection xmlns:D="DAV:" />
+        </D:resourcetype>
+        <D:getlastmodified>Mon, 11 Jul 2022 21:54:20 GMT</D:getlastmodified>
+        <D:supportedlock>
+          <D:lockentry xmlns:D="DAV:">
+            <D:lockscope>
+              <D:exclusive />
+            </D:lockscope>
+            <D:locktype>
+              <D:write />
+            </D:locktype>
+          </D:lockentry>
+        </D:supportedlock>
+        <D:displayname></D:displayname>
+      </D:prop>
+      <D:status>HTTP/1.1 200 OK</D:status>
+    </D:propstat>
+  </D:response>
+  <D:response>
+    <D:href>/c=zzzzz-4zz18-zzzzzzzzzzzzzzz/cwl.output.json</D:href>
+    <D:propstat>
+      <D:prop>
+        <D:displayname>cwl.output.json</D:displayname>
+        <D:getcontentlength>141</D:getcontentlength>
+        <D:getlastmodified>Mon, 11 Jul 2022 21:54:20 GMT</D:getlastmodified>
+        <D:supportedlock>
+          <D:lockentry xmlns:D="DAV:">
+            <D:lockscope>
+              <D:exclusive />
+            </D:lockscope>
+            <D:locktype>
+              <D:write />
+            </D:locktype>
+          </D:lockentry>
+        </D:supportedlock>
+        <D:resourcetype></D:resourcetype>
+        <D:getcontenttype>application/json</D:getcontenttype>
+        <D:getetag>"000000000000000000"</D:getetag>
+      </D:prop>
+      <D:status>HTTP/1.1 200 OK</D:status>
+    </D:propstat>
+  </D:response>
+</D:multistatus>
index 55290fa36bb4d8a97ecd47b3056f185a4ed83396..b9022a4c4d2262e33d9947a3374725e9cb90e0aa 100644 (file)
@@ -274,4 +274,627 @@ describe('Process tests', function() {
                 .should('contain', 'Process retried 2 times');
         });
     });
+
+
+    it('displays IO parameters with keep links and previews', function() {
+        const testInputs = [
+            {
+                definition: {
+                    "id": "#main/input_file",
+                    "label": "Label Description",
+                    "type": "File"
+                },
+                input: {
+                    "input_file": {
+                        "basename": "input1.tar",
+                        "class": "File",
+                        "location": "keep:00000000000000000000000000000000+01/input1.tar",
+                        "secondaryFiles": [
+                            {
+                                "basename": "input1-2.txt",
+                                "class": "File",
+                                "location": "keep:00000000000000000000000000000000+01/input1-2.txt"
+                            },
+                            {
+                                "basename": "input1-3.txt",
+                                "class": "File",
+                                "location": "keep:00000000000000000000000000000000+01/input1-3.txt"
+                            },
+                            {
+                                "basename": "input1-4.txt",
+                                "class": "File",
+                                "location": "keep:00000000000000000000000000000000+01/input1-4.txt"
+                            }
+                        ]
+                    }
+                }
+            },
+            {
+                definition: {
+                    "id": "#main/input_dir",
+                    "doc": "Doc Description",
+                    "type": "Directory"
+                },
+                input: {
+                    "input_dir": {
+                        "basename": "11111111111111111111111111111111+01",
+                        "class": "Directory",
+                        "location": "keep:11111111111111111111111111111111+01"
+                    }
+                }
+            },
+            {
+                definition: {
+                    "id": "#main/input_bool",
+                    "doc": ["Doc desc 1", "Doc desc 2"],
+                    "type": "boolean"
+                },
+                input: {
+                    "input_bool": true,
+                }
+            },
+            {
+                definition: {
+                    "id": "#main/input_int",
+                    "type": "int"
+                },
+                input: {
+                    "input_int": 1,
+                }
+            },
+            {
+                definition: {
+                    "id": "#main/input_long",
+                    "type": "long"
+                },
+                input: {
+                    "input_long" : 1,
+                }
+            },
+            {
+                definition: {
+                    "id": "#main/input_float",
+                    "type": "float"
+                },
+                input: {
+                    "input_float": 1.5,
+                }
+            },
+            {
+                definition: {
+                    "id": "#main/input_double",
+                    "type": "double"
+                },
+                input: {
+                    "input_double": 1.3,
+                }
+            },
+            {
+                definition: {
+                    "id": "#main/input_string",
+                    "type": "string"
+                },
+                input: {
+                    "input_string": "Hello World",
+                }
+            },
+            {
+                definition: {
+                    "id": "#main/input_file_array",
+                    "type": {
+                      "items": "File",
+                      "type": "array"
+                    }
+                },
+                input: {
+                    "input_file_array": [
+                        {
+                            "basename": "input2.tar",
+                            "class": "File",
+                            "location": "keep:00000000000000000000000000000000+02/input2.tar"
+                        },
+                        {
+                            "basename": "input3.tar",
+                            "class": "File",
+                            "location": "keep:00000000000000000000000000000000+03/input3.tar",
+                            "secondaryFiles": [
+                                {
+                                    "basename": "input3-2.txt",
+                                    "class": "File",
+                                    "location": "keep:00000000000000000000000000000000+03/input3-2.txt"
+                                }
+                            ]
+                        }
+                    ]
+                }
+            },
+            {
+                definition: {
+                    "id": "#main/input_dir_array",
+                    "type": {
+                      "items": "Directory",
+                      "type": "array"
+                    }
+                },
+                input: {
+                    "input_dir_array": [
+                        {
+                            "basename": "11111111111111111111111111111111+02",
+                            "class": "Directory",
+                            "location": "keep:11111111111111111111111111111111+02"
+                        },
+                        {
+                            "basename": "11111111111111111111111111111111+03",
+                            "class": "Directory",
+                            "location": "keep:11111111111111111111111111111111+03"
+                        }
+                    ]
+                }
+            },
+            {
+                definition: {
+                    "id": "#main/input_int_array",
+                    "type": {
+                      "items": "int",
+                      "type": "array"
+                    }
+                },
+                input: {
+                    "input_int_array": [
+                        1,
+                        3,
+                        5
+                    ]
+                }
+            },
+            {
+                definition: {
+                    "id": "#main/input_long_array",
+                    "type": {
+                      "items": "long",
+                      "type": "array"
+                    }
+                },
+                input: {
+                    "input_long_array": [
+                        10,
+                        20
+                    ]
+                }
+            },
+            {
+                definition: {
+                    "id": "#main/input_float_array",
+                    "type": {
+                      "items": "float",
+                      "type": "array"
+                    }
+                },
+                input: {
+                    "input_float_array": [
+                        10.2,
+                        10.4,
+                        10.6
+                    ]
+                }
+            },
+            {
+                definition: {
+                    "id": "#main/input_double_array",
+                    "type": {
+                      "items": "double",
+                      "type": "array"
+                    }
+                },
+                input: {
+                    "input_double_array": [
+                        20.1,
+                        20.2,
+                        20.3
+                    ]
+                }
+            },
+            {
+                definition: {
+                    "id": "#main/input_string_array",
+                    "type": {
+                      "items": "string",
+                      "type": "array"
+                    }
+                },
+                input: {
+                    "input_string_array": [
+                        "Hello",
+                        "World",
+                        "!"
+                    ]
+                }
+            }
+        ];
+
+        const testOutputs = [
+            {
+                definition: {
+                    "id": "#main/output_file",
+                    "label": "Label Description",
+                    "type": "File"
+                },
+                output: {
+                    "output_file": {
+                        "basename": "cat.png",
+                        "class": "File",
+                        "location": "cat.png"
+                    }
+                }
+            },
+            {
+                definition: {
+                    "id": "#main/output_file_with_secondary",
+                    "doc": "Doc Description",
+                    "type": "File"
+                },
+                output: {
+                    "output_file_with_secondary": {
+                        "basename": "main.dat",
+                        "class": "File",
+                        "location": "main.dat",
+                        "secondaryFiles": [
+                            {
+                                "basename": "secondary.dat",
+                                "class": "File",
+                                "location": "secondary.dat"
+                            },
+                            {
+                                "basename": "secondary2.dat",
+                                "class": "File",
+                                "location": "secondary2.dat"
+                            }
+                        ]
+                    }
+                }
+            },
+            {
+                definition: {
+                    "id": "#main/output_dir",
+                    "doc": ["Doc desc 1", "Doc desc 2"],
+                    "type": "Directory"
+                },
+                output: {
+                    "output_dir": {
+                        "basename": "outdir1",
+                        "class": "Directory",
+                        "location": "outdir1"
+                    }
+                }
+            },
+            {
+                definition: {
+                    "id": "#main/output_bool",
+                    "type": "boolean"
+                },
+                output: {
+                    "output_bool": true
+                }
+            },
+            {
+                definition: {
+                    "id": "#main/output_int",
+                    "type": "int"
+                },
+                output: {
+                    "output_int": 1
+                }
+            },
+            {
+                definition: {
+                    "id": "#main/output_long",
+                    "type": "long"
+                },
+                output: {
+                    "output_long": 1
+                }
+            },
+            {
+                definition: {
+                    "id": "#main/output_float",
+                    "type": "float"
+                },
+                output: {
+                    "output_float": 100.5
+                }
+            },
+            {
+                definition: {
+                    "id": "#main/output_double",
+                    "type": "double"
+                },
+                output: {
+                    "output_double": 100.3
+                }
+            },
+            {
+                definition: {
+                    "id": "#main/output_string",
+                    "type": "string"
+                },
+                output: {
+                    "output_string": "Hello output"
+                }
+            },
+            {
+                definition: {
+                    "id": "#main/output_file_array",
+                    "type": {
+                        "items": "File",
+                        "type": "array"
+                    }
+                },
+                output: {
+                    "output_file_array": [
+                        {
+                            "basename": "output2.tar",
+                            "class": "File",
+                            "location": "output2.tar"
+                        },
+                        {
+                            "basename": "output3.tar",
+                            "class": "File",
+                            "location": "output3.tar"
+                        }
+                    ]
+                }
+            },
+            {
+                definition: {
+                    "id": "#main/output_dir_array",
+                    "type": {
+                        "items": "Directory",
+                        "type": "array"
+                    }
+                },
+                output: {
+                    "output_dir_array": [
+                        {
+                            "basename": "outdir2",
+                            "class": "Directory",
+                            "location": "outdir2"
+                        },
+                        {
+                            "basename": "outdir3",
+                            "class": "Directory",
+                            "location": "outdir3"
+                        }
+                    ]
+                }
+            },
+            {
+                definition: {
+                    "id": "#main/output_int_array",
+                    "type": {
+                        "items": "int",
+                        "type": "array"
+                    }
+                },
+                output: {
+                    "output_int_array": [
+                        10,
+                        11,
+                        12
+                    ]
+                }
+            },
+            {
+                definition: {
+                    "id": "#main/output_long_array",
+                    "type": {
+                        "items": "long",
+                        "type": "array"
+                    }
+                },
+                output: {
+                    "output_long_array": [
+                        51,
+                        52
+                    ]
+                }
+            },
+            {
+                definition: {
+                    "id": "#main/output_float_array",
+                    "type": {
+                        "items": "float",
+                        "type": "array"
+                    }
+                },
+                output: {
+                    "output_float_array": [
+                        100.2,
+                        100.4,
+                        100.6
+                    ]
+                }
+            },
+            {
+                definition: {
+                    "id": "#main/output_double_array",
+                    "type": {
+                        "items": "double",
+                        "type": "array"
+                    }
+                },
+                output: {
+                    "output_double_array": [
+                        100.1,
+                        100.2,
+                        100.3
+                    ]
+                }
+            },
+            {
+                definition: {
+                    "id": "#main/output_string_array",
+                    "type": {
+                        "items": "string",
+                        "type": "array"
+                    }
+                },
+                output: {
+                    "output_string_array": [
+                        "Hello",
+                        "Output",
+                        "!"
+                    ]
+                }
+            }
+        ];
+
+        const verifyParameter = (name, doc, val) => {
+            cy.get('table tr').contains(name).parents('tr').within(() => {
+                doc && cy.contains(doc);
+                val && cy.contains(val);
+            });
+        };
+
+        const verifyImage = (name, url) => {
+            cy.get('table tr').contains(name).parents('tr').within(() => {
+                cy.get('[alt="Inline Preview"]')
+                    .should('be.visible')
+                    .and(($img) => {
+                        expect($img[0].naturalWidth).to.be.greaterThan(0);
+                        expect($img[0].src).contains(url);
+                    })
+            });
+        }
+
+        // Create output collection for real files
+        cy.createCollection(adminUser.token, {
+            name: `Test collection ${Math.floor(Math.random() * 999999)}`,
+            owner_uuid: activeUser.user.uuid,
+        }).then((testOutputCollection) => {
+                    cy.loginAs(activeUser);
+
+                    cy.goToPath(`/collections/${testOutputCollection.uuid}`);
+
+                    cy.get('[data-cy=upload-button]').click();
+
+                    cy.fixture('files/cat.png', 'base64').then(content => {
+                        cy.get('[data-cy=drag-and-drop]').upload(content, 'cat.png');
+                        cy.get('[data-cy=form-submit-btn]').click();
+                        cy.waitForDom().get('[data-cy=form-submit-btn]').should('not.exist');
+                        // Confirm final collection state.
+                        cy.get('[data-cy=collection-files-panel]')
+                            .contains('cat.png').should('exist');
+                    });
+
+                    cy.getCollection(activeUser.token, testOutputCollection.uuid).as('testOutputCollection');
+                });
+
+        // Get updated collection pdh
+        cy.getAll('@testOutputCollection').then(([testOutputCollection]) => {
+            // Add output uuid and inputs to container request
+            cy.intercept({method: 'GET', url: '**/arvados/v1/container_requests/*'}, (req) => {
+                req.reply((res) => {
+                    res.body.output_uuid = testOutputCollection.uuid;
+                    res.body.mounts["/var/lib/cwl/cwl.input.json"] = {
+                        content: testInputs.map((param) => (param.input)).reduce((acc, val) => (Object.assign(acc, val)), {})
+                    };
+                    res.body.mounts["/var/lib/cwl/workflow.json"] = {
+                        content: {
+                            $graph: [{
+                                id: "#main",
+                                inputs: testInputs.map((input) => (input.definition)),
+                                outputs: testOutputs.map((output) => (output.definition))
+                            }]
+                        }
+                    };
+                });
+            });
+
+            // Stub fake output collection
+            cy.intercept({method: 'GET', url: `**/arvados/v1/collections/${testOutputCollection.uuid}*`}, {
+                statusCode: 200,
+                body: {
+                    uuid: testOutputCollection.uuid,
+                    portable_data_hash: testOutputCollection.portable_data_hash,
+                }
+            });
+
+            // Stub fake output json
+            cy.intercept({method: 'GET', url: '**/c%3Dzzzzz-4zz18-zzzzzzzzzzzzzzz/cwl.output.json'}, {
+                statusCode: 200,
+                body: testOutputs.map((param) => (param.output)).reduce((acc, val) => (Object.assign(acc, val)), {})
+            });
+
+            // Stub webdav response, points to output json
+            cy.intercept({method: 'PROPFIND', url: '*'}, {
+                fixture: 'webdav-propfind-outputs.xml',
+            });
+        });
+
+        createContainerRequest(
+            activeUser,
+            'test_container_request',
+            'arvados/jobs',
+            ['echo', 'hello world'],
+            false, 'Committed')
+        .as('containerRequest');
+
+        cy.getAll('@containerRequest', '@testOutputCollection').then(function([containerRequest, testOutputCollection]) {
+            cy.goToPath(`/processes/${containerRequest.uuid}`);
+            cy.get('[data-cy=process-io-card] h6').contains('Inputs')
+                .parents('[data-cy=process-io-card]').within(() => {
+                    cy.wait(2000);
+                    cy.waitForDom();
+                    verifyParameter('input_file', "Label Description", 'keep:00000000000000000000000000000000+01/input1.tar');
+                    verifyParameter('input_file', "Label Description", 'keep:00000000000000000000000000000000+01/input1-2.txt');
+                    verifyParameter('input_file', "Label Description", 'keep:00000000000000000000000000000000+01/input1-3.txt');
+                    verifyParameter('input_file', "Label Description", 'keep:00000000000000000000000000000000+01/input1-4.txt');
+                    verifyParameter('input_dir', "Doc Description", 'keep:11111111111111111111111111111111+01/');
+                    verifyParameter('input_bool', "Doc desc 1, Doc desc 2", 'true');
+                    verifyParameter('input_int', null, '1');
+                    verifyParameter('input_long', null, '1');
+                    verifyParameter('input_float', null, '1.5');
+                    verifyParameter('input_double', null, '1.3');
+                    verifyParameter('input_string', null, 'Hello World');
+                    verifyParameter('input_file_array', null, 'keep:00000000000000000000000000000000+02/input2.tar');
+                    verifyParameter('input_file_array', null, 'keep:00000000000000000000000000000000+03/input3.tar');
+                    verifyParameter('input_file_array', null, 'keep:00000000000000000000000000000000+03/input3-2.txt');
+                    verifyParameter('input_dir_array', null, 'keep:11111111111111111111111111111111+02/');
+                    verifyParameter('input_dir_array', null, 'keep:11111111111111111111111111111111+03/');
+                    verifyParameter('input_int_array', null, '1, 3, 5');
+                    verifyParameter('input_long_array', null, '10, 20');
+                    verifyParameter('input_float_array', null, '10.2, 10.4, 10.6');
+                    verifyParameter('input_double_array', null, '20.1, 20.2, 20.3');
+                    verifyParameter('input_string_array', null, 'Hello, World, !');
+                });
+            cy.get('[data-cy=process-io-card] h6').contains('Outputs')
+                .parents('[data-cy=process-io-card]').within((ctx) => {
+                    cy.get(ctx).scrollIntoView();
+                    const outPdh = testOutputCollection.portable_data_hash;
+
+                    verifyParameter('output_file', "Label Description", `keep:${outPdh}/cat.png`);
+                    verifyImage('output_file', `/c=${outPdh}/cat.png`);
+                    verifyParameter('output_file_with_secondary', "Doc Description", `keep:${outPdh}/main.dat`);
+                    verifyParameter('output_file_with_secondary', "Doc Description", `keep:${outPdh}/secondary.dat`);
+                    verifyParameter('output_file_with_secondary', "Doc Description", `keep:${outPdh}/secondary2.dat`);
+                    verifyParameter('output_dir', "Doc desc 1, Doc desc 2", `keep:${outPdh}/outdir1`);
+                    verifyParameter('output_bool', null, 'true');
+                    verifyParameter('output_int', null, '1');
+                    verifyParameter('output_long', null, '1');
+                    verifyParameter('output_float', null, '100.5');
+                    verifyParameter('output_double', null, '100.3');
+                    verifyParameter('output_string', null, 'Hello output');
+                    verifyParameter('output_file_array', null, `keep:${outPdh}/output2.tar`);
+                    verifyParameter('output_file_array', null, `keep:${outPdh}/output3.tar`);
+                    verifyParameter('output_dir_array', null, `keep:${outPdh}/outdir2`);
+                    verifyParameter('output_dir_array', null, `keep:${outPdh}/outdir3`);
+                    verifyParameter('output_int_array', null, '10, 11, 12');
+                    verifyParameter('output_long_array', null, '51, 52');
+                    verifyParameter('output_float_array', null, '100.2, 100.4, 100.6');
+                    verifyParameter('output_double_array', null, '100.1, 100.2, 100.3');
+                    verifyParameter('output_string_array', null, 'Hello, Output, !');
+                });
+        });
+    });
+
 });