From 297a043875a72e67972a8c3c5ec9ffcf910d4b7f Mon Sep 17 00:00:00 2001 From: OlegIvaniv Date: Tue, 13 Dec 2022 11:55:51 +0100 Subject: [PATCH] test(editor): Fix flaky workflow tags e2e tests and store screenshots from CI runs (#4903) * test(editor): Fix flaky add tags e2e specs, and upload cypress artifacts on failure * Only run smoke test to debug the pipeline * Add waitForLoad command and revert debugging changes --- .github/workflows/e2e-tests.yml | 9 +++++++++ cypress/e2e/4-node-creator.cy.ts | 2 +- cypress/e2e/7-workflow-actions.cy.ts | 4 +++- cypress/pages/features/node-creator.ts | 2 +- cypress/pages/workflow.ts | 6 ++++-- cypress/support/commands.ts | 5 +++++ cypress/support/index.ts | 1 + 7 files changed, 24 insertions(+), 5 deletions(-) diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index 394095502d..232d0f508b 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -63,6 +63,15 @@ jobs: pnpm cypress:install pnpm test:e2e:all + - name: Upload artifacts + uses: actions/upload-artifact@v3 + if: failure() + with: + name: cypress-screenshots + path: | + cypress/screenshots + retention-days: 1 + - name: Notify Slack on failure uses: act10ns/slack@v2.0.0 if: failure() diff --git a/cypress/e2e/4-node-creator.cy.ts b/cypress/e2e/4-node-creator.cy.ts index f3efd655b2..25f1e1ad8a 100644 --- a/cypress/e2e/4-node-creator.cy.ts +++ b/cypress/e2e/4-node-creator.cy.ts @@ -33,6 +33,7 @@ describe('Node Creator', () => { }).as('nodesIntercept'); cy.visit(nodeCreatorFeature.url); + cy.waitForLoad(); }); it('should open node creator on trigger tab if no trigger is on canvas', () => { @@ -94,7 +95,6 @@ describe('Node Creator', () => { }) it('should add manual trigger node', () => { - cy.get('.el-loading-mask').should('not.exist'); nodeCreatorFeature.getters.canvasAddButton().click(); nodeCreatorFeature.getters.getCreatorItem('Manually').click(); diff --git a/cypress/e2e/7-workflow-actions.cy.ts b/cypress/e2e/7-workflow-actions.cy.ts index b7d903b9ba..4757140e2f 100644 --- a/cypress/e2e/7-workflow-actions.cy.ts +++ b/cypress/e2e/7-workflow-actions.cy.ts @@ -13,6 +13,7 @@ describe('Workflow Actions', () => { cy.resetAll(); cy.skipSetup(); WorkflowPage.actions.visit(); + cy.waitForLoad(); }); it('should be able to save on button click', () => { @@ -66,6 +67,7 @@ describe('Workflow Actions', () => { it('should add more tags', () => { WorkflowPage.getters.newTagLink().click(); WorkflowPage.actions.addTags(TEST_WF_TAGS); + WorkflowPage.getters.isWorkflowSaved(); WorkflowPage.getters.firstWorkflowTagElement().click(); WorkflowPage.actions.addTags(['Another one']); WorkflowPage.getters.workflowTagElements().should('have.length', TEST_WF_TAGS.length + 1); @@ -84,7 +86,7 @@ describe('Workflow Actions', () => { WorkflowPage.getters.newTagLink().click(); WorkflowPage.actions.addTags(TEST_WF_TAGS); WorkflowPage.getters.firstWorkflowTagElement().click(); - WorkflowPage.getters.workflowTagsDropdown().find('li').first().click(); + WorkflowPage.getters.workflowTagsDropdown().find('li.selected').first().click(); cy.get('body').type('{enter}'); WorkflowPage.getters.workflowTagElements().should('have.length', TEST_WF_TAGS.length - 1); }); diff --git a/cypress/pages/features/node-creator.ts b/cypress/pages/features/node-creator.ts index dad6f6ebe5..b42de7a25c 100644 --- a/cypress/pages/features/node-creator.ts +++ b/cypress/pages/features/node-creator.ts @@ -22,7 +22,7 @@ export class NodeCreator extends BasePage { }; actions = { openNodeCreator: () => { - cy.get('.el-loading-mask').should('not.exist'); + cy.waitForLoad(); this.getters.plusButton().click(); this.getters.nodeCreator().should('be.visible') }, diff --git a/cypress/pages/workflow.ts b/cypress/pages/workflow.ts index 3e0369ec7b..432cbcefc8 100644 --- a/cypress/pages/workflow.ts +++ b/cypress/pages/workflow.ts @@ -38,8 +38,7 @@ export class WorkflowPage extends BasePage { actions = { visit: () => { cy.visit(this.url); - cy.getByTestId('node-view-loader', { timeout: 5000 }).should('not.exist'); - cy.get('.el-loading-mask', { timeout: 5000 }).should('not.exist'); + cy.waitForLoad(); }, addInitialNodeToCanvas: (nodeDisplayName: string) => { this.getters.canvasPlusButton().click(); @@ -98,6 +97,9 @@ export class WorkflowPage extends BasePage { this.getters.workflowTagsInput().type('{enter}'); }); cy.get('body').type('{enter}'); + // For a brief moment the Element UI tag component shows the tags as(+X) string + // so we need to wait for it to disappear + this.getters.workflowTagsContainer().should('not.contain', `+${tags.length}`); }, zoomToFit: () => { cy.getByTestId('zoom-to-fit').click(); diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts index 3318305a47..ee86bb2a7e 100644 --- a/cypress/support/commands.ts +++ b/cypress/support/commands.ts @@ -50,6 +50,11 @@ Cypress.Commands.add('findChildByTestId', { prevSubject: true }, (subject: Cypre return subject.find(`[data-test-id="${childTestId}"]`); }) +Cypress.Commands.add('waitForLoad', () => { + cy.getByTestId('node-view-loader').should('not.exist', { timeout: 10000 }); + cy.get('.el-loading-mask').should('not.exist', { timeout: 10000 }); +}) + Cypress.Commands.add( 'signin', ({ email, password }) => { diff --git a/cypress/support/index.ts b/cypress/support/index.ts index f03e681b19..32b0bc6ecf 100644 --- a/cypress/support/index.ts +++ b/cypress/support/index.ts @@ -24,6 +24,7 @@ declare global { setupOwner(payload: SetupPayload): void; skipSetup(): void; resetAll(): void; + waitForLoad(): void; grantBrowserPermissions(...permissions: string[]): void; readClipboard(): Chainable; paste(pastePayload: string): void,