From ecf420aa3b05a197383cc070fa1f73867bbcb437 Mon Sep 17 00:00:00 2001 From: Philipp Zehnder Date: Wed, 26 Jun 2024 08:53:28 +0200 Subject: [PATCH 1/2] fix(#2954): Add test to reproduce problem --- .../support/utils/connect/ConnectBtns.ts | 13 ++++++ .../{ => connect}/ConnectEventSchemaUtils.ts | 30 +++++++------ .../support/utils/connect/ConnectUtils.ts | 10 ++++- .../support/utils/datalake/DataLakeBtns.ts | 24 ++++++++++ .../support/utils/datalake/DataLakeUtils.ts | 15 +++++++ .../tests/adapter/editAdapter.smoke.spec.ts | 45 ++++++++++++++++++- .../editAdapterSettingsAndPipeline.spec.ts | 2 +- .../editAdapterValuesAndFields.spec.ts | 6 +-- .../rules/deleteTransformationRule.spec.ts | 2 +- .../adapter/rules/schemaRules.smoke.spec.ts | 2 +- .../tests/adapter/rules/streamRules.spec.ts | 2 +- ui/cypress/tests/adapter/rules/valueRules.ts | 2 +- .../datalake-configuration.component.html | 4 +- 13 files changed, 132 insertions(+), 25 deletions(-) rename ui/cypress/support/utils/{ => connect}/ConnectEventSchemaUtils.ts (88%) create mode 100644 ui/cypress/support/utils/datalake/DataLakeBtns.ts diff --git a/ui/cypress/support/utils/connect/ConnectBtns.ts b/ui/cypress/support/utils/connect/ConnectBtns.ts index 0fab8973c0..5b18603a2e 100644 --- a/ui/cypress/support/utils/connect/ConnectBtns.ts +++ b/ui/cypress/support/utils/connect/ConnectBtns.ts @@ -40,6 +40,19 @@ export class ConnectBtns { return cy.dataCy('store-edit-adapter'); } + public static changeRuntimeType() { + return cy.dataCy('connect-change-runtime-type', { timeout: 10000 }); + } + + public static updateAndMigratePipelines() { + return cy.dataCy('btn-update-adapter-migrate-pipelines'); + } + + public static nextBtn() { + return cy.get('button').contains('Next').parent(); + } + + // ===================== Adapter settings btns ========================== public static adapterSettingsStartAdapter() { return cy.dataCy('adapter-settings-start-adapter-btn'); diff --git a/ui/cypress/support/utils/ConnectEventSchemaUtils.ts b/ui/cypress/support/utils/connect/ConnectEventSchemaUtils.ts similarity index 88% rename from ui/cypress/support/utils/ConnectEventSchemaUtils.ts rename to ui/cypress/support/utils/connect/ConnectEventSchemaUtils.ts index 663a42edbf..3d84b50380 100644 --- a/ui/cypress/support/utils/ConnectEventSchemaUtils.ts +++ b/ui/cypress/support/utils/connect/ConnectEventSchemaUtils.ts @@ -1,21 +1,23 @@ /* - * 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 + * 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 + * 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. + * 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 { ConnectBtns } from './ConnectBtns'; + export class ConnectEventSchemaUtils { public static markPropertyAsDimension(propertyName: string) { cy.dataCy('property-scope-' + propertyName, { timeout: 10000 }) @@ -198,7 +200,7 @@ export class ConnectEventSchemaUtils { dataType: string, ) { ConnectEventSchemaUtils.clickEditProperty(propertyName); - cy.dataCy('connect-change-runtime-type') + ConnectBtns.changeRuntimeType() .click() .get('mat-option') .contains(dataType) @@ -208,7 +210,7 @@ export class ConnectEventSchemaUtils { cy.dataCy('edit-' + propertyName, { timeout: 10000 }).click({ force: true, }); - cy.dataCy('connect-change-runtime-type', { timeout: 10000 }).contains( + ConnectBtns.changeRuntimeType().contains( dataType, ); cy.wait(1000); diff --git a/ui/cypress/support/utils/connect/ConnectUtils.ts b/ui/cypress/support/utils/connect/ConnectUtils.ts index 6fe6cfd708..fa30cd01e0 100644 --- a/ui/cypress/support/utils/connect/ConnectUtils.ts +++ b/ui/cypress/support/utils/connect/ConnectUtils.ts @@ -18,7 +18,7 @@ import { StaticPropertyUtils } from '../StaticPropertyUtils'; import { AdapterInput } from '../../model/AdapterInput'; -import { ConnectEventSchemaUtils } from '../ConnectEventSchemaUtils'; +import { ConnectEventSchemaUtils } from './ConnectEventSchemaUtils'; import { DataLakeUtils } from '../datalake/DataLakeUtils'; import { ConnectBtns } from './ConnectBtns'; import { AdapterBuilder } from '../../builder/AdapterBuilder'; @@ -208,6 +208,14 @@ export class ConnectUtils { ); } + public static storeAndStartEditedAdapter() { + ConnectUtils.finishEventSchemaConfiguration(); + ConnectBtns.storeEditAdapter().click(); + ConnectBtns.updateAndMigratePipelines().click(); + ConnectUtils.closeAdapterPreview(); + ConnectBtns.startAdapter().click(); + } + public static deleteAdapterAndAssociatedPipelines(switchUserCheck = false) { // Delete adapter and associated pipelines this.goToConnect(); diff --git a/ui/cypress/support/utils/datalake/DataLakeBtns.ts b/ui/cypress/support/utils/datalake/DataLakeBtns.ts new file mode 100644 index 0000000000..03ab7e1759 --- /dev/null +++ b/ui/cypress/support/utils/datalake/DataLakeBtns.ts @@ -0,0 +1,24 @@ +/* + * 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. + * + */ + +export class DataLakeBtns { + + public static refreshDataLakeMeasures() { + return cy.dataCy('refresh-data-lake-measures'); + } + } diff --git a/ui/cypress/support/utils/datalake/DataLakeUtils.ts b/ui/cypress/support/utils/datalake/DataLakeUtils.ts index 1788212551..064a73b494 100644 --- a/ui/cypress/support/utils/datalake/DataLakeUtils.ts +++ b/ui/cypress/support/utils/datalake/DataLakeUtils.ts @@ -332,4 +332,19 @@ export class DataLakeUtils { return currentDate; } + + + public static waitForCountingResults() { + cy.dataCy('datalake-number-of-events-spinner', { timeout: 10000 }) + .should('exist'); + cy.dataCy('datalake-number-of-events-spinner', { timeout: 10000 }) + .should('not.exist'); + } + + public static getDatalakeNumberOfEvents(): Cypress.Chainable { + return cy.dataCy('datalake-number-of-events', { timeout: 10000 }) + .should('be.visible') + .invoke('text') + .then((text) => text.trim()); + } } diff --git a/ui/cypress/tests/adapter/editAdapter.smoke.spec.ts b/ui/cypress/tests/adapter/editAdapter.smoke.spec.ts index ba8a1f54e0..b346273e24 100644 --- a/ui/cypress/tests/adapter/editAdapter.smoke.spec.ts +++ b/ui/cypress/tests/adapter/editAdapter.smoke.spec.ts @@ -19,15 +19,18 @@ import { ConnectUtils } from '../../support/utils/connect/ConnectUtils'; import { ConnectBtns } from '../../support/utils/connect/ConnectBtns'; import { AdapterBuilder } from '../../support/builder/AdapterBuilder'; +import { ConnectEventSchemaUtils } from '../../support/utils/connect/ConnectEventSchemaUtils'; +import { DataLakeUtils } from '../../support/utils/datalake/DataLakeUtils'; +import { DataLakeBtns } from '../../support/utils/datalake/DataLakeBtns'; describe('Test Edit Adapter', () => { beforeEach('Setup Test', () => { // To set up test add a stream adapter that can be configured cy.initStreamPipesTest(); - ConnectUtils.addMachineDataSimulator('simulator'); }); it('Successfully edit adapter', () => { + ConnectUtils.addMachineDataSimulator('simulator'); const newAdapterName = 'Edited Adapter'; ConnectUtils.goToConnect(); @@ -68,4 +71,44 @@ describe('Test Edit Adapter', () => { cy.dataCy('adapter-name').contains(newAdapterName); cy.get('.sp-dialog-content').contains(newAdapterName); }); + + it('Successfully edit adapter with persistence pipeline', () => { + ConnectUtils.addMachineDataSimulator('simulator', true); + + ConnectUtils.goToConnect(); + + // stop adapter and edit adapter + ConnectBtns.stopAdapter().click(); + ConnectBtns.editAdapter().click(); + + // change data type of density to integer + ConnectBtns.nextBtn().click(); + ConnectEventSchemaUtils.changePropertyDataType('density', 'Integer'); + + ConnectUtils.storeAndStartEditedAdapter(); + + // Validate that the data is further persisted in the database by checking if the amount of events in the data lake changes + DataLakeUtils.goToDatalakeConfiguration(); + + DataLakeUtils.waitForCountingResults(); + + let initialValue; + + DataLakeUtils.getDatalakeNumberOfEvents().then((value) => { + initialValue = value; + }); + + DataLakeBtns.refreshDataLakeMeasures().click(); + + DataLakeUtils.waitForCountingResults(); + + DataLakeUtils.getDatalakeNumberOfEvents().then((newValue) => { + // IMPORTANT: Currently we implemented a workaround by showing the user a warning message when the data type is changed. + // In the future, we need a migration mechanism to automatically change all the StreamPipes resources that are effected + // by the change. Once this is implemented the following line must be changed to .not.equal. + // The issue is tracked here: https://github.com/apache/streampipes/issues/2954 + expect(newValue).equal(initialValue); + }); + + }); }); diff --git a/ui/cypress/tests/adapter/editAdapterSettingsAndPipeline.spec.ts b/ui/cypress/tests/adapter/editAdapterSettingsAndPipeline.spec.ts index 8b63cafac1..da5089a227 100644 --- a/ui/cypress/tests/adapter/editAdapterSettingsAndPipeline.spec.ts +++ b/ui/cypress/tests/adapter/editAdapterSettingsAndPipeline.spec.ts @@ -70,7 +70,7 @@ describe('Test Edit Adapter and Pipeline', () => { cy.dataCy('sp-connect-adapter-edit-warning', { timeout: 60000, }).should('be.visible'); - cy.dataCy('btn-update-adapter-migrate-pipelines').click(); + ConnectBtns.updateAndMigratePipelines().click(); ConnectUtils.closeAdapterPreview(); cy.wait(1000); diff --git a/ui/cypress/tests/adapter/editAdapterValuesAndFields.spec.ts b/ui/cypress/tests/adapter/editAdapterValuesAndFields.spec.ts index 60ce694b21..db78754e74 100644 --- a/ui/cypress/tests/adapter/editAdapterValuesAndFields.spec.ts +++ b/ui/cypress/tests/adapter/editAdapterValuesAndFields.spec.ts @@ -50,7 +50,7 @@ describe('Test Edit Adapter', () => { .clear() .type('http://schema.org/Numbers'); // Change field data type - cy.dataCy('connect-change-runtime-type') + ConnectBtns.changeRuntimeType() .click() .get('mat-option') .contains('Double') @@ -83,7 +83,7 @@ describe('Test Edit Adapter', () => { 'have.value', 'http://schema.org/Numbers', ); - cy.dataCy('connect-change-runtime-type').should( + ConnectBtns.changeRuntimeType().should( 'include.text', 'Double', ); @@ -96,7 +96,7 @@ describe('Test Edit Adapter', () => { // Delete inserted values in edit field cy.dataCy('connect-edit-field-runtime-name').clear(); cy.get('[id="domainproperty"]').clear(); - cy.dataCy('connect-change-runtime-type') + ConnectBtns.changeRuntimeType() .click() .get('mat-option') .contains('Float') diff --git a/ui/cypress/tests/adapter/rules/deleteTransformationRule.spec.ts b/ui/cypress/tests/adapter/rules/deleteTransformationRule.spec.ts index 6ecb38744b..ad558ab8d2 100644 --- a/ui/cypress/tests/adapter/rules/deleteTransformationRule.spec.ts +++ b/ui/cypress/tests/adapter/rules/deleteTransformationRule.spec.ts @@ -17,7 +17,7 @@ */ import { ConnectUtils } from '../../../support/utils/connect/ConnectUtils'; import { FileManagementUtils } from '../../../support/utils/FileManagementUtils'; -import { ConnectEventSchemaUtils } from '../../../support/utils/ConnectEventSchemaUtils'; +import { ConnectEventSchemaUtils } from '../../../support/utils/connect/ConnectEventSchemaUtils'; import { AdapterBuilder } from '../../../support/builder/AdapterBuilder'; import { ConnectBtns } from '../../../support/utils/connect/ConnectBtns'; diff --git a/ui/cypress/tests/adapter/rules/schemaRules.smoke.spec.ts b/ui/cypress/tests/adapter/rules/schemaRules.smoke.spec.ts index 39462cfc06..1aa4d14ce6 100644 --- a/ui/cypress/tests/adapter/rules/schemaRules.smoke.spec.ts +++ b/ui/cypress/tests/adapter/rules/schemaRules.smoke.spec.ts @@ -18,7 +18,7 @@ import { ConnectUtils } from '../../../support/utils/connect/ConnectUtils'; import { FileManagementUtils } from '../../../support/utils/FileManagementUtils'; -import { ConnectEventSchemaUtils } from '../../../support/utils/ConnectEventSchemaUtils'; +import { ConnectEventSchemaUtils } from '../../../support/utils/connect/ConnectEventSchemaUtils'; describe('Connect schema rule transformations', () => { beforeEach('Setup Test', () => { diff --git a/ui/cypress/tests/adapter/rules/streamRules.spec.ts b/ui/cypress/tests/adapter/rules/streamRules.spec.ts index dbfab9dab7..bf9f946a59 100644 --- a/ui/cypress/tests/adapter/rules/streamRules.spec.ts +++ b/ui/cypress/tests/adapter/rules/streamRules.spec.ts @@ -18,7 +18,7 @@ import { ConnectUtils } from '../../../support/utils/connect/ConnectUtils'; import { FileManagementUtils } from '../../../support/utils/FileManagementUtils'; -import { ConnectEventSchemaUtils } from '../../../support/utils/ConnectEventSchemaUtils'; +import { ConnectEventSchemaUtils } from '../../../support/utils/connect/ConnectEventSchemaUtils'; describe('Connect aggregation rule transformations', () => { beforeEach('Setup Test', () => { diff --git a/ui/cypress/tests/adapter/rules/valueRules.ts b/ui/cypress/tests/adapter/rules/valueRules.ts index 60ffdbf21a..2163f454d2 100644 --- a/ui/cypress/tests/adapter/rules/valueRules.ts +++ b/ui/cypress/tests/adapter/rules/valueRules.ts @@ -18,7 +18,7 @@ import { ConnectUtils } from '../../../support/utils/connect/ConnectUtils'; import { FileManagementUtils } from '../../../support/utils/FileManagementUtils'; -import { ConnectEventSchemaUtils } from '../../../support/utils/ConnectEventSchemaUtils'; +import { ConnectEventSchemaUtils } from '../../../support/utils/connect/ConnectEventSchemaUtils'; describe('Connect value rule transformations', () => { beforeEach('Setup Test', () => { diff --git a/ui/src/app/configuration/datalake-configuration/datalake-configuration.component.html b/ui/src/app/configuration/datalake-configuration/datalake-configuration.component.html index b202b2955f..91227a143c 100644 --- a/ui/src/app/configuration/datalake-configuration/datalake-configuration.component.html +++ b/ui/src/app/configuration/datalake-configuration/datalake-configuration.component.html @@ -36,7 +36,8 @@