From dddd2e19e15baaf32a90a88e3b4592e3114de5b3 Mon Sep 17 00:00:00 2001 From: pnaik1 Date: Wed, 8 May 2024 21:55:29 +0530 Subject: [PATCH] added core interceptor for pipeline --- .../cypress/e2e/pipelines/CompareRuns.cy.ts | 58 +++--- .../cypress/e2e/pipelines/Experiments.cy.ts | 42 ++--- .../cypress/e2e/pipelines/ManageRuns.cy.ts | 45 +++-- .../e2e/pipelines/PipelineCreateRuns.cy.ts | 34 +--- .../e2e/pipelines/PipelineDeleteRuns.cy.ts | 117 +++++------- .../cypress/e2e/pipelines/PipelineRuns.cy.ts | 14 +- .../cypress/e2e/pipelines/Pipelines.cy.ts | 52 +++--- .../cypress/e2e/pipelines/PipelinesList.cy.ts | 21 ++- .../e2e/pipelines/PipelinesTopology.cy.ts | 114 +++++------- .../cypress/pages/pipelines/cloneRunPage.ts | 40 ++--- .../cypress/pages/pipelines/createRunPage.ts | 35 ++-- .../cypress/pages/pipelines/experiments.ts | 22 +-- .../pages/pipelines/pipelineFilterBar.ts | 6 +- .../pages/pipelines/pipelineImportModal.ts | 15 +- .../pages/pipelines/pipelineRunTable.ts | 54 +++--- .../pipelines/pipelineVersionImportModal.ts | 18 +- .../cypress/pages/pipelines/pipelinesTable.ts | 32 ++-- .../cypress/cypress/support/commands/odh.ts | 167 +++++++++++++++++- 18 files changed, 458 insertions(+), 428 deletions(-) diff --git a/frontend/src/__tests__/cypress/cypress/e2e/pipelines/CompareRuns.cy.ts b/frontend/src/__tests__/cypress/cypress/e2e/pipelines/CompareRuns.cy.ts index 7378c82039..cd93fe9206 100644 --- a/frontend/src/__tests__/cypress/cypress/e2e/pipelines/CompareRuns.cy.ts +++ b/frontend/src/__tests__/cypress/cypress/e2e/pipelines/CompareRuns.cy.ts @@ -7,7 +7,6 @@ import { buildMockPipelineV2, buildMockPipelines, buildMockPipelineVersionV2, - buildMockPipelineVersionsV2, mockProjectK8sResource, mockRouteK8sResource, buildMockRunKF, @@ -90,21 +89,24 @@ describe('Compare runs', () => { }); it('valid number of runs but it is invalid', () => { - cy.intercept( + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/runs/:runId', { - pathname: `/api/service/pipelines/${projectName}/dspa/apis/v2beta1/runs/invalid_run_id`, + path: { namespace: projectName, runId: 'invalid_run_id' }, }, { statusCode: 404 }, ).as('invalidRun'); + compareRunsGlobal.visit(projectName, mockExperiment.experiment_id, ['invalid_run_id']); cy.wait('@invalidRun'); compareRunsGlobal.findInvalidRunsError().should('exist'); }); it('invalid runs are removed from url', () => { - cy.intercept( + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/runs/:runId', { - pathname: `/api/service/pipelines/${projectName}/dspa/apis/v2beta1/runs/invalid_run_id`, + path: { namespace: projectName, runId: 'invalid_run_id' }, }, { statusCode: 404 }, ).as('invalidRun'); @@ -122,15 +124,14 @@ describe('Compare runs', () => { it('other failed requests dont change the url ', () => { const errorRun = { - error: { - code: 1, // cancelled - message: 'Run cancelled by caller', - details: [], - }, + code: 1, + message: 'Run cancelled by caller', + details: [], }; - cy.intercept( + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/runs/:runId', { - pathname: `/api/service/pipelines/${projectName}/dspa/apis/v2beta1/runs/invalid_run_id`, + path: { namespace: projectName, runId: 'invalid_run_id' }, }, errorRun, ).as('invalidRun'); @@ -224,36 +225,31 @@ const initIntercepts = () => { mockProjectK8sResource({ k8sName: projectName, displayName: projectName }), ]), ); - - cy.intercept( + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines', { - pathname: `/api/service/pipelines/${projectName}/dspa/apis/v2beta1/pipelines`, + path: { namespace: projectName }, }, buildMockPipelines([initialMockPipeline]), ); - - cy.intercept( - { - method: 'POST', - pathname: `/api/service/pipelines/${projectName}/dspa/apis/v2beta1/pipeline_versions`, - }, - buildMockPipelineVersionsV2([initialMockPipelineVersion]), - ); - cy.intercept( - { - pathname: `/api/service/pipelines/${projectName}/dspa/apis/v2beta1/experiments/${mockExperiment.experiment_id}`, - }, + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/experiments/:experimentId', + { path: { namespace: projectName, experimentId: mockExperiment.experiment_id } }, mockExperiment, ); - cy.intercept( + + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/runs/:runId', { - pathname: `/api/service/pipelines/${projectName}/dspa/apis/v2beta1/runs/${mockRun.run_id}`, + path: { namespace: projectName, runId: mockRun.run_id }, }, mockRun, ).as('validRun'); - cy.intercept( + + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/runs/:runId', { - pathname: `/api/service/pipelines/${projectName}/dspa/apis/v2beta1/runs/${mockRun2.run_id}`, + path: { namespace: projectName, runId: mockRun2.run_id }, }, mockRun2, ); diff --git a/frontend/src/__tests__/cypress/cypress/e2e/pipelines/Experiments.cy.ts b/frontend/src/__tests__/cypress/cypress/e2e/pipelines/Experiments.cy.ts index 25ee6881aa..df7b47c4e3 100644 --- a/frontend/src/__tests__/cypress/cypress/e2e/pipelines/Experiments.cy.ts +++ b/frontend/src/__tests__/cypress/cypress/e2e/pipelines/Experiments.cy.ts @@ -6,8 +6,6 @@ import { mockK8sResourceList, buildMockPipelineV2, buildMockPipelines, - buildMockPipelineVersionV2, - buildMockPipelineVersionsV2, mockProjectK8sResource, mockRouteK8sResource, } from '~/__mocks__'; @@ -28,9 +26,6 @@ import { const projectName = 'test-project-name'; const initialMockPipeline = buildMockPipelineV2({ display_name: 'Test pipeline' }); -const initialMockPipelineVersion = buildMockPipelineVersionV2({ - pipeline_id: initialMockPipeline.pipeline_id, -}); const mockExperiments = [ buildMockExperimentKF({ display_name: 'Test experiment 1', @@ -270,40 +265,33 @@ const initIntercepts = () => { mockProjectK8sResource({ k8sName: projectName, displayName: projectName }), ]), ); - - cy.intercept( + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines', { - pathname: `/api/service/pipelines/${projectName}/dspa/apis/v2beta1/pipelines`, + path: { namespace: projectName }, }, buildMockPipelines([initialMockPipeline]), ); - cy.intercept( - { - method: 'POST', - pathname: `/api/service/pipelines/${projectName}/dspa/apis/v2beta1/pipeline_versions`, - }, - buildMockPipelineVersionsV2([initialMockPipelineVersion]), - ); - cy.intercept( + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/runs', { - pathname: `/api/service/pipelines/${projectName}/dspa/apis/v2beta1/runs`, + path: { namespace: projectName }, }, { runs: [] }, ); - cy.intercept( - { - method: 'GET', - pathname: `/api/service/pipelines/${projectName}/dspa/apis/v2beta1/recurringruns`, - }, + + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/recurringruns', { - recurringRuns: [], + path: { namespace: projectName }, }, + { recurringRuns: [] }, ); - cy.intercept( - { - pathname: `/api/service/pipelines/${projectName}/dspa/apis/v2beta1/experiments/${mockExperiments[0].experiment_id}`, - }, + + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/experiments/:experimentId', + { path: { namespace: projectName, experimentId: mockExperiments[0].experiment_id } }, mockExperiments[0], ); }; diff --git a/frontend/src/__tests__/cypress/cypress/e2e/pipelines/ManageRuns.cy.ts b/frontend/src/__tests__/cypress/cypress/e2e/pipelines/ManageRuns.cy.ts index fc7cedf793..2f5d27f1a0 100644 --- a/frontend/src/__tests__/cypress/cypress/e2e/pipelines/ManageRuns.cy.ts +++ b/frontend/src/__tests__/cypress/cypress/e2e/pipelines/ManageRuns.cy.ts @@ -22,7 +22,7 @@ const initialRunIds = ['test-run-1', 'test-run-2']; const mockRuns = Array(11) .fill(buildMockRunKF()) - .map((mockRun: Partial, index) => ({ + .map((mockRun: PipelineRunKFv2, index) => ({ ...mockRun, display_name: `Test run ${index + 1}`, run_id: `test-run-${index + 1}`, @@ -95,10 +95,10 @@ describe('Manage runs', () => { }); it('navigates to "Compare runs" page with updated run IDs when "Update" toolbar action is clicked', () => { - cy.intercept( + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/runs/:runId', { - method: 'GET', - pathname: `/api/service/pipelines/${projectName}/dspa/apis/v2beta1/runs/test-run-3`, + path: { namespace: projectName, runId: 'test-run-3' }, }, mockRuns[2], ); @@ -117,10 +117,10 @@ const initIntercepts = () => { configIntercept(); dspaIntercepts(projectName); projectsIntercept([{ k8sName: projectName, displayName: 'Test project' }]); - - cy.intercept( + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines', { - pathname: `/api/service/pipelines/${projectName}/dspa/apis/v2beta1/pipelines`, + path: { namespace: projectName }, }, buildMockPipelines([buildMockPipelineV2({ pipeline_id: pipelineId })]), ); @@ -130,37 +130,32 @@ const initIntercepts = () => { pipeline_id: pipelineId, }); - cy.intercept( + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines/:pipelineId/versions', { - method: 'GET', - pathname: `/api/service/pipelines/${projectName}/dspa/apis/v2beta1/pipelines/${pipelineId}/versions`, + path: { namespace: projectName, pipelineId }, }, buildMockPipelineVersionsV2([mockPipelineVersion]), ); - cy.intercept( - { - method: 'GET', - pathname: `/api/service/pipelines/${projectName}/dspa/apis/v2beta1/experiments/${experimentId}`, - }, + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/experiments/:experimentId', + { path: { namespace: projectName, experimentId } }, buildMockExperimentKF({ experiment_id: experimentId }), ); initialRunIds.forEach((selectedRunId) => { - cy.intercept( + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/runs/:runId', { - method: 'GET', - pathname: `/api/service/pipelines/${projectName}/dspa/apis/v2beta1/runs/${selectedRunId}`, + path: { namespace: projectName, runId: selectedRunId }, }, - mockRuns.find((mockRun) => mockRun.run_id === selectedRunId), + mockRuns.find((mockRun) => mockRun.run_id === selectedRunId) as PipelineRunKFv2, ); }); - - cy.intercept( - { - method: 'GET', - pathname: `/api/service/pipelines/${projectName}/dspa/apis/v2beta1/runs`, - }, + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/runs', + { path: { namespace: projectName } }, { runs: mockRuns, total_size: mockRuns.length, diff --git a/frontend/src/__tests__/cypress/cypress/e2e/pipelines/PipelineCreateRuns.cy.ts b/frontend/src/__tests__/cypress/cypress/e2e/pipelines/PipelineCreateRuns.cy.ts index 5810460402..2a0b827db6 100644 --- a/frontend/src/__tests__/cypress/cypress/e2e/pipelines/PipelineCreateRuns.cy.ts +++ b/frontend/src/__tests__/cypress/cypress/e2e/pipelines/PipelineCreateRuns.cy.ts @@ -69,18 +69,6 @@ describe('Pipeline create runs', () => { }); describe('Runs', () => { - beforeEach(() => { - mockExperiments.forEach((experiment) => { - cy.intercept( - { - method: 'POST', - pathname: `/api/service/pipelines/${projectName}/dspa/apis/v2beta1/experiments/${experiment.experiment_id}`, - }, - experiment, - ); - }); - }); - it('switches to scheduled runs from triggered', () => { // Mock experiments, pipelines & versions for form select dropdowns createRunPage.mockGetExperiments(projectName, mockExperiments); @@ -471,11 +459,9 @@ describe('Pipeline create runs', () => { describe('Schedules', () => { beforeEach(() => { mockExperiments.forEach((experiment) => { - cy.intercept( - { - method: 'GET', - pathname: `/api/service/pipelines/${projectName}/dspa/apis/v2beta1/experiments/${experiment.experiment_id}`, - }, + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/experiments/:experimentId', + { path: { namespace: projectName, experimentId: experiment.experiment_id } }, experiment, ); }); @@ -725,19 +711,17 @@ const initIntercepts = () => { configIntercept(); dspaIntercepts(projectName); projectsIntercept([{ k8sName: projectName, displayName: 'Test project' }]); - - cy.intercept( + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/recurringruns', { - method: 'GET', - pathname: `/api/service/pipelines/${projectName}/dspa/apis/v2beta1/recurringruns`, + path: { namespace: projectName }, }, { recurringRuns: initialMockRecurringRuns, total_size: initialMockRecurringRuns.length }, ); - - cy.intercept( + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/runs', { - method: 'GET', - pathname: `/api/service/pipelines/${projectName}/dspa/apis/v2beta1/runs`, + path: { namespace: projectName }, }, { runs: initialMockRuns, total_size: initialMockRuns.length }, ); diff --git a/frontend/src/__tests__/cypress/cypress/e2e/pipelines/PipelineDeleteRuns.cy.ts b/frontend/src/__tests__/cypress/cypress/e2e/pipelines/PipelineDeleteRuns.cy.ts index df21d654d2..788d36bee5 100644 --- a/frontend/src/__tests__/cypress/cypress/e2e/pipelines/PipelineDeleteRuns.cy.ts +++ b/frontend/src/__tests__/cypress/cypress/e2e/pipelines/PipelineDeleteRuns.cy.ts @@ -3,7 +3,6 @@ import { mockDataSciencePipelineApplicationK8sResource } from '~/__mocks__/mockD import { mockDscStatus } from '~/__mocks__/mockDscStatus'; import { mockK8sResourceList } from '~/__mocks__/mockK8sResourceList'; import { mockNotebookK8sResource } from '~/__mocks__/mockNotebookK8sResource'; -import { mockPipelineKFv2 } from '~/__mocks__/mockPipelineKF'; import { buildMockJobKF } from '~/__mocks__/mockJobKF'; import { mockProjectK8sResource } from '~/__mocks__/mockProjectK8sResource'; import { mockRouteK8sResource } from '~/__mocks__/mockRouteK8sResource'; @@ -23,7 +22,7 @@ import { RouteModel, SecretModel, } from '~/__tests__/cypress/cypress/utils/models'; -import { mock200Status } from '~/__mocks__/mockK8sStatus'; +import { GoogleRpcStatusKF } from '~/concepts/pipelines/kfTypes'; const initIntercepts = () => { cy.interceptOdh( @@ -32,17 +31,11 @@ const initIntercepts = () => { installedComponents: { 'data-science-pipelines-operator': true }, }), ); - cy.intercept( - { - method: 'POST', - pathname: '/api/service/pipelines/test-project/dspa/apis/v2beta1/pipelines/test-pipeline', - }, - mockPipelineKFv2({}), - ); - cy.intercept( + + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/recurringruns', { - method: 'GET', - pathname: '/api/service/pipelines/test-project/dspa/apis/v2beta1/recurringruns', + path: { namespace: 'test-project' }, }, { recurringRuns: [ @@ -51,10 +44,10 @@ const initIntercepts = () => { ], }, ); - cy.intercept( + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/runs', { - method: 'GET', - pathname: '/api/service/pipelines/test-project/dspa/apis/v2beta1/runs', + path: { namespace: 'test-project' }, }, { runs: [ @@ -63,13 +56,7 @@ const initIntercepts = () => { ], }, ); - cy.intercept( - { - method: 'POST', - pathname: '/api/service/pipelines/test-project/dspa/apis/v2beta1/pipelines', - }, - mockPipelineKFv2({}), - ); + cy.interceptK8s(RouteModel, mockRouteK8sResource({ notebookName: 'ds-pipeline-dspa' })); cy.interceptK8s(SecretModel, mockSecretK8sResource({ name: 'ds-pipeline-config' })); cy.interceptK8s(SecretModel, mockSecretK8sResource({ name: 'pipelines-db-password' })); @@ -87,6 +74,7 @@ const initIntercepts = () => { }; describe('Pipeline runs', () => { + const mockSuccessResponse: GoogleRpcStatusKF = { code: 0, message: '', details: [] }; describe('Test deleting runs', () => { it('Test delete a single schedule', () => { initIntercepts(); @@ -101,20 +89,16 @@ describe('Pipeline runs', () => { schedulesDeleteModal.findSubmitButton().should('be.disabled'); schedulesDeleteModal.findInput().type('test-pipeline'); schedulesDeleteModal.findSubmitButton().should('be.enabled'); - - cy.intercept( - { - method: 'DELETE', - pathname: - '/api/service/pipelines/test-project/dspa/apis/v2beta1/recurringruns/test-pipeline', - }, - mock200Status({}), + cy.interceptOdh( + 'DELETE /api/service/pipelines/:namespace/dspa/apis/v2beta1/recurringruns/:recurringRunId', + { path: { namespace: 'test-project', recurringRunId: 'test-pipeline' } }, + mockSuccessResponse, ).as('deleteJobPipeline'); - cy.intercept( + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/recurringruns', { - method: 'GET', - pathname: '/api/service/pipelines/test-project/dspa/apis/v2beta1/recurringruns', + path: { namespace: 'test-project' }, }, { recurringRuns: [ @@ -150,29 +134,22 @@ describe('Pipeline runs', () => { schedulesDeleteModal.findSubmitButton().should('be.disabled'); schedulesDeleteModal.findInput().type('Delete 2 schedules'); schedulesDeleteModal.findSubmitButton().should('be.enabled'); - - cy.intercept( - { - method: 'DELETE', - pathname: - '/api/service/pipelines/test-project/dspa/apis/v2beta1/recurringruns/test-pipeline', - }, - mock200Status({}), + cy.interceptOdh( + 'DELETE /api/service/pipelines/:namespace/dspa/apis/v2beta1/recurringruns/:recurringRunId', + { path: { namespace: 'test-project', recurringRunId: 'test-pipeline' } }, + mockSuccessResponse, ).as('deleteJobPipeline-1'); - cy.intercept( - { - method: 'DELETE', - pathname: - '/api/service/pipelines/test-project/dspa/apis/v2beta1/recurringruns/other-pipeline', - }, - mock200Status({}), + cy.interceptOdh( + 'DELETE /api/service/pipelines/:namespace/dspa/apis/v2beta1/recurringruns/:recurringRunId', + { path: { namespace: 'test-project', recurringRunId: 'other-pipeline' } }, + mockSuccessResponse, ).as('deleteJobPipeline-2'); - cy.intercept( + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/recurringruns', { - method: 'GET', - pathname: '/api/service/pipelines/test-project/dspa/apis/v2beta1/recurringruns', + path: { namespace: 'test-project' }, }, { recurringRuns: [] }, ).as('getRuns'); @@ -202,18 +179,18 @@ describe('Pipeline runs', () => { runsDeleteModal.findInput().type('test-pipeline'); runsDeleteModal.findSubmitButton().should('be.enabled'); - cy.intercept( + cy.interceptOdh( + 'DELETE /api/service/pipelines/:namespace/dspa/apis/v2beta1/runs/:runId', { - method: 'DELETE', - pathname: '/api/service/pipelines/test-project/dspa/apis/v2beta1/runs/test-pipeline', + path: { namespace: 'test-project', runId: 'test-pipeline' }, }, - mock200Status({}), + mockSuccessResponse, ).as('deleteRunPipeline'); - cy.intercept( + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/runs', { - method: 'GET', - pathname: '/api/service/pipelines/test-project/dspa/apis/v2beta1/runs', + path: { namespace: 'test-project' }, }, { runs: [buildMockRunKF({ run_id: 'other-pipeline', display_name: 'other-pipeline' })] }, ).as('getRuns'); @@ -249,27 +226,25 @@ describe('Pipeline runs', () => { runsDeleteModal.findSubmitButton().should('be.disabled'); runsDeleteModal.findInput().type('Delete 2 runs'); runsDeleteModal.findSubmitButton().should('be.enabled'); - - cy.intercept( + cy.interceptOdh( + 'DELETE /api/service/pipelines/:namespace/dspa/apis/v2beta1/runs/:runId', { - method: 'DELETE', - pathname: '/api/service/pipelines/test-project/dspa/apis/v2beta1/runs/test-pipeline', + path: { namespace: 'test-project', runId: 'test-pipeline' }, }, - mock200Status({}), + mockSuccessResponse, ).as('deleteRunPipeline-1'); - cy.intercept( + cy.interceptOdh( + 'DELETE /api/service/pipelines/:namespace/dspa/apis/v2beta1/runs/:runId', { - method: 'DELETE', - pathname: '/api/service/pipelines/test-project/dspa/apis/v2beta1/runs/other-pipeline', + path: { namespace: 'test-project', runId: 'other-pipeline' }, }, - mock200Status({}), + mockSuccessResponse, ).as('deleteRunPipeline-2'); - - cy.intercept( + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/runs', { - method: 'GET', - pathname: '/api/service/pipelines/test-project/dspa/apis/v2beta1/runs', + path: { namespace: 'test-project' }, }, { runs: [] }, ).as('getRuns'); diff --git a/frontend/src/__tests__/cypress/cypress/e2e/pipelines/PipelineRuns.cy.ts b/frontend/src/__tests__/cypress/cypress/e2e/pipelines/PipelineRuns.cy.ts index 1e6a7e2d6e..c65ca68c17 100644 --- a/frontend/src/__tests__/cypress/cypress/e2e/pipelines/PipelineRuns.cy.ts +++ b/frontend/src/__tests__/cypress/cypress/e2e/pipelines/PipelineRuns.cy.ts @@ -801,19 +801,17 @@ const initIntercepts = () => { ]), ); - cy.intercept( + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines', { - method: 'GET', - pathname: `/api/service/pipelines/${projectName}/dspa/apis/v2beta1/pipelines`, + path: { namespace: projectName }, }, buildMockPipelines([buildMockPipelineV2({ pipeline_id: pipelineId })]), ); - cy.intercept( - { - method: 'GET', - pathname: `/api/service/pipelines/${projectName}/dspa/apis/v2beta1/pipelines/${pipelineId}/versions`, - }, + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines/:pipelineId/versions', + { path: { namespace: projectName, pipelineId } }, buildMockPipelineVersionsV2(mockVersions), ); }; diff --git a/frontend/src/__tests__/cypress/cypress/e2e/pipelines/Pipelines.cy.ts b/frontend/src/__tests__/cypress/cypress/e2e/pipelines/Pipelines.cy.ts index bf658375ca..f3a7216eb2 100644 --- a/frontend/src/__tests__/cypress/cypress/e2e/pipelines/Pipelines.cy.ts +++ b/frontend/src/__tests__/cypress/cypress/e2e/pipelines/Pipelines.cy.ts @@ -773,13 +773,14 @@ describe('Pipelines', () => { .click(); pipelineDeleteModal.shouldBeOpen(); pipelineDeleteModal.findInput().type(initialMockPipeline.display_name); - cy.intercept( + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines', { - method: 'GET', - pathname: `/api/service/pipelines/${projectName}/dspa/apis/v2beta1/pipelines`, + path: { namespace: projectName }, }, buildMockPipelines([]), ).as('refreshPipelines'); + pipelineDeleteModal.findSubmitButton().click(); cy.wait('@deletePipeline'); @@ -807,13 +808,12 @@ describe('Pipelines', () => { .click(); pipelineDeleteModal.shouldBeOpen(); pipelineDeleteModal.findInput().type(initialMockPipelineVersion.display_name); - cy.intercept( - { - method: 'GET', - pathname: `/api/service/pipelines/${projectName}/dspa/apis/v2beta1/pipelines/${initialMockPipeline.pipeline_id}/versions`, - }, + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines/:pipelineId/versions', + { path: { namespace: projectName, pipelineId: initialMockPipeline.pipeline_id } }, buildMockPipelineVersionsV2([]), ).as('refreshVersions'); + pipelineDeleteModal.findSubmitButton().click(); cy.wait('@deleteVersion'); @@ -1030,42 +1030,34 @@ const initIntercepts = ({ ]), ); - cy.intercept( + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines', { - pathname: `/api/service/pipelines/${projectName}/dspa/apis/v2beta1/pipelines`, + path: { namespace: projectName }, }, buildMockPipelines(mockPipelines), ); - cy.intercept( - { - method: 'GET', - pathname: `/api/service/pipelines/${projectName}/dspa/apis/v2beta1/pipelines/${initialMockPipeline.pipeline_id}/versions`, - }, + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines/:pipelineId/versions', + { path: { namespace: projectName, pipelineId: initialMockPipeline.pipeline_id } }, buildMockPipelineVersionsV2([initialMockPipelineVersion]), ); }; const createDeleteVersionIntercept = (pipelineId: string, pipelineVersionId: string) => - cy.intercept( - { - pathname: `/api/service/pipelines/${projectName}/dspa/apis/v2beta1/pipelines/${pipelineId}/versions/${pipelineVersionId}`, - method: 'DELETE', - times: 1, - }, - { - body: {}, - }, + cy.interceptOdh( + 'DELETE /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines/:pipelineId/versions/:pipelineVersionId', + { path: { namespace: projectName, pipelineId, pipelineVersionId }, times: 1 }, + {}, ); const createDeletePipelineIntercept = (pipelineId: string) => - cy.intercept( + cy.interceptOdh( + 'DELETE /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines/:pipelineId', { - pathname: `/api/service/pipelines/${projectName}/dspa/apis/v2beta1/pipelines/${pipelineId}`, - method: 'DELETE', + path: { namespace: projectName, pipelineId }, times: 1, }, - { - body: {}, - }, + {}, ); diff --git a/frontend/src/__tests__/cypress/cypress/e2e/pipelines/PipelinesList.cy.ts b/frontend/src/__tests__/cypress/cypress/e2e/pipelines/PipelinesList.cy.ts index fb3b0984b0..c92e18a07c 100644 --- a/frontend/src/__tests__/cypress/cypress/e2e/pipelines/PipelinesList.cy.ts +++ b/frontend/src/__tests__/cypress/cypress/e2e/pipelines/PipelinesList.cy.ts @@ -81,13 +81,14 @@ describe('PipelinesList', () => { DataSciencePipelineApplicationModel, mockDataSciencePipelineApplicationK8sResource({}), ); - cy.intercept( + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines', { - method: 'GET', - pathname: '/api/service/pipelines/test-project/dspa/apis/v2beta1/pipelines', + path: { namespace: 'test-project' }, }, buildMockPipelines([]), ).as('pipelines'); + projectDetails.visitSection('test-project', 'pipelines-projects'); pipelinesSection.findImportPipelineSplitButton().should('be.enabled').click(); @@ -130,18 +131,16 @@ describe('PipelinesList', () => { DataSciencePipelineApplicationModel, mockDataSciencePipelineApplicationK8sResource({}), ); - cy.intercept( + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines', { - pathname: '/api/service/pipelines/test-project/dspa/apis/v2beta1/pipelines', + path: { namespace: 'test-project' }, }, buildMockPipelines([initialMockPipeline]), ); - - cy.intercept( - { - method: 'GET', - pathname: `/api/service/pipelines/test-project/dspa/apis/v2beta1/pipelines/${initialMockPipeline.pipeline_id}/versions`, - }, + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines/:pipelineId/versions', + { path: { namespace: 'test-project', pipelineId: initialMockPipeline.pipeline_id } }, buildMockPipelineVersionsV2([initialMockPipelineVersion]), ); projectDetails.visitSection('test-project', 'pipelines-projects'); diff --git a/frontend/src/__tests__/cypress/cypress/e2e/pipelines/PipelinesTopology.cy.ts b/frontend/src/__tests__/cypress/cypress/e2e/pipelines/PipelinesTopology.cy.ts index 2089994c58..ecbe4b3b3f 100644 --- a/frontend/src/__tests__/cypress/cypress/e2e/pipelines/PipelinesTopology.cy.ts +++ b/frontend/src/__tests__/cypress/cypress/e2e/pipelines/PipelinesTopology.cy.ts @@ -28,7 +28,6 @@ import { RouteModel, SecretModel, } from '~/__tests__/cypress/cypress/utils/models'; -import { mock200Status } from '~/__mocks__/mockK8sStatus'; import { deleteModal } from '~/__tests__/cypress/cypress/pages/components/DeleteModal'; const projectId = 'test-project'; @@ -106,67 +105,38 @@ const initIntercepts = () => { namespace: projectId, }), ); - cy.intercept( - { - method: 'POST', - pathname: `/api/service/pipelines/${projectId}/dspa/apis/v2beta1/pipelines`, - }, - { pipelines: [mockPipeline] }, - ); - cy.intercept( + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines/:pipelineId', { - method: 'GET', - pathname: `/api/service/pipelines/${projectId}/dspa/apis/v2beta1/pipelines/${mockPipeline.pipeline_id}`, + path: { namespace: projectId, pipelineId: mockPipeline.pipeline_id }, }, mockPipeline, ); - cy.intercept( - { - method: 'GET', - pathname: `/api/service/pipelines/${projectId}/dspa/apis/v2beta1/pipelines/${mockPipeline.pipeline_id}/versions`, - }, + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines/:pipelineId/versions', + { path: { namespace: projectId, pipelineId: mockPipeline.pipeline_id } }, buildMockPipelineVersionsV2([mockVersion, mockVersion2]), ); - - cy.intercept( - { - method: 'GET', - pathname: `/api/service/pipelines/${projectId}/dspa/apis/v2beta1/recurringruns/${mockJob.recurring_run_id}`, - }, + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/recurringruns/:recurringRunId', + { path: { namespace: projectId, recurringRunId: mockJob.recurring_run_id } }, mockJob, ); - cy.intercept( - { - method: 'POST', - pathname: `/api/service/pipelines/${projectId}/dspa/apis/v2beta1/recurringruns`, - }, - { recurringRuns: [mockJob] }, - ); - cy.intercept( + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/runs/:runId', { - method: 'GET', - pathname: `/api/service/pipelines/${projectId}/dspa/apis/v2beta1/runs/${mockRun.run_id}`, + path: { namespace: projectId, runId: mockRun.run_id }, }, mockRun, ); - cy.intercept( - { - method: 'POST', - pathname: `/api/service/pipelines/${projectId}/dspa/apis/v2beta1/runs`, - }, - { runs: [mockRun] }, - ); - cy.intercept( - { - method: 'POST', - pathname: `/api/service/pipelines/${projectId}/dspa/apis/v2beta1/pipelines/${mockPipeline.pipeline_id}/versions`, - }, - [mockVersion], - ); - cy.intercept( + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines/:pipelineId/versions/:pipelineVersionId', { - method: 'GET', - pathname: `/api/service/pipelines/${projectId}/dspa/apis/v2beta1/pipelines/${mockPipeline.pipeline_id}/versions/${mockVersion.pipeline_version_id}`, + path: { + namespace: projectId, + pipelineId: mockPipeline.pipeline_id, + pipelineVersionId: mockVersion.pipeline_version_id, + }, }, mockVersion, ); @@ -247,12 +217,16 @@ describe('Pipeline topology', () => { pipelineDetails.selectActionDropdownItem('Delete pipeline version'); deleteModal.shouldBeOpen(); deleteModal.findInput().type(mockVersion.display_name); - cy.intercept( + cy.interceptOdh( + 'DELETE /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines/:pipelineId/versions/:pipelineVersionId', { - method: 'DELETE', - pathname: `/api/service/pipelines/${projectId}/dspa/apis/v2beta1/pipelines/${mockPipeline.pipeline_id}/versions/${mockVersion.pipeline_version_id}`, + path: { + namespace: projectId, + pipelineId: mockPipeline.pipeline_id, + pipelineVersionId: mockVersion.pipeline_version_id, + }, }, - mock200Status({}), + {}, ).as('deletePipelineVersion'); deleteModal.findSubmitButton().click(); @@ -260,10 +234,14 @@ describe('Pipeline topology', () => { }); it('page details are updated when a new pipeline version is selected', () => { - cy.intercept( + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines/:pipelineId/versions/:pipelineVersionId', { - method: 'GET', - pathname: `/api/service/pipelines/${projectId}/dspa/apis/v2beta1/pipelines/${mockPipeline.pipeline_id}/versions/${mockVersion2.pipeline_version_id}`, + path: { + namespace: projectId, + pipelineId: mockPipeline.pipeline_id, + pipelineVersionId: mockVersion2.pipeline_version_id, + }, }, mockVersion2, ); @@ -275,10 +253,14 @@ describe('Pipeline topology', () => { }); it('page details are updated after uploading a new version', () => { - cy.intercept( + cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines/:pipelineId/versions/:pipelineVersionId', { - method: 'GET', - pathname: `/api/service/pipelines/${projectId}/dspa/apis/v2beta1/pipelines/${mockPipeline.pipeline_id}/versions/${mockVersion2.pipeline_version_id}`, + path: { + namespace: projectId, + pipelineId: mockPipeline.pipeline_id, + pipelineVersionId: mockVersion2.pipeline_version_id, + }, }, mockVersion2, ); @@ -286,11 +268,9 @@ describe('Pipeline topology', () => { pipelineDetails.selectActionDropdownItem('Upload new version'); pipelineVersionImportModal.findImportPipelineRadio().check(); pipelineVersionImportModal.findPipelineUrlInput().type('https://example.com/pipeline.yaml'); - cy.intercept( - { - method: 'POST', - pathname: `/api/service/pipelines/${projectId}/dspa/apis/v2beta1/pipelines/${mockPipeline.pipeline_id}/versions`, - }, + cy.interceptOdh( + 'POST /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines/:pipelineId/versions', + { path: { namespace: projectId, pipelineId: mockPipeline.pipeline_id } }, mockVersion2, ).as('uploadNewPipelineVersion'); @@ -342,9 +322,9 @@ describe('Pipeline topology', () => { deleteModal.findInput().type(mockPipeline.display_name); cy.interceptOdh( - 'DELETE /api/service/pipelines/:projectId/dspa/apis/v2beta1/recurringruns/:pipeline_id', - { path: { projectId, pipeline_id: mockPipeline.pipeline_id } }, - mock200Status({}), + 'DELETE /api/service/pipelines/:namespace/dspa/apis/v2beta1/recurringruns/:recurringRunId', + { path: { namespace: projectId, recurringRunId: mockPipeline.pipeline_id } }, + {}, ).as('deletepipelineRunJob'); deleteModal.findSubmitButton().click(); diff --git a/frontend/src/__tests__/cypress/cypress/pages/pipelines/cloneRunPage.ts b/frontend/src/__tests__/cypress/cypress/pages/pipelines/cloneRunPage.ts index 66a2f95ce4..b0f0470b11 100644 --- a/frontend/src/__tests__/cypress/cypress/pages/pipelines/cloneRunPage.ts +++ b/frontend/src/__tests__/cypress/cypress/pages/pipelines/cloneRunPage.ts @@ -15,21 +15,19 @@ class CloneRunPage extends CreateRunPage { } mockGetRun(namespace: string, run: PipelineRunKFv2) { - return cy.intercept( + return cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/runs/:runId', { - method: 'GET', - pathname: `/api/service/pipelines/${namespace}/dspa/apis/v2beta1/runs/${run.run_id}`, + path: { namespace, runId: run.run_id }, }, run, ); } mockGetRecurringRun(namespace: string, recurringRun: PipelineRunJobKFv2) { - return cy.intercept( - { - method: 'GET', - pathname: `/api/service/pipelines/${namespace}/dspa/apis/v2beta1/recurringruns/${recurringRun.recurring_run_id}`, - }, + return cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/recurringruns/:recurringRunId', + { path: { namespace, recurringRunId: recurringRun.recurring_run_id } }, recurringRun, ); } @@ -38,31 +36,31 @@ class CloneRunPage extends CreateRunPage { namespace: string, pipelineVersion: PipelineVersionKFv2, ): Cypress.Chainable { - return cy.intercept( + return cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines/:pipelineId/versions/:pipelineVersionId', { - method: 'GET', - pathname: `/api/service/pipelines/${namespace}/dspa/apis/v2beta1/pipelines/${pipelineVersion.pipeline_id}/versions/${pipelineVersion.pipeline_version_id}`, + path: { + namespace, + pipelineId: pipelineVersion.pipeline_id, + pipelineVersionId: pipelineVersion.pipeline_version_id, + }, }, pipelineVersion, ); } mockGetPipeline(namespace: string, pipeline: PipelineKFv2): Cypress.Chainable { - return cy.intercept( - { - method: 'GET', - pathname: `/api/service/pipelines/${namespace}/dspa/apis/v2beta1/pipelines/${pipeline.pipeline_id}`, - }, + return cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines/:pipelineId', + { path: { namespace, pipelineId: pipeline.pipeline_id } }, pipeline, ); } mockGetExperiment(namespace: string, experiment: ExperimentKFv2): Cypress.Chainable { - return cy.intercept( - { - method: 'GET', - pathname: `/api/service/pipelines/${namespace}/dspa/apis/v2beta1/experiments/${experiment.experiment_id}`, - }, + return cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/experiments/:experimentId', + { path: { namespace, experimentId: experiment.experiment_id } }, experiment, ); } diff --git a/frontend/src/__tests__/cypress/cypress/pages/pipelines/createRunPage.ts b/frontend/src/__tests__/cypress/cypress/pages/pipelines/createRunPage.ts index 93fe5ff409..a635e5992d 100644 --- a/frontend/src/__tests__/cypress/cypress/pages/pipelines/createRunPage.ts +++ b/frontend/src/__tests__/cypress/cypress/pages/pipelines/createRunPage.ts @@ -159,16 +159,20 @@ export class CreateRunPage { } mockGetExperiments(namespace: string, experiments?: ExperimentKFv2[]): Cypress.Chainable { - return cy.intercept( - { pathname: `/api/service/pipelines/${namespace}/dspa/apis/v2beta1/experiments` }, + return cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/experiments', + { + path: { namespace }, + }, buildMockExperiments(experiments), ); } mockGetPipelines(namespace: string, pipelines: PipelineKFv2[]): Cypress.Chainable { - return cy.intercept( + return cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines', { - pathname: `/api/service/pipelines/${namespace}/dspa/apis/v2beta1/pipelines`, + path: { namespace }, }, buildMockPipelines(pipelines), ); @@ -179,11 +183,9 @@ export class CreateRunPage { versions: PipelineVersionKFv2[], pipelineId: string, ): Cypress.Chainable { - return cy.intercept( - { - method: 'GET', - pathname: `/api/service/pipelines/${namespace}/dspa/apis/v2beta1/pipelines/${pipelineId}/versions`, - }, + return cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines/:pipelineId/versions', + { path: { namespace, pipelineId } }, buildMockPipelineVersionsV2(versions), ); } @@ -193,10 +195,10 @@ export class CreateRunPage { pipelineVersion: PipelineVersionKFv2, { run_id, ...run }: Partial, ): Cypress.Chainable { - return cy.intercept( + return cy.interceptOdh( + 'POST /api/service/pipelines/:namespace/dspa/apis/v2beta1/runs', { - method: 'POST', - pathname: `/api/service/pipelines/${namespace}/dspa/apis/v2beta1/runs`, + path: { namespace }, times: 1, }, (req) => { @@ -222,12 +224,9 @@ export class CreateRunPage { pipelineVersion: PipelineVersionKFv2, { recurring_run_id, ...recurringRun }: Partial, ): Cypress.Chainable { - return cy.intercept( - { - method: 'POST', - pathname: `/api/service/pipelines/${namespace}/dspa/apis/v2beta1/recurringruns`, - times: 1, - }, + return cy.interceptOdh( + 'POST /api/service/pipelines/:namespace/dspa/apis/v2beta1/recurringruns', + { path: { namespace }, times: 1 }, (req) => { const data = { display_name: recurringRun.display_name, diff --git a/frontend/src/__tests__/cypress/cypress/pages/pipelines/experiments.ts b/frontend/src/__tests__/cypress/cypress/pages/pipelines/experiments.ts index ac6be2ab3f..1f9c82e049 100644 --- a/frontend/src/__tests__/cypress/cypress/pages/pipelines/experiments.ts +++ b/frontend/src/__tests__/cypress/cypress/pages/pipelines/experiments.ts @@ -35,10 +35,10 @@ class ExperimentsTabs { activeExperiments: ExperimentKFv2[], archivedExperiments: ExperimentKFv2[] = [], ) { - return cy.intercept( + return cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/experiments', { - method: 'GET', - pathname: `/api/service/pipelines/${namespace}/dspa/apis/v2beta1/experiments`, + path: { namespace }, }, (req) => { const { predicates } = JSON.parse(req.query.filter.toString()); @@ -72,11 +72,9 @@ class ExperimentsTable { } mockArchiveExperiment(experimentId: string, namespace: string) { - return cy.intercept( - { - method: 'POST', - pathname: `/api/service/pipelines/${namespace}/dspa/apis/v2beta1/experiments/${experimentId}:archive`, - }, + return cy.interceptOdh( + 'POST /api/service/pipelines/:namespace/dspa/apis/v2beta1/experiments/:experimentId', + { path: { namespace, experimentId: `${experimentId}:archive` } }, (req) => { req.reply({ body: {} }); }, @@ -84,11 +82,9 @@ class ExperimentsTable { } mockRestoreExperiment(experimentId: string, namespace: string) { - return cy.intercept( - { - method: 'POST', - pathname: `/api/service/pipelines/${namespace}/dspa/apis/v2beta1/experiments/${experimentId}:unarchive`, - }, + return cy.interceptOdh( + 'POST /api/service/pipelines/:namespace/dspa/apis/v2beta1/experiments/:experimentId', + { path: { namespace, experimentId: `${experimentId}:unarchive` } }, (req) => { req.reply({ body: {} }); }, diff --git a/frontend/src/__tests__/cypress/cypress/pages/pipelines/pipelineFilterBar.ts b/frontend/src/__tests__/cypress/cypress/pages/pipelines/pipelineFilterBar.ts index 95dcce235c..ab3c910ef2 100644 --- a/frontend/src/__tests__/cypress/cypress/pages/pipelines/pipelineFilterBar.ts +++ b/frontend/src/__tests__/cypress/cypress/pages/pipelines/pipelineFilterBar.ts @@ -70,10 +70,10 @@ class PipelineRunFilterBar extends PipelineFilterBar { } mockExperiments(experiments: ExperimentKFv2[], namespace: string) { - return cy.intercept( + return cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/experiments', { - method: 'GET', - pathname: `/api/service/pipelines/${namespace}/dspa/apis/v2beta1/experiments`, + path: { namespace }, }, { experiments, diff --git a/frontend/src/__tests__/cypress/cypress/pages/pipelines/pipelineImportModal.ts b/frontend/src/__tests__/cypress/cypress/pages/pipelines/pipelineImportModal.ts index 4f7bdacebe..821fedafd0 100644 --- a/frontend/src/__tests__/cypress/cypress/pages/pipelines/pipelineImportModal.ts +++ b/frontend/src/__tests__/cypress/cypress/pages/pipelines/pipelineImportModal.ts @@ -52,10 +52,10 @@ class PipelineImportModal extends Modal { } mockCreatePipelineAndVersion(params: CreatePipelineAndVersionKFData, namespace: string) { - return cy.intercept( + return cy.interceptOdh( + 'POST /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines/create', { - method: 'POST', - pathname: `/api/service/pipelines/${namespace}/dspa/apis/v2beta1/pipelines/create`, + path: { namespace }, times: 1, }, buildMockPipelineV2(params.pipeline), @@ -63,12 +63,9 @@ class PipelineImportModal extends Modal { } mockUploadPipeline(params: Partial, namespace: string) { - return cy.intercept( - { - method: 'POST', - pathname: `/api/service/pipelines/${namespace}/dspa/apis/v2beta1/pipelines/upload`, - times: 1, - }, + return cy.interceptOdh( + 'POST /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines/upload', + { path: { namespace }, times: 1 }, buildMockPipelineV2(params), ); } diff --git a/frontend/src/__tests__/cypress/cypress/pages/pipelines/pipelineRunTable.ts b/frontend/src/__tests__/cypress/cypress/pages/pipelines/pipelineRunTable.ts index 46af7584be..86d2c7d8f7 100644 --- a/frontend/src/__tests__/cypress/cypress/pages/pipelines/pipelineRunTable.ts +++ b/frontend/src/__tests__/cypress/cypress/pages/pipelines/pipelineRunTable.ts @@ -66,11 +66,9 @@ class PipelineRunsTable { } mockRestoreRun(runId: string, namespace: string) { - return cy.intercept( - { - method: 'POST', - pathname: `/api/service/pipelines/${namespace}/dspa/apis/v2beta1/runs/${runId}:unarchive`, - }, + return cy.interceptOdh( + 'POST /api/service/pipelines/:namespace/dspa/apis/v2beta1/runs/:runId', + { path: { namespace, runId: `${runId}:unarchive` } }, (req) => { req.reply({ body: {} }); }, @@ -78,11 +76,9 @@ class PipelineRunsTable { } mockArchiveRun(runId: string, namespace: string) { - return cy.intercept( - { - method: 'POST', - pathname: `/api/service/pipelines/${namespace}/dspa/apis/v2beta1/runs/${runId}:archive`, - }, + return cy.interceptOdh( + 'POST /api/service/pipelines/:namespace/dspa/apis/v2beta1/runs/:runId', + { path: { namespace, runId: `${runId}:archive` } }, (req) => { req.reply({ body: {} }); }, @@ -95,10 +91,10 @@ class PipelineRunsTable { namespace: string, times?: number, ) { - return cy.intercept( + return cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/runs', { - method: 'GET', - pathname: `/api/service/pipelines/${namespace}/dspa/apis/v2beta1/runs`, + path: { namespace }, ...(times && { times }), }, (req) => { @@ -160,41 +156,33 @@ class PipelineRunJobTable extends PipelineRunsTable { } mockGetJobs(jobs: PipelineRunJobKFv2[], namespace: string) { - return cy.intercept( - { - method: 'GET', - pathname: `/api/service/pipelines/${namespace}/dspa/apis/v2beta1/recurringruns`, - }, + return cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/recurringruns', + { path: { namespace } }, { recurringRuns: jobs, total_size: jobs.length }, ); } mockGetJob(job: PipelineRunJobKFv2, namespace: string) { - return cy.intercept( - { - method: 'GET', - pathname: `/api/service/pipelines/${namespace}/dspa/apis/v2beta1/recurringruns/${job.recurring_run_id}`, - }, + return cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/recurringruns/:recurringRunId', + { path: { namespace, recurringRunId: job.recurring_run_id } }, job, ); } mockEnableJob(job: PipelineRunJobKFv2, namespace: string) { - return cy.intercept( - { - method: 'POST', - pathname: `/api/service/pipelines/${namespace}/dspa/apis/v2beta1/recurringruns/${job.recurring_run_id}:enable`, - }, + return cy.interceptOdh( + 'POST /api/service/pipelines/:namespace/dspa/apis/v2beta1/recurringruns/:recurringRunId', + { path: { namespace, recurringRunId: `${job.recurring_run_id}:'enable'` } }, {}, ); } mockDisableJob(job: PipelineRunJobKFv2, namespace: string) { - return cy.intercept( - { - method: 'POST', - pathname: `/api/service/pipelines/${namespace}/dspa/apis/v2beta1/recurringruns/${job.recurring_run_id}:disable`, - }, + return cy.interceptOdh( + 'POST /api/service/pipelines/:namespace/dspa/apis/v2beta1/recurringruns/:recurringRunId', + { path: { namespace, recurringRunId: `${job.recurring_run_id}:disable` } }, {}, ); } diff --git a/frontend/src/__tests__/cypress/cypress/pages/pipelines/pipelineVersionImportModal.ts b/frontend/src/__tests__/cypress/cypress/pages/pipelines/pipelineVersionImportModal.ts index bd905e4852..a382c4de00 100644 --- a/frontend/src/__tests__/cypress/cypress/pages/pipelines/pipelineVersionImportModal.ts +++ b/frontend/src/__tests__/cypress/cypress/pages/pipelines/pipelineVersionImportModal.ts @@ -74,23 +74,17 @@ class PipelineImportModal extends Modal { } mockCreatePipelineVersion(params: CreatePipelineVersionKFData, namespace: string) { - return cy.intercept( - { - method: 'POST', - pathname: `/api/service/pipelines/${namespace}/dspa/apis/v2beta1/pipelines/${params.pipeline_id}/versions`, - times: 1, - }, + return cy.interceptOdh( + 'POST /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines/:pipelineId/versions', + { path: { namespace, pipelineId: params.pipeline_id }, times: 1 }, buildMockPipelineVersionV2(params), ); } mockUploadVersion(params: Partial, namespace: string) { - return cy.intercept( - { - method: 'POST', - pathname: `/api/service/pipelines/${namespace}/dspa/apis/v2beta1/pipelines/upload_version`, - times: 1, - }, + return cy.interceptOdh( + 'POST /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines/upload_version', + { path: { namespace }, times: 1 }, buildMockPipelineVersionV2(params), ); } diff --git a/frontend/src/__tests__/cypress/cypress/pages/pipelines/pipelinesTable.ts b/frontend/src/__tests__/cypress/cypress/pages/pipelines/pipelinesTable.ts index 45a2ab7078..230dad2a16 100644 --- a/frontend/src/__tests__/cypress/cypress/pages/pipelines/pipelinesTable.ts +++ b/frontend/src/__tests__/cypress/cypress/pages/pipelines/pipelinesTable.ts @@ -69,41 +69,41 @@ class PipelinesTable { } mockDeletePipeline(pipeline: PipelineKFv2, namespace: string) { - return cy.intercept( - { - method: 'DELETE', - pathname: `/api/service/pipelines/${namespace}/dspa/apis/v2beta1/pipelines/${pipeline.pipeline_id}`, - }, + return cy.interceptOdh( + 'DELETE /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines/:pipelineId', + { path: { namespace, pipelineId: pipeline.pipeline_id } }, {}, ); } mockDeletePipelineVersion(version: PipelineVersionKFv2, namespace: string) { - return cy.intercept( + return cy.interceptOdh( + 'DELETE /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines/:pipelineId/versions/:pipelineVersionId', { - method: 'DELETE', - pathname: `/api/service/pipelines/${namespace}/dspa/apis/v2beta1/pipelines/${version.pipeline_id}/versions/${version.pipeline_version_id}`, + path: { + namespace, + pipelineId: version.pipeline_id, + pipelineVersionId: version.pipeline_version_id, + }, }, {}, ); } mockGetPipelines(pipelines: PipelineKFv2[], namespace: string) { - return cy.intercept( + return cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines', { - method: 'GET', - pathname: `/api/service/pipelines/${namespace}/dspa/apis/v2beta1/pipelines`, + path: { namespace }, }, buildMockPipelines(pipelines), ); } mockGetPipelineVersions(versions: PipelineVersionKFv2[], pipelineId: string, namespace: string) { - return cy.intercept( - { - method: 'GET', - pathname: `/api/service/pipelines/${namespace}/dspa/apis/v2beta1/pipelines/${pipelineId}/versions`, - }, + return cy.interceptOdh( + 'GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines/:pipelineId/versions', + { path: { namespace, pipelineId } }, buildMockPipelineVersionsV2(versions), ); } diff --git a/frontend/src/__tests__/cypress/cypress/support/commands/odh.ts b/frontend/src/__tests__/cypress/cypress/support/commands/odh.ts index 6d02d1558b..b47732cfbb 100644 --- a/frontend/src/__tests__/cypress/cypress/support/commands/odh.ts +++ b/frontend/src/__tests__/cypress/cypress/support/commands/odh.ts @@ -1,4 +1,4 @@ -import { K8sResourceListResult, K8sStatus } from '@openshift/dynamic-plugin-sdk-utils'; +import { K8sResourceListResult } from '@openshift/dynamic-plugin-sdk-utils'; import type { GenericStaticResponse, RouteHandlerController } from 'cypress/types/net-stubbing'; import { BaseMetricCreationResponse, BaseMetricListResponse } from '~/api'; import { @@ -32,6 +32,19 @@ import type { PrometheusQueryRangeResponse, PrometheusQueryResponse, } from '~/types'; +import { + ExperimentKFv2, + GoogleRpcStatusKF, + ListExperimentsResponseKF, + ListPipelineRunJobsResourceKF, + ListPipelineRunsResourceKF, + ListPipelineVersionsKF, + ListPipelinesResponseKF, + PipelineKFv2, + PipelineRunJobKFv2, + PipelineRunKFv2, + PipelineVersionKFv2, +} from '~/concepts/pipelines/kfTypes'; type SuccessErrorResponse = { success: boolean; @@ -46,7 +59,7 @@ type OdhResponse = type Replacement = Record; type Query = Record; -type Options = { path?: Replacement; query?: Query } | null; +type Options = { path?: Replacement; query?: Query; times?: number } | null; /* eslint-disable @typescript-eslint/no-namespace */ declare global { @@ -339,14 +352,149 @@ declare global { ): Cypress.Chainable; interceptOdh( - type: 'GET /api/service/modelregistry/modelregistry-sample/api/model_registry/v1alpha3/registered_models/1/versions', - response: OdhResponse, + type: `GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines/:pipelineId/versions/:pipelineVersionId`, + options: { path: { namespace: string; pipelineId: string; pipelineVersionId: string } }, + response: OdhResponse, + ): Cypress.Chainable; + + interceptOdh( + type: `DELETE /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines/:pipelineId/versions/:pipelineVersionId`, + options: { + path: { namespace: string; pipelineId: string; pipelineVersionId: string }; + times?: number; + }, + response: OdhResponse, ): Cypress.Chainable; interceptOdh( - type: 'DELETE /api/service/pipelines/:projectId/dspa/apis/v2beta1/recurringruns/:pipeline_id', - options: { path: { projectId: string; pipeline_id: string } }, - response: OdhResponse, + type: `GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines/:pipelineId`, + options: { path: { namespace: string; pipelineId: string } }, + response: OdhResponse, + ): Cypress.Chainable; + + interceptOdh( + type: `DELETE /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines/:pipelineId`, + options: { path: { namespace: string; pipelineId: string }; times?: number }, + response: OdhResponse, + ): Cypress.Chainable; + + interceptOdh( + type: `POST /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines/upload_version`, + options: { path: { namespace: string }; times?: number }, + response: OdhResponse, + ): Cypress.Chainable; + + interceptOdh( + type: `POST /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines/:pipelineId/versions`, + options: { path: { namespace: string; pipelineId: string }; times?: number }, + response: OdhResponse, + ): Cypress.Chainable; + + interceptOdh( + type: `GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines/:pipelineId/versions`, + options: { path: { namespace: string; pipelineId: string } }, + response: OdhResponse, + ): Cypress.Chainable; + + interceptOdh( + type: `GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines`, + options: { path: { namespace: string } }, + response: OdhResponse, + ): Cypress.Chainable; + + interceptOdh( + type: `POST /api/service/pipelines/:namespace/dspa/apis/v2beta1/recurringruns/:recurringRunId`, + options: { path: { namespace: string; recurringRunId: string } }, + response: OdhResponse, + ): Cypress.Chainable; + + interceptOdh( + type: `GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/recurringruns/:recurringRunId`, + options: { path: { namespace: string; recurringRunId: string } }, + response: OdhResponse, + ): Cypress.Chainable; + + interceptOdh( + type: `DELETE /api/service/pipelines/:namespace/dspa/apis/v2beta1/recurringruns/:recurringRunId`, + options: { path: { namespace: string; recurringRunId: string } }, + response: OdhResponse, + ): Cypress.Chainable; + + interceptOdh( + type: `POST /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines/create`, + options: { path: { namespace: string }; times?: number }, + response: OdhResponse, + ): Cypress.Chainable; + + interceptOdh( + type: `POST /api/service/pipelines/:namespace/dspa/apis/v2beta1/pipelines/upload`, + options: { path: { namespace: string }; times?: number }, + response: OdhResponse, + ): Cypress.Chainable; + + interceptOdh( + type: `GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/runs`, + options: { path: { namespace: string } }, + response: OdhResponse, + ): Cypress.Chainable; + + interceptOdh( + type: `POST /api/service/pipelines/:namespace/dspa/apis/v2beta1/runs`, + options: { path: { namespace: string }; times?: number }, + response: OdhResponse, + ): Cypress.Chainable; + + interceptOdh( + type: `DELETE /api/service/pipelines/:namespace/dspa/apis/v2beta1/runs/:runId`, + options: { path: { namespace: string; runId: string } }, + response: OdhResponse, + ): Cypress.Chainable; + + interceptOdh( + type: `GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/runs/:runId`, + options: { path: { namespace: string; runId: string } }, + response: OdhResponse, + ): Cypress.Chainable; + + interceptOdh( + type: `POST /api/service/pipelines/:namespace/dspa/apis/v2beta1/runs/:runId`, + options: { path: { namespace: string; runId: string } }, + response: OdhResponse, + ): Cypress.Chainable; + + interceptOdh( + type: `GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/experiments`, + options: { path: { namespace: string } }, + response: OdhResponse, + ): Cypress.Chainable; + + interceptOdh( + type: `POST /api/service/pipelines/:namespace/dspa/apis/v2beta1/experiments/:experimentId`, + options: { path: { namespace: string; experimentId: string } }, + response: OdhResponse, + ): Cypress.Chainable; + + interceptOdh( + type: `GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/experiments/:experimentId`, + options: { path: { namespace: string; experimentId: string } }, + response: OdhResponse, + ): Cypress.Chainable; + + interceptOdh( + type: `POST /api/service/pipelines/:namespace/dspa/apis/v2beta1/recurringruns`, + options: { path: { namespace: string }; times?: number }, + response: OdhResponse, + ): Cypress.Chainable; + + interceptOdh( + type: `GET /api/service/pipelines/:namespace/dspa/apis/v2beta1/recurringruns`, + options: { path: { namespace: string } }, + response: OdhResponse, + ): Cypress.Chainable; + + interceptOdh( + type: 'GET /api/service/modelregistry/modelregistry-sample/api/model_registry/v1alpha3/registered_models/1/versions', + response: OdhResponse, ): Cypress.Chainable; interceptOdh( @@ -397,6 +545,9 @@ Cypress.Commands.add( pathname = pathname.replace(new RegExp(`:${part}\\b`), replacement); }); } - return cy.intercept({ method, pathname, query: options?.query }, response); + return cy.intercept( + { method, pathname, query: options?.query, ...(options?.times && { times: options.times }) }, + response, + ); }, );