]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mgr/dashboard: add basic e2e to verify wizard
authorNizamudeen A <nia@redhat.com>
Wed, 12 Feb 2025 14:14:15 +0000 (19:44 +0530)
committerNizamudeen A <nia@redhat.com>
Fri, 14 Mar 2025 07:56:07 +0000 (13:26 +0530)
and topology viewer

Fixes: https://tracker.ceph.com/issues/69925
Signed-off-by: Nizamudeen A <nia@redhat.com>
src/pybind/mgr/dashboard/frontend/cypress/e2e/rgw/multisite.e2e-spec.ts
src/pybind/mgr/dashboard/frontend/cypress/e2e/rgw/multisite.po.ts
src/pybind/mgr/dashboard/frontend/cypress/support/e2e.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-multisite-details/rgw-multisite-details.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-multisite-wizard/rgw-multisite-wizard.component.html

index 8d8ed22da0b7f02f9cb81f0d9a5d35f39cdc55fe..5ec787f2e33a5f82fc36589007b6f113df04cae2 100644 (file)
@@ -102,4 +102,31 @@ describe('Multisite page', () => {
       multisite.deletePipe('new-pipe');
     });
   });
+
+  describe('Multi-site topology viewer', () => {
+    it('should show topology viewer', () => {
+      multisite.navigateTo('topology');
+      multisite.topologyViewerExist();
+    });
+
+    describe('Multisite replication wizard', () => {
+      beforeEach(() => {
+        multisite.navigateTo('wizard');
+      });
+
+      it('should show replication wizard', () => {
+        multisite.replicationWizardExist();
+      });
+
+      it('should verify the wizard is properly loaded', () => {
+        multisite.replicationWizardExist();
+        // // Verify first step
+        multisite.verifyWizardContents('CreateRealmZonegroup');
+        // Verify second step
+        multisite.verifyWizardContents('CreateZone');
+        // Verify the review
+        multisite.verifyWizardContents('Review');
+      });
+    });
+  });
 });
index 0f2078f20bba46085ee924c1e154b30db1ca567d..5240c8364244a3be407abe2528d20598906b752d 100644 (file)
@@ -7,8 +7,22 @@ const pages = {
     url: '#/rgw/multisite/sync-policy/(modal:create)',
     id: 'cd-rgw-multisite-sync-policy-form'
   },
-  edit: { url: '#/rgw/multisite/sync-policy/(modal:edit', id: 'cd-rgw-multisite-sync-policy-form' }
+  edit: { url: '#/rgw/multisite/sync-policy/(modal:edit', id: 'cd-rgw-multisite-sync-policy-form' },
+  topology: { url: '#/rgw/multisite/configuration', id: 'cd-rgw-multisite-details' },
+  wizard: {
+    url: '#/rgw/multisite/configuration/(modal:setup-multisite-replication)',
+    id: 'cd-rgw-multisite-wizard'
+  }
 };
+
+enum WizardSteps {
+  CreateRealmZonegroup = 'Create Realm & Zonegroup',
+  CreateZone = 'Create Zone',
+  Review = 'Review'
+}
+
+type Step = keyof typeof WizardSteps;
+
 export class MultisitePageHelper extends PageHelper {
   pages = pages;
 
@@ -289,4 +303,51 @@ export class MultisitePageHelper extends PageHelper {
     // Waits for item to be removed from table
     getRow(pipe_id).should('not.exist');
   }
+
+  @PageHelper.restrictTo(pages.topology.url)
+  topologyViewerExist() {
+    cy.get(pages.topology.id).should('be.visible');
+    cy.get('[data-testid=rgw-multisite-details-header]').should('have.text', 'Topology Viewer');
+  }
+
+  @PageHelper.restrictTo(pages.wizard.url)
+  replicationWizardExist() {
+    cy.get('cds-modal').then(() => {
+      cy.get('[data-testid=rgw-multisite-wizard-header]').should(
+        'have.text',
+        'Set up Multi-site Replication'
+      );
+    });
+  }
+
+  @PageHelper.restrictTo(pages.index.url)
+  verifyWizardContents(step: Step) {
+    cy.get('cds-modal').then(() => {
+      this.gotoStep(step);
+      if (step === 'CreateRealmZonegroup') {
+        this.typeValueToField('realmName', 'test-realm');
+        this.typeValueToField('zonegroupName', 'test-zg');
+      } else if (step === 'CreateZone') {
+        this.typeValueToField('zoneName', 'test-zone');
+      } else {
+        this.gotoStep('Review');
+        cy.get('.form-group.row').then(() => {
+          cy.get('#realmName').invoke('text').should('eq', 'test-realm');
+          cy.get('#zonegroupName').invoke('text').should('eq', 'test-zg');
+          cy.get('#zoneName').invoke('text').should('eq', 'test-zone');
+        });
+      }
+    });
+  }
+
+  typeValueToField(fieldID: string, value: string) {
+    cy.get(`#${fieldID}`).clear().type(value).should('have.value', value);
+  }
+
+  gotoStep(step: Step) {
+    cy.get('cd-wizard').then(() => {
+      cy.get('form').should('be.visible');
+      cy.get('button').contains(WizardSteps[step]).click();
+    });
+  }
 }
index 4db2c6a4926a9e20ded76ec399b72a292d58fb88..8b55b576589d07ba9d8bb08af667def2ab9973dd 100644 (file)
@@ -17,3 +17,10 @@ Cypress.on('uncaught:exception', (err: Error) => {
   }
   return true;
 });
+
+Cypress.on('fail', (err: Error) => {
+  if (err.message.includes('xhr') && err.message.includes('canceled')) {
+    return false; // Ignore canceled XHR requests
+  }
+  return true;
+});
index c3b740ec7c68250f92be0c360763738bac96d009..48fc0eeb5f2f794a303b93073e04528758f2dafd 100644 (file)
@@ -51,8 +51,8 @@
 </div>
 <div class="card">
   <div class="card-header"
-       i18n>Topology Viewer
-  </div>
+       data-testid="rgw-multisite-details-header"
+       i18n>Topology Viewer</div>
   <div class="row">
     <div class="col-sm-6 col-lg-6 tree-container">
       <i *ngIf="loadingIndicator"
index 63f9522a6bb4557dcd48cdbe56ac62fd11ea5e69..d431cd3aa6caf8eaaef805d3c9a60396ae58f852 100644 (file)
@@ -5,6 +5,7 @@
            (overlaySelected)="closeModal()">
   <cds-modal-header (closeSelect)="closeModal()">
     <h3 cdsModalHeaderHeading
+        data-testid="rgw-multisite-wizard-header"
         i18n>Set up Multi-site Replication</h3>
   </cds-modal-header>
 
   <div class="form-group row">
     <label class="cd-col-form-label"
            i18n>Realm Name:</label>
-    <div class="cd-col-form-input mt-2 text-muted">
+    <div class="cd-col-form-input mt-2 text-muted"
+         id="realmName">
       <b>{{ multisiteSetupForm.get('realmName').value }}</b>
     </div>
   </div>
   <div class="form-group row">
     <label class="cd-col-form-label"
            i18n>Zonegroup Name:</label>
-    <div class="cd-col-form-input mt-2 text-muted">
+    <div class="cd-col-form-input mt-2 text-muted"
+         id="zonegroupName">
       <b>{{ multisiteSetupForm.get('zonegroupName').value }}</b>
     </div>
   </div>
   <div class="form-group row">
     <label class="cd-col-form-label"
            i18n>Zone Name:</label>
-    <div class="cd-col-form-input mt-2 text-muted">
+    <div class="cd-col-form-input mt-2 text-muted"
+         id="zoneName">
       <b>{{ multisiteSetupForm.get('zoneName').value }}</b>
     </div>
   </div>