This is an automated email from the ASF dual-hosted git repository.
SvenO3 pushed a commit to branch
4430-chart-settings-not-correctly-migrated-after-event-schema-changes
in repository https://gitbox.apache.org/repos/asf/streampipes.git
The following commit(s) were added to
refs/heads/4430-chart-settings-not-correctly-migrated-after-event-schema-changes
by this push:
new 150ef6a556 Add unit tests
150ef6a556 is described below
commit 150ef6a5563150a8eb1755fdca4ae003f5878861
Author: Sven Oehler <[email protected]>
AuthorDate: Wed May 13 18:10:15 2026 +0200
Add unit tests
---
.../DataExplorerSchemaManagementTest.java | 24 +-
.../update/ChartSchemaUpdateCoordinatorTest.java | 280 +++++++++++++++++++++
.../update/PipelineUpdateCoordinatorTest.java | 36 ++-
3 files changed, 328 insertions(+), 12 deletions(-)
diff --git
a/streampipes-data-explorer/src/test/java/org/apache/streampipes/dataexplorer/DataExplorerSchemaManagementTest.java
b/streampipes-data-explorer/src/test/java/org/apache/streampipes/dataexplorer/DataExplorerSchemaManagementTest.java
index 0dbecba6f5..582b0579e5 100644
---
a/streampipes-data-explorer/src/test/java/org/apache/streampipes/dataexplorer/DataExplorerSchemaManagementTest.java
+++
b/streampipes-data-explorer/src/test/java/org/apache/streampipes/dataexplorer/DataExplorerSchemaManagementTest.java
@@ -19,6 +19,7 @@
package org.apache.streampipes.dataexplorer;
import org.apache.streampipes.manager.permission.DataLakePermissionManager;
+import
org.apache.streampipes.manager.pipeline.update.ChartSchemaUpdateCoordinator;
import org.apache.streampipes.model.datalake.DataLakeMeasure;
import
org.apache.streampipes.model.datalake.DataLakeMeasureSchemaUpdateStrategy;
import org.apache.streampipes.model.schema.EventProperty;
@@ -51,12 +52,14 @@ public class DataExplorerSchemaManagementTest {
private CRUDStorage<DataLakeMeasure> dataLakeStorageMock;
private DataLakePermissionManager permissionManagerMock;
+ private ChartSchemaUpdateCoordinator chartSchemaUpdateCoordinator;
@BeforeEach
public void setUp() {
dataLakeStorageMock = mock(CRUDStorage.class);
IPermissionStorage permissionStorageMock = mock(IPermissionStorage.class);
this.permissionManagerMock = new
DataLakePermissionManager(permissionStorageMock);
+ this.chartSchemaUpdateCoordinator =
mock(ChartSchemaUpdateCoordinator.class);
}
@Test
@@ -64,7 +67,8 @@ public class DataExplorerSchemaManagementTest {
when(dataLakeStorageMock.findAll()).thenReturn(List.of());
var schemaManagement = new DataExplorerSchemaManagement(
dataLakeStorageMock,
- permissionManagerMock
+ permissionManagerMock,
+ chartSchemaUpdateCoordinator
);
var oldMeasure = getSampleMeasure(
@@ -91,7 +95,11 @@ public class DataExplorerSchemaManagementTest {
when(dataLakeStorageMock.findAll()).thenReturn(List.of(oldMeasure));
when(dataLakeStorageMock.getElementById(any())).thenReturn(oldMeasure);
- var schemaManagement = new
DataExplorerSchemaManagement(dataLakeStorageMock, permissionManagerMock);
+ var schemaManagement = new DataExplorerSchemaManagement(
+ dataLakeStorageMock,
+ permissionManagerMock,
+ chartSchemaUpdateCoordinator
+ );
var newMeasure =
getNewMeasure(DataLakeMeasureSchemaUpdateStrategy.UPDATE_SCHEMA);
@@ -117,7 +125,11 @@ public class DataExplorerSchemaManagementTest {
);
when(dataLakeStorageMock.findAll()).thenReturn(List.of(oldMeasure));
when(dataLakeStorageMock.getElementById(any())).thenReturn(oldMeasure);
- var schemaManagement = new
DataExplorerSchemaManagement(dataLakeStorageMock, permissionManagerMock);
+ var schemaManagement = new DataExplorerSchemaManagement(
+ dataLakeStorageMock,
+ permissionManagerMock,
+ chartSchemaUpdateCoordinator
+ );
var newMeasure =
getNewMeasure(DataLakeMeasureSchemaUpdateStrategy.EXTEND_EXISTING_SCHEMA);
var resultMeasure =
schemaManagement.createOrUpdateMeasurement(newMeasure,null);
@@ -142,7 +154,11 @@ public class DataExplorerSchemaManagementTest {
when(dataLakeStorageMock.findAll()).thenReturn(List.of(oldMeasure));
when(dataLakeStorageMock.getElementById(any())).thenReturn(oldMeasure);
- var schemaManagement = new
DataExplorerSchemaManagement(dataLakeStorageMock, permissionManagerMock);
+ var schemaManagement = new DataExplorerSchemaManagement(
+ dataLakeStorageMock,
+ permissionManagerMock,
+ chartSchemaUpdateCoordinator
+ );
var newMeasure =
getNewMeasure(DataLakeMeasureSchemaUpdateStrategy.EXTEND_EXISTING_SCHEMA);
diff --git
a/streampipes-pipeline-management/src/test/java/org/apache/streampipes/manager/pipeline/update/ChartSchemaUpdateCoordinatorTest.java
b/streampipes-pipeline-management/src/test/java/org/apache/streampipes/manager/pipeline/update/ChartSchemaUpdateCoordinatorTest.java
new file mode 100644
index 0000000000..32d6afbab7
--- /dev/null
+++
b/streampipes-pipeline-management/src/test/java/org/apache/streampipes/manager/pipeline/update/ChartSchemaUpdateCoordinatorTest.java
@@ -0,0 +1,280 @@
+/*
+ * 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.
+ *
+ */
+
+package org.apache.streampipes.manager.pipeline.update;
+
+import org.apache.streampipes.model.datalake.DataExplorerWidgetHealthStatus;
+import org.apache.streampipes.model.datalake.DataExplorerWidgetModel;
+import org.apache.streampipes.model.datalake.DataLakeMeasure;
+import org.apache.streampipes.model.graph.DataSinkInvocation;
+import org.apache.streampipes.model.pipeline.Pipeline;
+import org.apache.streampipes.model.schema.EventProperty;
+import org.apache.streampipes.model.schema.EventPropertyPrimitive;
+import org.apache.streampipes.model.schema.EventSchema;
+import org.apache.streampipes.model.staticproperty.FreeTextStaticProperty;
+import org.apache.streampipes.serializers.json.JacksonSerializer;
+import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
+import org.apache.streampipes.vocabulary.XSD;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.jupiter.api.Test;
+
+import java.net.URI;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+class ChartSchemaUpdateCoordinatorTest {
+
+ private static final String DATA_LAKE_SINK_APP_ID =
"org.apache.streampipes.sinks.internal.jvm.datalake";
+ private static final String DATA_LAKE_MEASUREMENT_FIELD = "db_measurement";
+ private static final String MEASURE_NAME = "measure";
+ private static final ObjectMapper OBJECT_MAPPER =
JacksonSerializer.getObjectMapper();
+ private static final TypeReference<Map<String, Object>> MAP_TYPE = new
TypeReference<>() {
+ };
+
+ @Test
+ void
makeUpdateInfo_ShouldSkipChartWhenAddedFieldsDoNotRemoveReferencedFields() {
+ var widget = makeWidget(selectedField("temperature"));
+ var updatedSchema = makeSchema(
+ property("temperature", XSD.INTEGER),
+ property("humidity", XSD.FLOAT)
+ );
+
+ var updateInfo = makeCoordinator().makeUpdateInfo(widget,
Set.of(MEASURE_NAME), updatedSchema);
+
+ assertTrue(updateInfo.isEmpty());
+ }
+
+ @Test
+ void makeUpdateInfo_ShouldSkipChartWhenRemovedFieldIsNotReferenced() {
+ var widget = makeWidget(selectedField("temperature"),
unselectedField("humidity"));
+ var updatedSchema = makeSchema(property("temperature", XSD.INTEGER));
+
+ var updateInfo = makeCoordinator().makeUpdateInfo(widget,
Set.of(MEASURE_NAME), updatedSchema);
+
+ assertTrue(updateInfo.isEmpty());
+ }
+
+ @Test
+ void makeUpdateInfo_ShouldRequireAttentionWhenSelectedQueryFieldWasRemoved()
{
+ var widget = makeWidget(selectedField("temperature"));
+ var updatedSchema = makeSchema();
+
+ var updateInfo = makeCoordinator().makeUpdateInfo(widget,
Set.of(MEASURE_NAME), updatedSchema).orElseThrow();
+
+ assertFalse(updateInfo.isCanAutoMigrate());
+ assertTrue(updateInfo.getAffectedFields().contains("temperature"));
+ }
+
+ @Test
+ void makeUpdateInfo_ShouldSkipChartWhenVisualizationFieldWasRemoved() {
+ var widget = makeWidget();
+ widget.setVisualizationConfig(Map.of(
+ "firstField",
+ Map.of("runtimeName", "temperature", "fullDbName", "temperature")
+ ));
+ var updatedSchema = makeSchema();
+
+ var updateInfo = makeCoordinator().makeUpdateInfo(widget,
Set.of(MEASURE_NAME), updatedSchema);
+
+ assertTrue(updateInfo.isEmpty());
+ }
+
+ @Test
+ void makeUpdateInfo_ShouldSkipChartForReferencedTypeChanges() {
+ var widget = makeWidget(selectedField("temperature"));
+ var updatedSchema = makeSchema(property("temperature", XSD.STRING));
+
+ var updateInfo = makeCoordinator().makeUpdateInfo(widget,
Set.of(MEASURE_NAME), updatedSchema);
+
+ assertTrue(updateInfo.isEmpty());
+ }
+
+ @Test
+ void
updateCharts_ShouldUpdateMeasureSchemaWhenOnlyUnreferencedFieldWasRemoved() {
+ var widgetStorage = mock(IDataExplorerWidgetStorage.class);
+ var coordinator = new ChartSchemaUpdateCoordinator(widgetStorage);
+ var widget = makeWidget(selectedField("temperature"),
unselectedField("humidity"));
+ var pipeline = makePipeline(MEASURE_NAME);
+ var updatedSchema = makeSchema(property("temperature", XSD.INTEGER));
+ when(widgetStorage.findAll()).thenReturn(List.of(widget));
+
+ coordinator.updateCharts(pipeline, updatedSchema);
+
+ var eventProperties = getMeasureEventProperties(widget);
+ assertEquals(1, eventProperties.size());
+ assertEquals("temperature", eventProperties.get(0).get("runtimeName"));
+ verify(widgetStorage).updateElement(widget);
+ }
+
+ @Test
+ void
updateCharts_ShouldMarkWidgetAsRequiresAttentionWhenReferencedFieldWasRemoved()
{
+ var widgetStorage = mock(IDataExplorerWidgetStorage.class);
+ var coordinator = new ChartSchemaUpdateCoordinator(widgetStorage);
+ var widget = makeWidget(selectedField("temperature"));
+ var pipeline = makePipeline(MEASURE_NAME);
+ when(widgetStorage.findAll()).thenReturn(List.of(widget));
+
+ coordinator.updateCharts(pipeline, makeSchema());
+
+ assertTrue(getMeasureEventProperties(widget).isEmpty());
+ assertEquals(DataExplorerWidgetHealthStatus.REQUIRES_ATTENTION,
widget.getHealthStatus());
+ assertEquals(
+ List.of("temperature"),
+ widget.getAffectedSchemaUpdateFields()
+ );
+ verify(widgetStorage).updateElement(widget);
+ }
+
+ @Test
+ void updateCharts_ShouldUpdateAllMatchingSourceConfigs() {
+ var widgetStorage = mock(IDataExplorerWidgetStorage.class);
+ var coordinator = new ChartSchemaUpdateCoordinator(widgetStorage);
+ var widget = makeWidget(MEASURE_NAME, selectedField("temperature"));
+ var secondSourceConfig = new HashMap<String, Object>();
+ secondSourceConfig.put("measureName", MEASURE_NAME);
+ secondSourceConfig.put("queryConfig", Map.of("fields", List.of()));
+ secondSourceConfig.put("measure", makeMeasure(makeSchema(property("old",
XSD.INTEGER))));
+ var sourceConfigs = new java.util.ArrayList<>(getSourceConfigs(widget));
+ sourceConfigs.add(secondSourceConfig);
+ widget.setDataConfig(Map.of("sourceConfigs", sourceConfigs));
+ var pipeline = makePipeline(MEASURE_NAME);
+ var updatedSchema = makeSchema(property("temperature", XSD.INTEGER));
+ when(widgetStorage.findAll()).thenReturn(List.of(widget));
+
+ coordinator.updateCharts(pipeline, updatedSchema);
+
+ assertEquals("temperature",
getMeasureEventProperties(widget).get(0).get("runtimeName"));
+ assertEquals(
+ "temperature",
+ getMeasureEventProperties(secondSourceConfig).get(0).get("runtimeName")
+ );
+ verify(widgetStorage).updateElement(widget);
+ }
+
+ @Test
+ void updateCharts_ShouldOnlyCheckWidgetsWithMatchingMeasureName() {
+ var widgetStorage = mock(IDataExplorerWidgetStorage.class);
+ var coordinator = new ChartSchemaUpdateCoordinator(widgetStorage);
+ var unrelatedWidget = makeWidget("other-measure",
selectedField("temperature"));
+ var pipeline = makePipeline(MEASURE_NAME);
+ when(widgetStorage.findAll()).thenReturn(List.of(unrelatedWidget));
+
+ coordinator.updateCharts(pipeline, makeSchema());
+
+ verify(widgetStorage, never()).updateElement(unrelatedWidget);
+ }
+
+ private ChartSchemaUpdateCoordinator makeCoordinator() {
+ return new
ChartSchemaUpdateCoordinator(mock(IDataExplorerWidgetStorage.class));
+ }
+
+ private DataExplorerWidgetModel makeWidget(Map<String, Object>...
fieldConfigs) {
+ return makeWidget(MEASURE_NAME, fieldConfigs);
+ }
+
+ private DataExplorerWidgetModel makeWidget(String measureName,
+ Map<String, Object>...
fieldConfigs) {
+ var widget = new DataExplorerWidgetModel();
+ widget.setElementId("chart-1");
+ widget.setBaseAppearanceConfig(Map.of("widgetTitle", "Chart"));
+ widget.setVisualizationConfig(new HashMap<>());
+
+ var queryConfig = new HashMap<String, Object>();
+ queryConfig.put("fields", List.of(fieldConfigs));
+ queryConfig.put("groupBy", List.of());
+ queryConfig.put("selectedFilters", List.of());
+
+ var sourceConfig = new HashMap<String, Object>();
+ sourceConfig.put("measureName", measureName);
+ sourceConfig.put("queryConfig", queryConfig);
+ sourceConfig.put("measure", makeMeasure(makeSchema(property("temperature",
XSD.INTEGER))));
+
+ widget.setDataConfig(Map.of("sourceConfigs", List.of(sourceConfig)));
+ return widget;
+ }
+
+ private Map<String, Object> makeMeasure(EventSchema eventSchema) {
+ var measure = new DataLakeMeasure(MEASURE_NAME, "s0::timestamp",
eventSchema);
+ measure.setSchemaVersion(DataLakeMeasure.CURRENT_SCHEMA_VERSION);
+ return OBJECT_MAPPER.convertValue(measure, MAP_TYPE);
+ }
+
+ @SuppressWarnings("unchecked")
+ private List<Map<String, Object>> getSourceConfigs(DataExplorerWidgetModel
widget) {
+ return (List<Map<String, Object>>)
widget.getDataConfig().get("sourceConfigs");
+ }
+
+ @SuppressWarnings("unchecked")
+ private List<Map<String, Object>>
getMeasureEventProperties(DataExplorerWidgetModel widget) {
+ return getMeasureEventProperties(getSourceConfigs(widget).get(0));
+ }
+
+ @SuppressWarnings("unchecked")
+ private List<Map<String, Object>> getMeasureEventProperties(Map<String,
Object> sourceConfig) {
+ var measure = (Map<String, Object>) sourceConfig.get("measure");
+ var eventSchema = (Map<String, Object>) measure.get("eventSchema");
+ return (List<Map<String, Object>>) eventSchema.get("eventProperties");
+ }
+
+ private Map<String, Object> selectedField(String runtimeName) {
+ var fieldConfig = new HashMap<String, Object>();
+ fieldConfig.put("runtimeName", runtimeName);
+ fieldConfig.put("selected", true);
+ return fieldConfig;
+ }
+
+ private Map<String, Object> unselectedField(String runtimeName) {
+ var fieldConfig = new HashMap<String, Object>();
+ fieldConfig.put("runtimeName", runtimeName);
+ fieldConfig.put("selected", false);
+ return fieldConfig;
+ }
+
+ private Pipeline makePipeline(String measureName) {
+ var pipeline = new Pipeline();
+ var sink = new DataSinkInvocation();
+ sink.setAppId(DATA_LAKE_SINK_APP_ID);
+
sink.setStaticProperties(List.of(FreeTextStaticProperty.of(DATA_LAKE_MEASUREMENT_FIELD,
measureName)));
+ pipeline.setActions(List.of(sink));
+ return pipeline;
+ }
+
+ private EventSchema makeSchema(EventProperty... properties) {
+ return new EventSchema(List.of(properties));
+ }
+
+ private EventPropertyPrimitive property(String runtimeName,
+ URI runtimeType) {
+ var property = new EventPropertyPrimitive();
+ property.setRuntimeName(runtimeName);
+ property.setRuntimeType(runtimeType.toString());
+ return property;
+ }
+}
diff --git
a/streampipes-pipeline-management/src/test/java/org/apache/streampipes/manager/pipeline/update/PipelineUpdateCoordinatorTest.java
b/streampipes-pipeline-management/src/test/java/org/apache/streampipes/manager/pipeline/update/PipelineUpdateCoordinatorTest.java
index e15511347e..53198ea66a 100644
---
a/streampipes-pipeline-management/src/test/java/org/apache/streampipes/manager/pipeline/update/PipelineUpdateCoordinatorTest.java
+++
b/streampipes-pipeline-management/src/test/java/org/apache/streampipes/manager/pipeline/update/PipelineUpdateCoordinatorTest.java
@@ -25,6 +25,7 @@ import
org.apache.streampipes.manager.matching.v2.pipeline.MeasurementChangeVali
import org.apache.streampipes.manager.pipeline.PipelineManager;
import org.apache.streampipes.model.SpDataStream;
import org.apache.streampipes.model.connect.adapter.AdapterDescription;
+import org.apache.streampipes.model.connect.adapter.ChartSchemaUpdateInfo;
import org.apache.streampipes.model.connect.adapter.PipelineUpdateInfo;
import org.apache.streampipes.model.graph.DataProcessorInvocation;
import org.apache.streampipes.model.graph.DataSinkInvocation;
@@ -59,6 +60,7 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mockConstruction;
import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;
class PipelineUpdateCoordinatorTest {
@@ -68,7 +70,8 @@ class PipelineUpdateCoordinatorTest {
@Test
void updatePipelines_ShouldRestartRunningPipelinesForDataStreamUpdates() {
var requestManager = mock(ExtensionServiceRequestManager.class);
- var coordinator = new PipelineUpdateCoordinator(requestManager);
+ var chartSchemaUpdateCoordinator =
mock(ChartSchemaUpdateCoordinator.class);
+ var coordinator = new PipelineUpdateCoordinator(requestManager,
chartSchemaUpdateCoordinator);
var dataStream = makeDataStream("stream-1", "Updated stream");
var affectedPipeline = makePipeline("pipeline-1", "Pipeline", true,
"stream-1", "Old stream");
var storedPipeline = makePipeline("pipeline-1", "Pipeline", true,
"stream-1", "Old stream");
@@ -111,13 +114,15 @@ class PipelineUpdateCoordinatorTest {
verify(executorConstruction.constructed().get(1)).startPipeline();
assertEquals(1, storageManagerConstruction.constructed().size());
verify(pipelineStorage).updateElement(modifiedPipeline);
+ verifyNoInteractions(chartSchemaUpdateCoordinator);
}
}
@Test
void
updatePipelines_ShouldMarkPipelinesRequiringAttentionForAdapterUpdates() {
var requestManager = mock(ExtensionServiceRequestManager.class);
- var coordinator = new PipelineUpdateCoordinator(requestManager);
+ var chartSchemaUpdateCoordinator =
mock(ChartSchemaUpdateCoordinator.class);
+ var coordinator = new PipelineUpdateCoordinator(requestManager,
chartSchemaUpdateCoordinator);
var adapterDescription = makeAdapter("stream-1", "Updated adapter");
var storedPipeline = makePipeline("pipeline-1", "Pipeline", false,
"stream-1", "Old stream");
var modifiedPipeline = makePipeline("pipeline-1", "Pipeline", false,
"stream-1", "Updated adapter");
@@ -170,7 +175,8 @@ class PipelineUpdateCoordinatorTest {
@Test
void
updatePipelines_ShouldMarkPipelineRequiringAttentionForCriticalMeasurementFieldChange()
{
var requestManager = mock(ExtensionServiceRequestManager.class);
- var coordinator = new PipelineUpdateCoordinator(requestManager);
+ var chartSchemaUpdateCoordinator =
mock(ChartSchemaUpdateCoordinator.class);
+ var coordinator = new PipelineUpdateCoordinator(requestManager,
chartSchemaUpdateCoordinator);
var adapterDescription = makeAdapter("stream-1", "Updated adapter");
adapterDescription.getDataStream().setEventSchema(makeSchema(makeMeasurementProperty("temperature",
XSD.STRING)));
@@ -220,21 +226,27 @@ class PipelineUpdateCoordinatorTest {
@Test
void checkPipelineMigrations_ShouldUseUpdatedDataStreamValues() {
var requestManager = mock(ExtensionServiceRequestManager.class);
- var coordinator = new PipelineUpdateCoordinator(requestManager);
+ var chartSchemaUpdateCoordinator =
mock(ChartSchemaUpdateCoordinator.class);
+ var coordinator = new PipelineUpdateCoordinator(requestManager,
chartSchemaUpdateCoordinator);
var dataStream = makeDataStream("stream-1", "Updated stream");
var pipeline = makePipeline("pipeline-1", "Pipeline", false, "stream-1",
"Old stream");
var modificationMessage = new
PipelineModificationMessage(List.of(validModification("sepa-1")));
var verifiedPipelines = new ArrayList<Pipeline>();
+ var chartUpdateInfo = new ChartSchemaUpdateInfo();
try (MockedStatic<PipelineManager> pipelineManager =
mockStatic(PipelineManager.class);
MockedConstruction<PipelineVerificationHandlerV2>
verificationHandlerConstruction =
mockConstruction(PipelineVerificationHandlerV2.class, (mock,
context) -> {
verifiedPipelines.add((Pipeline) context.arguments().get(0));
when(mock.verifyPipeline()).thenReturn(modificationMessage);
+ when(mock.makeModifiedPipeline(modificationMessage))
+ .thenReturn(new PipelineModificationResult((Pipeline)
context.arguments().get(0), List.of()));
})) {
pipelineManager.when(() ->
PipelineManager.getPipelinesContainingElements("stream-1"))
.thenReturn(List.of(pipeline));
+ when(chartSchemaUpdateCoordinator.checkChartMigrations(pipeline,
dataStream.getEventSchema()))
+ .thenReturn(List.of(chartUpdateInfo));
var result = coordinator.checkPipelineMigrations(dataStream);
@@ -242,6 +254,7 @@ class PipelineUpdateCoordinatorTest {
assertEquals("pipeline-1", result.get(0).getPipelineId());
assertEquals("Pipeline", result.get(0).getPipelineName());
assertTrue(result.get(0).isCanAutoMigrate());
+ assertEquals(List.of(chartUpdateInfo),
result.get(0).getChartSchemaUpdateInfos());
assertEquals(1, verificationHandlerConstruction.constructed().size());
var updatedPipeline = verifiedPipelines.get(0);
@@ -253,7 +266,8 @@ class PipelineUpdateCoordinatorTest {
@Test
void checkPipelineMigrations_ShouldReportWarningsForAdapterUpdates() {
var requestManager = mock(ExtensionServiceRequestManager.class);
- var coordinator = new PipelineUpdateCoordinator(requestManager);
+ var chartSchemaUpdateCoordinator =
mock(ChartSchemaUpdateCoordinator.class);
+ var coordinator = new PipelineUpdateCoordinator(requestManager,
chartSchemaUpdateCoordinator);
var adapterDescription = makeAdapter("stream-1", "Updated adapter");
var pipeline = makePipeline("pipeline-1", "Pipeline", false, "stream-1",
"Old stream");
pipeline.setSepas(List.of(makeSepa("sepa-1", "Processor")));
@@ -266,6 +280,8 @@ class PipelineUpdateCoordinatorTest {
mockConstruction(PipelineVerificationHandlerV2.class, (mock,
context) -> {
verifiedPipelines.add((Pipeline) context.arguments().get(0));
when(mock.verifyPipeline()).thenReturn(modificationMessage);
+ when(mock.makeModifiedPipeline(modificationMessage))
+ .thenReturn(new PipelineModificationResult((Pipeline)
context.arguments().get(0), List.of()));
})) {
pipelineManager.when(() ->
PipelineManager.getPipelinesContainingElements("stream-1"))
@@ -289,7 +305,8 @@ class PipelineUpdateCoordinatorTest {
@Test
void
checkPipelineMigrations_ShouldDisableAutoMigrationForCriticalMeasurementFieldChange()
{
var requestManager = mock(ExtensionServiceRequestManager.class);
- var coordinator = new PipelineUpdateCoordinator(requestManager);
+ var chartSchemaUpdateCoordinator =
mock(ChartSchemaUpdateCoordinator.class);
+ var coordinator = new PipelineUpdateCoordinator(requestManager,
chartSchemaUpdateCoordinator);
var adapterDescription = makeAdapter("stream-1", "Updated adapter");
adapterDescription.getDataStream().setEventSchema(makeSchema(makeMeasurementProperty("temperature",
XSD.STRING)));
@@ -303,8 +320,11 @@ class PipelineUpdateCoordinatorTest {
try (MockedStatic<PipelineManager> pipelineManager =
mockStatic(PipelineManager.class);
MockedConstruction<PipelineVerificationHandlerV2>
verificationHandlerConstruction =
- mockConstruction(PipelineVerificationHandlerV2.class, (mock,
context) ->
- when(mock.verifyPipeline()).thenReturn(modificationMessage)))
{
+ mockConstruction(PipelineVerificationHandlerV2.class, (mock,
context) -> {
+ when(mock.verifyPipeline()).thenReturn(modificationMessage);
+ when(mock.makeModifiedPipeline(modificationMessage))
+ .thenReturn(new PipelineModificationResult((Pipeline)
context.arguments().get(0), List.of()));
+ })) {
pipelineManager.when(() ->
PipelineManager.getPipelinesContainingElements("stream-1"))
.thenReturn(List.of(pipeline));