Merge branch '17686-array-input-null' refs #17686
authorPeter Amstutz <peter.amstutz@curii.com>
Wed, 19 May 2021 18:22:47 +0000 (14:22 -0400)
committerPeter Amstutz <peter.amstutz@curii.com>
Wed, 19 May 2021 18:22:47 +0000 (14:22 -0400)
Arvados-DCO-1.1-Signed-off-by: Peter Amstutz <peter.amstutz@curii.com>

cypress/fixtures/workflow_with_array_fields.yaml
cypress/fixtures/workflow_with_default_array_fields.yaml [new file with mode: 0644]
cypress/integration/create-workflow.spec.js
cypress/integration/favorites.spec.js
src/views/run-process-panel/inputs/directory-array-input.tsx
src/views/run-process-panel/inputs/file-array-input.tsx

index fc71cf8691c19617e87580237084a132071e988c..33f03f6b3b63d777c3f5e823ab9e3a17c69a6154 100644 (file)
     class: http://arvados.org/cwl#WorkflowRunnerResources
   id: "#main"
   inputs:
-  - default: []
-    id: "#main/bar"
+  - id: "#main/bar"
     type:
       items: Directory
       type: array
-  - default: []
-    id: "#main/foo"
+  - id: "#main/foo"
     type:
       items: File
       type: array
diff --git a/cypress/fixtures/workflow_with_default_array_fields.yaml b/cypress/fixtures/workflow_with_default_array_fields.yaml
new file mode 100644 (file)
index 0000000..fc71cf8
--- /dev/null
@@ -0,0 +1,26 @@
+# Copyright (C) The Arvados Authors. All rights reserved.
+#
+# SPDX-License-Identifier: AGPL-3.0
+
+---
+"$graph":
+- class: Workflow
+  cwlVersion: v1.2
+  hints:
+  - acrContainerImage: 7009415fdc959d0c2819ee2e9db96561+261
+    class: http://arvados.org/cwl#WorkflowRunnerResources
+  id: "#main"
+  inputs:
+  - default: []
+    id: "#main/bar"
+    type:
+      items: Directory
+      type: array
+  - default: []
+    id: "#main/foo"
+    type:
+      items: File
+      type: array
+  outputs: []
+  steps: []
+cwlVersion: v1.2
index 0059499855438f4d140ea624887412003854fe3d..4da747578c8aad449e490b3466d6e8a66c1bae63 100644 (file)
@@ -111,4 +111,102 @@ describe('Multi-file deletion tests', function () {
                 .find('button').contains('Run Process').should('not.be.disabled');
         });
     });
+
+    ['workflow_with_array_fields.yaml', 'workflow_with_default_array_fields.yaml'].forEach((yamlfile) =>
+    it('can select multi files when creating workflow '+yamlfile, () => {
+        cy.createProject({
+            owningUser: activeUser,
+            projectName: 'myProject1',
+            addToFavorites: true
+        });
+
+        cy.createCollection(adminUser.token, {
+            name: `Test collection ${Math.floor(Math.random() * 999999)}`,
+            owner_uuid: activeUser.user.uuid,
+            manifest_text: ". 37b51d194a7513e45b56f6524f2d51f2+3 0:3:bar\n. 37b51d194a7513e45b56f6524f2d51f2+3 0:3:baz\n"
+        })
+            .as('testCollection');
+
+        cy.createCollection(adminUser.token, {
+            name: `Test collection ${Math.floor(Math.random() * 999999)}`,
+            owner_uuid: activeUser.user.uuid,
+            manifest_text: `. 37b51d194a7513e45b56f6524f2d51f2+3 0:3:buz\n`
+        })
+            .as('testCollection2');
+
+        cy.getAll('@myProject1', '@testCollection', '@testCollection2')
+            .then(function ([myProject1, testCollection, testCollection2]) {
+                cy.readFile('cypress/fixtures/'+yamlfile).then(workflow => {
+                    cy.createWorkflow(adminUser.token, {
+                        name: `TestWorkflow${Math.floor(Math.random() * 999999)}.cwl`,
+                        definition: workflow,
+                        owner_uuid: myProject1.uuid,
+                    })
+                        .as('testWorkflow');
+                });
+
+                cy.loginAs(activeUser);
+
+                cy.get('main').contains(myProject1.name).click();
+
+                cy.get('[data-cy=side-panel-button]').click();
+
+                cy.get('#aside-menu-list').contains('Run a process').click();
+
+                cy.get('@testWorkflow')
+                    .then((testWorkflow) => {
+                        cy.get('main').contains(testWorkflow.name).click();
+                        cy.get('[data-cy=run-process-next-button]').click();
+
+                        cy.get('label').contains('#main/foo').parent('div').find('input').click();
+                        cy.get('div[role=dialog]')
+                            .within(() => {
+                                cy.get('p').contains('Projects').closest('div[role=button]')
+                                    .within(() => {
+                                        cy.get('svg[role=presentation]')
+                                            .click({ multiple: true });
+                                    });
+
+                                cy.get(`[data-id=${testCollection.uuid}]`)
+                                    .find('i').click();
+
+                                cy.contains('bar').closest('[data-action=TOGGLE_ACTIVE]').parent().find('input[type=checkbox]').click();
+
+                                cy.contains('baz').closest('[data-action=TOGGLE_ACTIVE]').parent().find('input[type=checkbox]').click();
+
+                                cy.get('[data-cy=ok-button]').click();
+                            });
+
+                        cy.get('label').contains('#main/bar').parent('div').find('input').click();
+                        cy.get('div[role=dialog]')
+                            .within(() => {
+                                cy.get('p').contains('Projects').closest('div[role=button]')
+                                    .within(() => {
+                                        cy.get('svg[role=presentation]')
+                                            .click({ multiple: true });
+                                    });
+
+                                cy.get(`[data-id=${testCollection.uuid}]`)
+                                    .find('input[type=checkbox]').click();
+
+                                cy.get(`[data-id=${testCollection2.uuid}]`)
+                                    .find('input[type=checkbox]').click();
+
+                                cy.get('[data-cy=ok-button]').click();
+                            });
+                    });
+
+                cy.get('label').contains('#main/foo').parent('div')
+                    .within(() => {
+                        cy.contains('baz');
+                        cy.contains('bar');
+                    });
+
+                cy.get('label').contains('#main/bar').parent('div')
+                    .within(() => {
+                        cy.contains(testCollection.name);
+                        cy.contains(testCollection2.name);
+                    });
+            });
+    }));
 })
index 6750650dc2789d66257463e4b37c9bbcf0e4fc70..6e9091e1b76e63e3329df636af5279cabd9d47a1 100644 (file)
@@ -204,101 +204,4 @@ describe('Favorites tests', function () {
                     });
             });
     });
-
-    it('can select multi files when creating workflow', () => {
-        cy.createProject({
-            owningUser: activeUser,
-            projectName: 'myProject1',
-            addToFavorites: true
-        });
-
-        cy.createCollection(adminUser.token, {
-            name: `Test collection ${Math.floor(Math.random() * 999999)}`,
-            owner_uuid: activeUser.user.uuid,
-            manifest_text: ". 37b51d194a7513e45b56f6524f2d51f2+3 0:3:bar\n. 37b51d194a7513e45b56f6524f2d51f2+3 0:3:baz\n"
-        })
-            .as('testCollection');
-
-        cy.createCollection(adminUser.token, {
-            name: `Test collection ${Math.floor(Math.random() * 999999)}`,
-            owner_uuid: activeUser.user.uuid,
-            manifest_text: `. 37b51d194a7513e45b56f6524f2d51f2+3 0:3:buz\n`
-        })
-            .as('testCollection2');
-
-        cy.getAll('@myProject1', '@testCollection', '@testCollection2')
-            .then(function ([myProject1, testCollection, testCollection2]) {
-                cy.readFile('cypress/fixtures/workflow_with_array_fields.yaml').then(workflow => {
-                    cy.createWorkflow(adminUser.token, {
-                        name: `TestWorkflow${Math.floor(Math.random() * 999999)}.cwl`,
-                        definition: workflow,
-                        owner_uuid: myProject1.uuid,
-                    })
-                        .as('testWorkflow');
-                });
-
-                cy.loginAs(activeUser);
-
-                cy.get('main').contains(myProject1.name).click();
-
-                cy.get('[data-cy=side-panel-button]').click();
-
-                cy.get('#aside-menu-list').contains('Run a process').click();
-
-                cy.get('@testWorkflow')
-                    .then((testWorkflow) => {
-                        cy.get('main').contains(testWorkflow.name).click();
-                        cy.get('[data-cy=run-process-next-button]').click();
-
-                        cy.get('label').contains('#main/foo').parent('div').find('input').click();
-                        cy.get('div[role=dialog]')
-                            .within(() => {
-                                cy.get('p').contains('Projects').closest('div[role=button]')
-                                    .within(() => {
-                                        cy.get('svg[role=presentation]')
-                                            .click({ multiple: true });
-                                    });
-
-                                cy.get(`[data-id=${testCollection.uuid}]`)
-                                    .find('i').click();
-
-                                cy.contains('bar').closest('[data-action=TOGGLE_ACTIVE]').parent().find('input[type=checkbox]').click();
-
-                                cy.contains('baz').closest('[data-action=TOGGLE_ACTIVE]').parent().find('input[type=checkbox]').click();
-
-                                cy.get('[data-cy=ok-button]').click();
-                            });
-
-                        cy.get('label').contains('#main/bar').parent('div').find('input').click();
-                        cy.get('div[role=dialog]')
-                            .within(() => {
-                                cy.get('p').contains('Projects').closest('div[role=button]')
-                                    .within(() => {
-                                        cy.get('svg[role=presentation]')
-                                            .click({ multiple: true });
-                                    });
-
-                                cy.get(`[data-id=${testCollection.uuid}]`)
-                                    .find('input[type=checkbox]').click();
-
-                                cy.get(`[data-id=${testCollection2.uuid}]`)
-                                    .find('input[type=checkbox]').click();
-
-                                cy.get('[data-cy=ok-button]').click();
-                            });
-                    });
-
-                cy.get('label').contains('#main/foo').parent('div')
-                    .within(() => {
-                        cy.contains('baz');
-                        cy.contains('bar');
-                    });
-
-                cy.get('label').contains('#main/bar').parent('div')
-                    .within(() => {
-                        cy.contains(testCollection.name);
-                        cy.contains(testCollection2.name);
-                    });
-            });
-    });
-});
\ No newline at end of file
+});
index 2949d07ef0aeaea7928bc3c1187b7980104c3fd2..73e946f6bdd2a161a0d0b55212cfa8a6017f8c6c 100644 (file)
@@ -59,7 +59,7 @@ const parse = (directory: CollectionResource): Directory => ({
 });
 
 const formatDirectories = (directories: Directory[] = []) =>
-    directories.map(format);
+    directories ? directories.map(format) : [];
 
 const format = ({ location = '', basename = '' }: Directory): FormattedDirectory => ({
     portableDataHash: location.replace('keep:', ''),
@@ -299,6 +299,3 @@ const DirectoryArrayInputComponent = connect(mapStateToProps)(
     });
 
 type DialogContentCssRules = 'root' | 'tree' | 'divider' | 'chips';
-
-
-
index 953100139541d574a958012f4bf27f342c590109..b82fd004151a96ed84d011b3b39f315a5840e2c1 100644 (file)
@@ -53,7 +53,7 @@ const parse = (file: CollectionFile): File => ({
 });
 
 const formatFiles = (files: File[] = []) =>
-    files.map(format);
+    files ? files.map(format) : [];
 
 const format = (file: File): CollectionFile => ({
     id: file.location
@@ -281,6 +281,3 @@ const FileArrayInputComponent = connect(mapStateToProps)(
     });
 
 type DialogContentCssRules = 'root' | 'tree' | 'divider' | 'chips';
-
-
-