From 0f3ceedd7264ff283bc5c41aaeaeddd6865e38b6 Mon Sep 17 00:00:00 2001 From: Jeff Puzzo Date: Sun, 28 Jul 2024 22:06:42 -0400 Subject: [PATCH] [RHOAIENG-10454] mock cypress test flake: pipelines.cy.ts 'imports a new pipeline' --- .../cypress/pages/pipelines/topology.ts | 29 +++++++++++++- .../tests/mocked/pipelines/pipelines.cy.ts | 39 ++++++++++++------- 2 files changed, 54 insertions(+), 14 deletions(-) diff --git a/frontend/src/__tests__/cypress/cypress/pages/pipelines/topology.ts b/frontend/src/__tests__/cypress/cypress/pages/pipelines/topology.ts index 6863164c7e..28b8e1b812 100644 --- a/frontend/src/__tests__/cypress/cypress/pages/pipelines/topology.ts +++ b/frontend/src/__tests__/cypress/cypress/pages/pipelines/topology.ts @@ -1,6 +1,10 @@ import { Contextual } from '~/__tests__/cypress/cypress/pages/components/Contextual'; import { DashboardCodeEditor } from '~/__tests__/cypress/cypress/pages/components/DashboardCodeEditor'; -import type { PipelineRecurringRunKFv2 } from '~/concepts/pipelines/kfTypes'; +import type { + PipelineKFv2, + PipelineRecurringRunKFv2, + PipelineVersionKFv2, +} from '~/concepts/pipelines/kfTypes'; class TaskDrawer extends Contextual { findInputArtifacts() { @@ -179,6 +183,29 @@ class PipelineDetails extends PipelinesTopology { this.findActionsDropdown().click(); cy.findByRole('menuitem', { name: label }).click(); } + + mockGetPipeline(namespace: string, pipeline: PipelineKFv2): Cypress.Chainable { + return cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/:serviceName/apis/v2beta1/pipelines/:pipelineId', + { path: { namespace, serviceName: 'dspa', pipelineId: pipeline.pipeline_id } }, + pipeline, + ); + } + + mockGetPipelineVersion(pipelineId: string, version: PipelineVersionKFv2, namespace: string) { + return cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/:serviceName/apis/v2beta1/pipelines/:pipelineId/versions/:pipelineVersionId', + { + path: { + namespace, + pipelineId, + serviceName: 'dspa', + pipelineVersionId: version.pipeline_version_id, + }, + }, + version, + ); + } } class PipelineRecurringRunDetails extends RunDetails { diff --git a/frontend/src/__tests__/cypress/cypress/tests/mocked/pipelines/pipelines.cy.ts b/frontend/src/__tests__/cypress/cypress/tests/mocked/pipelines/pipelines.cy.ts index 4c789e806e..c0d35e7d64 100644 --- a/frontend/src/__tests__/cypress/cypress/tests/mocked/pipelines/pipelines.cy.ts +++ b/frontend/src/__tests__/cypress/cypress/tests/mocked/pipelines/pipelines.cy.ts @@ -20,6 +20,7 @@ import { configurePipelineServerModal, viewPipelineServerModal, PipelineSort, + pipelineDetails, } from '~/__tests__/cypress/cypress/pages/pipelines'; import { deleteModal } from '~/__tests__/cypress/cypress/pages/components/DeleteModal'; import { @@ -583,9 +584,17 @@ describe('Pipelines', () => { pipelinesTable .mockGetPipelines([initialMockPipeline, uploadedMockPipeline], projectName) .as('refreshPipelines'); + pipelineDetails.mockGetPipeline(projectName, uploadedMockPipeline).as('getPipeline'); + pipelineDetails + .mockGetPipelineVersion( + uploadedMockPipeline.pipeline_id, + initialMockPipelineVersion, + projectName, + ) + .as('getPipelineVersion'); pipelineImportModal.submit(); - // Wait for upload/fetch requests + // Wait for pipeline upload cy.wait('@uploadPipeline').then((interception) => { // Note: contain is used instead of equals as different browser engines will add a different boundary // to the body - the aim is to not limit these tests to working with one specific engine. @@ -601,11 +610,9 @@ describe('Pipelines', () => { }); }); - cy.wait('@refreshPipelines').then((interception) => { - expect(interception.request.query).to.include({ - sort_by: 'created_at desc', - }); - }); + cy.wait('@refreshPipelines'); + cy.wait('@getPipeline'); + cy.wait('@getPipelineVersion'); cy.url().should( 'include', @@ -633,7 +640,7 @@ describe('Pipelines', () => { it('imports a new pipeline by url', () => { initIntercepts({}); pipelinesGlobal.visit(projectName); - const createPipelineAndVersionParams = { + const uploadPipelineAndVersionParams = { pipeline: { display_name: 'New pipeline', }, @@ -644,15 +651,15 @@ describe('Pipelines', () => { }, }, }; - const createdMockPipeline = buildMockPipelineV2(createPipelineAndVersionParams.pipeline); + const createdMockPipeline = buildMockPipelineV2(uploadPipelineAndVersionParams.pipeline); const createdVersion = buildMockPipelineVersionV2( - createPipelineAndVersionParams.pipeline_version, + uploadPipelineAndVersionParams.pipeline_version, ); // Intercept upload/re-fetch of pipelines pipelineImportModal - .mockCreatePipelineAndVersion(createPipelineAndVersionParams, projectName) - .as('createPipelineAndVersion'); + .mockCreatePipelineAndVersion(uploadPipelineAndVersionParams, projectName) + .as('uploadPipelineAndVersion'); pipelinesTable.mockGetPipelines([initialMockPipeline], projectName); pipelinesTable.mockGetPipelineVersions([createdVersion], 'new-pipeline', projectName); @@ -670,11 +677,17 @@ describe('Pipelines', () => { pipelinesTable .mockGetPipelines([initialMockPipeline, createdMockPipeline], projectName) .as('refreshPipelines'); + pipelineDetails.mockGetPipeline(projectName, createdMockPipeline).as('getPipeline'); + pipelineDetails + .mockGetPipelineVersion(createdMockPipeline.pipeline_id, createdVersion, projectName) + .as('getPipelineVersion'); pipelineImportModal.submit(); - // Wait for upload/fetch requests - cy.wait('@createPipelineAndVersion'); + // Wait for pipeline upload + cy.wait('@uploadPipelineAndVersion'); cy.wait('@refreshPipelines'); + cy.wait('@getPipeline'); + cy.wait('@getPipelineVersion'); cy.url().should( 'include',