17573: Adds integration tests for storage classes display & editing.
authorLucas Di Pentima <lucas.dipentima@curii.com>
Thu, 15 Jul 2021 01:23:24 +0000 (22:23 -0300)
committerLucas Di Pentima <lucas.dipentima@curii.com>
Thu, 15 Jul 2021 01:23:24 +0000 (22:23 -0300)
Arvados-DCO-1.1-Signed-off-by: Lucas Di Pentima <lucas.dipentima@curii.com>

cypress/integration/collection.spec.js
src/common/config.ts
src/components/checkbox-field/checkbox-field.tsx
tools/arvados_config.yml

index f3b63218de0901d39472368429bd9c2df51e6072..308ce5f76be13178ccb7d8fe5fa82e7b56496ac7 100644 (file)
@@ -431,6 +431,71 @@ describe('Collection panel tests', function () {
             });
     });
 
+    it('views & edits storage classes data', function () {
+        const colName= `Test Collection ${Math.floor(Math.random() * 999999)}`;
+        cy.createCollection(adminUser.token, {
+            name: colName,
+            owner_uuid: activeUser.user.uuid,
+            manifest_text: ". 37b51d194a7513e45b56f6524f2d51f2+3 0:3:some-file\n",
+        }).as('collection').then(function () {
+            expect(this.collection.storage_classes_desired).to.deep.equal(['default'])
+
+            cy.loginAs(activeUser)
+            cy.goToPath(`/collections/${this.collection.uuid}`);
+
+            // Initial check: it should show the 'default' storage class
+            cy.get('[data-cy=collection-info-panel]')
+                .should('contain', 'Storage classes')
+                .and('contain', 'default')
+                .and('not.contain', 'foo')
+                .and('not.contain', 'bar');
+            // Edit collection: add storage class 'foo'
+            cy.get('[data-cy=collection-panel-options-btn]').click();
+            cy.get('[data-cy=context-menu]').contains('Edit collection').click();
+            cy.get('[data-cy=form-dialog]')
+                .should('contain', 'Edit Collection')
+                .and('contain', 'Storage classes')
+                .and('contain', 'default')
+                .and('contain', 'foo')
+                .and('contain', 'bar')
+                .within(() => {
+                    cy.get('[data-cy=checkbox-foo]').click();
+                });
+            cy.get('[data-cy=form-submit-btn]').click();
+            cy.get('[data-cy=collection-info-panel]')
+                .should('contain', 'default')
+                .and('contain', 'foo')
+                .and('not.contain', 'bar');
+            cy.doRequest('GET', `/arvados/v1/collections/${this.collection.uuid}`)
+                .its('body').as('updatedCollection')
+                .then(function () {
+                    expect(this.updatedCollection.storage_classes_desired).to.deep.equal(['default', 'foo']);
+                });
+            // Edit collection: remove storage class 'default'
+            cy.get('[data-cy=collection-panel-options-btn]').click();
+            cy.get('[data-cy=context-menu]').contains('Edit collection').click();
+            cy.get('[data-cy=form-dialog]')
+                .should('contain', 'Edit Collection')
+                .and('contain', 'Storage classes')
+                .and('contain', 'default')
+                .and('contain', 'foo')
+                .and('contain', 'bar')
+                .within(() => {
+                    cy.get('[data-cy=checkbox-default]').click();
+                });
+            cy.get('[data-cy=form-submit-btn]').click();
+            cy.get('[data-cy=collection-info-panel]')
+                .should('not.contain', 'default')
+                .and('contain', 'foo')
+                .and('not.contain', 'bar');
+            cy.doRequest('GET', `/arvados/v1/collections/${this.collection.uuid}`)
+                .its('body').as('updatedCollection')
+                .then(function () {
+                    expect(this.updatedCollection.storage_classes_desired).to.deep.equal(['foo']);
+                });
+        })
+    });
+
     it('uses the collection version browser to view a previous version', function () {
         const colName = `Test Collection ${Math.floor(Math.random() * 999999)}`;
 
index 8a85ae007529738fd0f763193a337278101b1ffa..7a98fd4722a49cb49094f126b46620c741e72592 100644 (file)
@@ -141,7 +141,7 @@ export const getStorageClasses = (config: Config): string[] => {
     const classes: Set<string> = new Set();
     const volumes = config.clusterConfig.Volumes;
     Object.keys(volumes).forEach(v => {
-        Object.keys(volumes[v].StorageClasses).forEach(sc => {
+        Object.keys(volumes[v].StorageClasses || {}).forEach(sc => {
             if (volumes[v].StorageClasses[sc]) {
                 classes.add(sc);
             }
index bfa3714ae95a31bf78a9815f04a9673463f17bc2..02a5e9a68ddd36f79dafa8362a9d8090cc4e40a6 100644 (file)
@@ -44,6 +44,7 @@ export const MultiCheckboxField = (props: WrappedFieldProps & MultiCheckboxField
             <FormControlLabel
                 control={
                     <Checkbox
+                        data-cy={`checkbox-${item}`}
                         key={idx}
                         name={`${props.input.name}[${idx}]`}
                         value={item}
index a287fed4bddb8d0f6d2e76b4fcd8e8ba1d0de267..963da48d8dca385f0fba311de4a0ac09ee860224 100644 (file)
@@ -17,3 +17,12 @@ Clusters:
     Login:
       PAM:
         Enable: true
+    Volumes:
+      zzzzz-nyw5e-000000000000000:
+        StorageClasses:
+          default: true
+          foo: true
+      zzzzz-nyw5e-000000000000001:
+        StorageClasses:
+          default: true
+          bar: true