diff --git a/ui/cypress/support/utils/PipelineUtils.ts b/ui/cypress/support/utils/PipelineUtils.ts index 72623a6903..42cfcc45e9 100644 --- a/ui/cypress/support/utils/PipelineUtils.ts +++ b/ui/cypress/support/utils/PipelineUtils.ts @@ -31,6 +31,10 @@ export class PipelineUtils { PipelineUtils.startPipeline(pipelineInput); } + public static goToPipelines() { + cy.visit('#/pipelines'); + } + private static goToPipelineEditor() { // Go to StreamPipes editor cy.visit('#/pipelines'); diff --git a/ui/cypress/tests/adapter/editAdapterSettingsAndPipeline.spec.ts b/ui/cypress/tests/adapter/editAdapterSettingsAndPipeline.spec.ts index ca0eb4f88d..5154d21e91 100644 --- a/ui/cypress/tests/adapter/editAdapterSettingsAndPipeline.spec.ts +++ b/ui/cypress/tests/adapter/editAdapterSettingsAndPipeline.spec.ts @@ -74,7 +74,7 @@ describe('Test Edit Adapter and Pipeline', () => { ConnectUtils.closeAdapterPreview(); // Go to pipelines, check for warning icon and edit pipeline - cy.visit('#/pipelines').wait(1000); + PipelineUtils.goToPipelines(); cy.dataCy('pipeline-warning-icon', { timeout: 60000, diff --git a/ui/cypress/tests/pipeline/pipelineExport.spec.ts b/ui/cypress/tests/pipeline/pipelineExport.spec.ts new file mode 100644 index 0000000000..d125d56307 --- /dev/null +++ b/ui/cypress/tests/pipeline/pipelineExport.spec.ts @@ -0,0 +1,79 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import { ConnectUtils } from '../../support/utils/connect/ConnectUtils'; +import { PipelineUtils } from '../../support/utils/PipelineUtils'; +import { PipelineElementBuilder } from '../../support/builder/PipelineElementBuilder'; +import { PipelineBuilder } from '../../support/builder/PipelineBuilder'; + +const adapterName = 'simulator'; + +describe('Test Export and Import Functionality of Pipelines', () => { + beforeEach('Setup Test', () => { + cy.initStreamPipesTest(); + ConnectUtils.addMachineDataSimulator(adapterName); + const pipelineInput = PipelineBuilder.create('Pipeline Test') + .addSource(adapterName) + .addProcessingElement( + PipelineElementBuilder.create('field_renamer') + .addInput('drop-down', 'convert-property', 'timestamp') + .addInput('input', 'field-name', 't') + .build(), + ) + .addSink( + PipelineElementBuilder.create('data_lake') + .addInput('input', 'db_measurement', 'demo') + .build(), + ) + .build(); + + PipelineUtils.addPipeline(pipelineInput); + }); + + it('Perform Test', () => { + PipelineUtils.goToPipelines(); + + // Check if pipeline exists + cy.dataCy('all-pipelines-table').should('have.length', 1); + + // Export Pipeline + cy.dataCy('export-pipelines-btn').click(); + + // Delete created pipeline + PipelineUtils.deletePipeline(); + cy.dataCy('all-pipelines-table').should('have.length', 0); + + // Import pipeline + cy.dataCy('import-pipelines-btn').click(); + cy.get('input[type="file"]').selectFile( + 'cypress/downloads/pipelines.json', + { force: true }, + ); + // Select pipeline checkbox + cy.get('[type="checkbox"]').check(); + cy.dataCy('import-selected-pipelines-btn').click(); + + // Check if pipeline import was succesful + cy.dataCy('all-pipelines-table').should('have.length', 1); + + // Start pipeline and check if pipeline has started correctly + cy.dataCy('start-pipeline-button').click(); + cy.get('[class="success-message"]').should('be.visible'); + cy.dataCy('sp-pipeline-dialog-close').click(); + }); +}); diff --git a/ui/src/app/pipelines/components/pipeline-overview/pipeline-overview.component.html b/ui/src/app/pipelines/components/pipeline-overview/pipeline-overview.component.html index 6e3805e1bb..ea01ffa894 100644 --- a/ui/src/app/pipelines/components/pipeline-overview/pipeline-overview.component.html +++ b/ui/src/app/pipelines/components/pipeline-overview/pipeline-overview.component.html @@ -28,6 +28,7 @@ [dataSource]="dataSource" style="width: 100%" matSort + data-cy="all-pipelines-table" > Status diff --git a/ui/src/app/pipelines/dialog/import-pipeline/import-pipeline-dialog.component.html b/ui/src/app/pipelines/dialog/import-pipeline/import-pipeline-dialog.component.html index 6b33ca0b4c..eea801e8f9 100644 --- a/ui/src/app/pipelines/dialog/import-pipeline/import-pipeline-dialog.component.html +++ b/ui/src/app/pipelines/dialog/import-pipeline/import-pipeline-dialog.component.html @@ -99,6 +99,7 @@

{{ pages[1].description }}

color="accent" (click)="startImport()" *ngIf="page === 'select-pipelines'" + data-cy="import-selected-pipelines-btn" > Import diff --git a/ui/src/app/pipelines/pipelines.component.html b/ui/src/app/pipelines/pipelines.component.html index 7c224bf8e0..9f1851d6f2 100644 --- a/ui/src/app/pipelines/pipelines.component.html +++ b/ui/src/app/pipelines/pipelines.component.html @@ -69,6 +69,7 @@ matTooltip="Export pipelines" matTooltipPosition="above" (click)="exportPipelines()" + data-cy="export-pipelines-btn" > cloud_download @@ -78,6 +79,7 @@ matTooltip="Import pipelines" matTooltipPosition="above" (click)="openImportPipelinesDialog()" + data-cy="import-pipelines-btn" > cloud_upload