From 958c15eb5a6e289d16a290e99fa906e2fcd8cf11 Mon Sep 17 00:00:00 2001 From: Vishal Boinapalli Date: Wed, 19 Jul 2023 14:20:24 -0700 Subject: [PATCH] Translate Processor - Added file_path functionality for local files (#3034) * Changed target_type option name to type Signed-off-by: Vishal Boinapalli * Added file_path functionality for local file Signed-off-by: Vishal Boinapalli * Fixed file parsing issue and changed error msgs Signed-off-by: Vishal Boinapalli * Added IOException to log, made testcase change for mappings validation Signed-off-by: Vishal Boinapalli --------- Signed-off-by: Vishal Boinapalli --- .../processor/translate/FilePathParser.java | 60 +++++++++ .../translate/MappingsParameterConfig.java | 36 ++++-- .../translate/TargetsParameterConfig.java | 8 +- .../translate/TranslateProcessor.java | 13 +- .../translate/TranslateProcessorConfig.java | 55 +++++++- .../MappingsParameterConfigTest.java | 10 ++ .../TranslateProcessorConfigTest.java | 61 +++++++++ .../translate/TranslateProcessorTest.java | 117 ++++++++++++++++++ 8 files changed, 339 insertions(+), 21 deletions(-) create mode 100644 data-prepper-plugins/translate-processor/src/main/java/org/opensearch/dataprepper/plugins/processor/translate/FilePathParser.java diff --git a/data-prepper-plugins/translate-processor/src/main/java/org/opensearch/dataprepper/plugins/processor/translate/FilePathParser.java b/data-prepper-plugins/translate-processor/src/main/java/org/opensearch/dataprepper/plugins/processor/translate/FilePathParser.java new file mode 100644 index 0000000000..210873acfc --- /dev/null +++ b/data-prepper-plugins/translate-processor/src/main/java/org/opensearch/dataprepper/plugins/processor/translate/FilePathParser.java @@ -0,0 +1,60 @@ +package org.opensearch.dataprepper.plugins.processor.translate; + +import com.fasterxml.jackson.annotation.JsonProperty; +import jakarta.validation.Valid; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +public class FilePathParser { + @JsonProperty("mappings") + @Valid + private List fileMappingConfigs; + + public Optional> getCombinedMappings(List mappingConfigs) { + if(Objects.isNull(mappingConfigs) || mappingConfigs.isEmpty()){ + return Optional.ofNullable(fileMappingConfigs); + } + try{ + for (MappingsParameterConfig fileMappingConfig : fileMappingConfigs) { + boolean isDuplicateSource = false; + for (MappingsParameterConfig mappingConfig : mappingConfigs) { + if (mappingConfig.getSource().equals(fileMappingConfig.getSource())) { + isDuplicateSource = true; + combineTargets(fileMappingConfig, mappingConfig); + } + } + if (!isDuplicateSource) { + mappingConfigs.add(fileMappingConfig); + } + } + return Optional.of(mappingConfigs); + } catch (Exception ex){ + return Optional.empty(); + } + } + + private void combineTargets(MappingsParameterConfig filePathMapping, MappingsParameterConfig mappingConfig) { + if(Objects.isNull(mappingConfig)){ + return; + } + List fileTargetConfigs = filePathMapping.getTargetsParameterConfigs(); + List mappingsTargetConfigs = mappingConfig.getTargetsParameterConfigs(); + List combinedTargetConfigs = new ArrayList<>(mappingsTargetConfigs); + + for (TargetsParameterConfig fileTargetConfig : fileTargetConfigs) { + if (!isTargetPresent(fileTargetConfig, combinedTargetConfigs)) { + combinedTargetConfigs.add(fileTargetConfig); + } + } + mappingConfig.setTargetsParameterConfigs(combinedTargetConfigs); + } + + private boolean isTargetPresent(TargetsParameterConfig fileTargetConfig, List combinedTargetConfigs){ + String fileTarget = fileTargetConfig.getTarget(); + return combinedTargetConfigs.stream().anyMatch(targetConfig -> fileTarget.equals(targetConfig.getTarget())); + } + +} diff --git a/data-prepper-plugins/translate-processor/src/main/java/org/opensearch/dataprepper/plugins/processor/translate/MappingsParameterConfig.java b/data-prepper-plugins/translate-processor/src/main/java/org/opensearch/dataprepper/plugins/processor/translate/MappingsParameterConfig.java index 25c225188e..064a673f3a 100644 --- a/data-prepper-plugins/translate-processor/src/main/java/org/opensearch/dataprepper/plugins/processor/translate/MappingsParameterConfig.java +++ b/data-prepper-plugins/translate-processor/src/main/java/org/opensearch/dataprepper/plugins/processor/translate/MappingsParameterConfig.java @@ -1,10 +1,13 @@ package org.opensearch.dataprepper.plugins.processor.translate; import com.fasterxml.jackson.annotation.JsonProperty; +import jakarta.validation.Valid; import jakarta.validation.constraints.AssertTrue; import jakarta.validation.constraints.NotNull; +import java.util.ArrayList; import java.util.List; +import java.util.Objects; public class MappingsParameterConfig { @@ -16,9 +19,8 @@ public class MappingsParameterConfig { private String iterateOn; @JsonProperty("targets") - @NotNull - private List targetsParameterConfigs; - + @Valid + private List targetsParameterConfigs = new ArrayList<>(); public Object getSource() { return source; @@ -32,14 +34,21 @@ public List getTargetsParameterConfigs() { return targetsParameterConfigs; } - public void parseMappings(){ - for(TargetsParameterConfig targetsParameterConfig: targetsParameterConfigs){ - targetsParameterConfig.parseMappings(); - } + @AssertTrue(message = "source option not configured") + public boolean isSourcePresent(){ + return Objects.nonNull(source); + } + + @AssertTrue(message = "targets option not configured") + public boolean isTargetsPresent(){ + return Objects.nonNull(targetsParameterConfigs) && !targetsParameterConfigs.isEmpty(); } @AssertTrue(message = "source field must be a string or list of strings") public boolean isSourceFieldValid() { + if(Objects.isNull(source)){ + return true; + } if (source instanceof String) { return true; } @@ -50,4 +59,17 @@ public boolean isSourceFieldValid() { return false; } + public void parseMappings(){ + if(Objects.isNull(targetsParameterConfigs)){ + return; + } + for(TargetsParameterConfig targetsParameterConfig: targetsParameterConfigs){ + targetsParameterConfig.parseMappings(); + } + } + + public void setTargetsParameterConfigs(List targetsParameterConfigs){ + this.targetsParameterConfigs = targetsParameterConfigs; + } + } diff --git a/data-prepper-plugins/translate-processor/src/main/java/org/opensearch/dataprepper/plugins/processor/translate/TargetsParameterConfig.java b/data-prepper-plugins/translate-processor/src/main/java/org/opensearch/dataprepper/plugins/processor/translate/TargetsParameterConfig.java index 523ae1e606..53a250ee37 100644 --- a/data-prepper-plugins/translate-processor/src/main/java/org/opensearch/dataprepper/plugins/processor/translate/TargetsParameterConfig.java +++ b/data-prepper-plugins/translate-processor/src/main/java/org/opensearch/dataprepper/plugins/processor/translate/TargetsParameterConfig.java @@ -33,9 +33,12 @@ public class TargetsParameterConfig { private RegexParameterConfiguration regexParameterConfig; @JsonProperty("default") private String defaultValue; - @JsonProperty("target_type") + @JsonProperty("type") private TargetType targetType = TargetType.STRING; + public TargetsParameterConfig(){ + converter = TargetType.STRING.getTargetConverter(); + } public TargetsParameterConfig(Map map, String target, RegexParameterConfiguration regexParameterConfig, String translateWhen, String defaultValue, TargetType targetType) { this.targetType = Optional .ofNullable(targetType) @@ -102,6 +105,9 @@ public boolean hasMappings() { @AssertTrue(message = "The mapped values do not match the target type provided") public boolean isMapTypeValid() { + if(Objects.isNull(map)){ + return true; + } return map.keySet().stream().allMatch(key -> checkTargetValueType(map.get(key))); } diff --git a/data-prepper-plugins/translate-processor/src/main/java/org/opensearch/dataprepper/plugins/processor/translate/TranslateProcessor.java b/data-prepper-plugins/translate-processor/src/main/java/org/opensearch/dataprepper/plugins/processor/translate/TranslateProcessor.java index bda5df91d4..d627f7a77e 100644 --- a/data-prepper-plugins/translate-processor/src/main/java/org/opensearch/dataprepper/plugins/processor/translate/TranslateProcessor.java +++ b/data-prepper-plugins/translate-processor/src/main/java/org/opensearch/dataprepper/plugins/processor/translate/TranslateProcessor.java @@ -44,18 +44,17 @@ public class TranslateProcessor extends AbstractProcessor, Record< public TranslateProcessor(PluginMetrics pluginMetrics, final TranslateProcessorConfig translateProcessorConfig, final ExpressionEvaluator expressionEvaluator) { super(pluginMetrics); this.expressionEvaluator = expressionEvaluator; - mappingsConfig = translateProcessorConfig.getMappingsParameterConfigs(); - mappingsConfig.forEach(MappingsParameterConfig::parseMappings); - parseFile(translateProcessorConfig.getFilePath()); - } - - private void parseFile(String filePath){ - //todo + mappingsConfig = translateProcessorConfig.getCombinedParameterConfigs(); + Optional.ofNullable(mappingsConfig) + .ifPresent(configs -> configs.forEach(MappingsParameterConfig::parseMappings)); } @Override public Collection> doExecute(Collection> records) { for (final Record record : records) { + if(Objects.isNull(mappingsConfig)){ + continue; + } final Event recordEvent = record.getData(); for (MappingsParameterConfig mappingConfig : mappingsConfig) { try { diff --git a/data-prepper-plugins/translate-processor/src/main/java/org/opensearch/dataprepper/plugins/processor/translate/TranslateProcessorConfig.java b/data-prepper-plugins/translate-processor/src/main/java/org/opensearch/dataprepper/plugins/processor/translate/TranslateProcessorConfig.java index 1bae063a6d..14c0900bf7 100644 --- a/data-prepper-plugins/translate-processor/src/main/java/org/opensearch/dataprepper/plugins/processor/translate/TranslateProcessorConfig.java +++ b/data-prepper-plugins/translate-processor/src/main/java/org/opensearch/dataprepper/plugins/processor/translate/TranslateProcessorConfig.java @@ -6,12 +6,21 @@ package org.opensearch.dataprepper.plugins.processor.translate; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; +import jakarta.validation.Valid; import jakarta.validation.constraints.AssertTrue; -import jakarta.validation.constraints.NotNull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; import java.util.List; -import java.util.stream.Stream; +import java.util.Objects; +import java.util.Optional; public class TranslateProcessorConfig { @@ -19,9 +28,12 @@ public class TranslateProcessorConfig { @JsonProperty("file_path") private String filePath; - @NotNull @JsonProperty("mappings") - private List mappingsParameterConfigs; + @Valid + private List mappingsParameterConfigs = new ArrayList<>(); + + @JsonIgnore + private List combinedParameterConfigs; public String getFilePath() { return filePath; @@ -31,9 +43,40 @@ public List getMappingsParameterConfigs() { return mappingsParameterConfigs; } - @AssertTrue(message = "Either mappings or file_path option needs to be configured.") + public List getCombinedParameterConfigs() { + if(Objects.isNull(combinedParameterConfigs)){ + combinedParameterConfigs = mappingsParameterConfigs; + } + return combinedParameterConfigs; + } + + @AssertTrue(message = "Please ensure that at least one of the options, either \"mappings\" or \"file_path\", is properly configured.") public boolean hasMappings() { - return Stream.of(mappingsParameterConfigs, filePath).filter(n -> n != null).count() != 0; + return (Objects.nonNull(mappingsParameterConfigs) && !mappingsParameterConfigs.isEmpty()) || Objects.nonNull(filePath); + } + + @AssertTrue(message = "\"mappings\" option should not be empty.") + public boolean isMappingsValid() { + return Objects.nonNull(mappingsParameterConfigs); + } + + @AssertTrue(message = "The file specified in the \"file_path\" option is not properly configured.") + public boolean isFileValid() { + return Objects.isNull(filePath) || readFileMappings(filePath); + } + + private boolean readFileMappings(String filePath) { + ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); + try { + FilePathParser fileParser = mapper.readValue(new File(filePath), FilePathParser.class); + Optional> optionalCombinedConfigs = fileParser.getCombinedMappings(mappingsParameterConfigs); + optionalCombinedConfigs.ifPresent(combinedConfigs -> combinedParameterConfigs = combinedConfigs); + return Optional.ofNullable(combinedParameterConfigs).map(configs -> true).orElse(false); + } catch (IOException ex) { + Logger LOG = LoggerFactory.getLogger(TranslateProcessor.class); + LOG.error("Unable to parse the mappings from file", ex); + return false; + } } } diff --git a/data-prepper-plugins/translate-processor/src/test/java/org/opensearch/dataprepper/plugins/processor/translate/MappingsParameterConfigTest.java b/data-prepper-plugins/translate-processor/src/test/java/org/opensearch/dataprepper/plugins/processor/translate/MappingsParameterConfigTest.java index 68fdeb9e41..86d30602e1 100644 --- a/data-prepper-plugins/translate-processor/src/test/java/org/opensearch/dataprepper/plugins/processor/translate/MappingsParameterConfigTest.java +++ b/data-prepper-plugins/translate-processor/src/test/java/org/opensearch/dataprepper/plugins/processor/translate/MappingsParameterConfigTest.java @@ -33,6 +33,16 @@ void test_get_source() { assertThat(mappingsParameterConfig.getSource(),is("sourceKey")); } + @Test + void test_source_present() { + assertTrue(mappingsParameterConfig.isSourcePresent()); + } + + @Test + void test_targets_present() { + assertFalse(mappingsParameterConfig.isTargetsPresent()); + } + @Test void test_source_field_valid_types() throws NoSuchFieldException, IllegalAccessException{ setField(MappingsParameterConfig.class, mappingsParameterConfig, "source", "key1"); diff --git a/data-prepper-plugins/translate-processor/src/test/java/org/opensearch/dataprepper/plugins/processor/translate/TranslateProcessorConfigTest.java b/data-prepper-plugins/translate-processor/src/test/java/org/opensearch/dataprepper/plugins/processor/translate/TranslateProcessorConfigTest.java index f8b5326392..4d3a4c1319 100644 --- a/data-prepper-plugins/translate-processor/src/test/java/org/opensearch/dataprepper/plugins/processor/translate/TranslateProcessorConfigTest.java +++ b/data-prepper-plugins/translate-processor/src/test/java/org/opensearch/dataprepper/plugins/processor/translate/TranslateProcessorConfigTest.java @@ -1,8 +1,13 @@ package org.opensearch.dataprepper.plugins.processor.translate; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; import java.util.List; import static org.hamcrest.core.Is.is; @@ -28,6 +33,12 @@ void test_no_mappings_filepath_options_present(){ assertFalse(translateProcessorConfig.hasMappings()); } + @Test + void test_no_mappings_present() throws NoSuchFieldException, IllegalAccessException { + setField(TranslateProcessorConfig.class, translateProcessorConfig, "mappingsParameterConfigs", null); + assertFalse(translateProcessorConfig.isMappingsValid()); + } + @Test void test_only_mappings_option_present() throws NoSuchFieldException, IllegalAccessException{ setField(TranslateProcessorConfig.class, translateProcessorConfig, "mappingsParameterConfigs", List.of(new MappingsParameterConfig())); @@ -54,4 +65,54 @@ void test_get_mappings() throws NoSuchFieldException, IllegalAccessException{ assertThat(translateProcessorConfig.getMappingsParameterConfigs(), is(mappingsParameterConfigs)); } + @Nested + class FilePathTests{ + private File testMappingsFile; + + @BeforeEach + void setup() throws IOException { + testMappingsFile = File.createTempFile("test", ".yaml"); + } + + @AfterEach + void cleanup() { + testMappingsFile.delete(); + } + + @Test + void test_is_file_valid_with_valid_file() throws NoSuchFieldException, IllegalAccessException, IOException { + String fileContent = "mappings:\n" + + " - source: status\n" + + " targets:\n" + + " - target: test\n" + + " map:\n" + + " 120: success"; + Files.write(testMappingsFile.toPath(), fileContent.getBytes()); + + String filePath = testMappingsFile.getAbsolutePath(); + setField(TranslateProcessorConfig.class, translateProcessorConfig, "filePath", filePath); + + assertTrue(translateProcessorConfig.isFileValid()); + } + + @Test + void test_is_file_valid_with_invalid_file() throws NoSuchFieldException, IllegalAccessException, IOException { + String fileContent = "mappings:"; + Files.write(testMappingsFile.toPath(), fileContent.getBytes()); + + String filePath = testMappingsFile.getAbsolutePath(); + setField(TranslateProcessorConfig.class, translateProcessorConfig, "filePath", filePath); + + assertFalse(translateProcessorConfig.isFileValid()); + } + + @Test + void test_is_file_invalid_with_invalid_file_path() throws NoSuchFieldException, IllegalAccessException { + String filePath = "/invalid/file/nofile.yaml"; + setField(TranslateProcessorConfig.class, translateProcessorConfig, "filePath", filePath); + + assertFalse(translateProcessorConfig.isFileValid()); + } + } + } \ No newline at end of file diff --git a/data-prepper-plugins/translate-processor/src/test/java/org/opensearch/dataprepper/plugins/processor/translate/TranslateProcessorTest.java b/data-prepper-plugins/translate-processor/src/test/java/org/opensearch/dataprepper/plugins/processor/translate/TranslateProcessorTest.java index 823f542849..fbefe75eeb 100644 --- a/data-prepper-plugins/translate-processor/src/test/java/org/opensearch/dataprepper/plugins/processor/translate/TranslateProcessorTest.java +++ b/data-prepper-plugins/translate-processor/src/test/java/org/opensearch/dataprepper/plugins/processor/translate/TranslateProcessorTest.java @@ -1,6 +1,8 @@ package org.opensearch.dataprepper.plugins.processor.translate; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; @@ -13,6 +15,9 @@ import org.opensearch.dataprepper.model.record.Record; import org.opensearch.dataprepper.plugins.processor.mutateevent.TargetType; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; import java.util.AbstractMap; import java.util.ArrayList; import java.util.Arrays; @@ -28,6 +33,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.when; +import static org.opensearch.dataprepper.test.helper.ReflectivelySetField.setField; @ExtendWith(MockitoExtension.class) class TranslateProcessorTest { @@ -63,6 +69,9 @@ void setup() { lenient() .when(mockConfig.getMappingsParameterConfigs()) .thenReturn(List.of(mappingsParameterConfig)); + lenient() + .when(mockConfig.getCombinedParameterConfigs()) + .thenReturn(List.of(mappingsParameterConfig)); } @Test @@ -530,6 +539,114 @@ void test_target_type_double() { assertTrue(translatedRecords.get(0).getData().containsKey("targetField")); assertThat(translatedRecords.get(0).getData().get("targetField", Double.class), is(20.3)); } + @Nested + class FilePathTests { + private File testMappingsFile; + private String filePath; + TranslateProcessorConfig fileTranslateConfig; + + @BeforeEach + void setup() throws IOException, NoSuchFieldException, IllegalAccessException { + testMappingsFile = File.createTempFile("test", ".yaml"); + String fileContent = "mappings:\n" + + " - source: sourceField\n" + + " targets:\n" + + " - target: fileTarget\n" + + " map:\n" + + " key1: fileMappedValue"; + Files.write(testMappingsFile.toPath(), fileContent.getBytes()); + filePath = testMappingsFile.getAbsolutePath(); + fileTranslateConfig = new TranslateProcessorConfig(); + setField(TranslateProcessorConfig.class, fileTranslateConfig, "filePath", filePath); + } + + @AfterEach + void cleanup() { + testMappingsFile.delete(); + } + + @Test + void test_only_file_path() throws NoSuchFieldException, IllegalAccessException { + parseMappings(); + + final TranslateProcessor processor = createObjectUnderTest(); + final Record record = getEvent("key1"); + final List> translatedRecords = (List>) processor.doExecute(Collections.singletonList(record)); + + assertTrue(translatedRecords.get(0).getData().containsKey("fileTarget")); + assertThat(translatedRecords.get(0).getData().get("fileTarget", String.class), is("fileMappedValue")); + } + @Test + void test_non_overlapping_sources() throws NoSuchFieldException, IllegalAccessException { + targetsParameterConfig = new TargetsParameterConfig(createMapEntries(createMapping("key2", "mappedValue2")), + "targetField", null, null, null, null); + MappingsParameterConfig fileMappingConfig = createMappingConfig(); + setField(TranslateProcessorConfig.class, fileTranslateConfig, "mappingsParameterConfigs", List.of(fileMappingConfig)); + parseMappings(); + + final TranslateProcessor processor = createObjectUnderTest(); + final Record record = getEvent("key1"); + final List> translatedRecords = (List>) processor.doExecute(Collections.singletonList(record)); + + assertTrue(translatedRecords.get(0).getData().containsKey("fileTarget")); + assertThat(translatedRecords.get(0).getData().get("fileTarget", String.class), is("fileMappedValue")); + + final Record mappingsRecord = getEvent("key2"); + final List> translatedMappingsRecords = (List>) processor.doExecute(Collections.singletonList(mappingsRecord)); + + assertTrue(translatedMappingsRecords.get(0).getData().containsKey("targetField")); + assertThat(translatedMappingsRecords.get(0).getData().get("targetField", String.class), is("mappedValue2")); + } + @Test + void test_overlapping_sources_different_targets() throws NoSuchFieldException, IllegalAccessException { + targetsParameterConfig = new TargetsParameterConfig(createMapEntries(createMapping("key1", "mappedValue1")), + "targetField", null, null, null, null); + MappingsParameterConfig fileMappingConfig = createMappingConfig(); + setField(TranslateProcessorConfig.class, fileTranslateConfig, "mappingsParameterConfigs", List.of(fileMappingConfig)); + parseMappings(); + + final TranslateProcessor processor = createObjectUnderTest(); + final Record record = getEvent("key1"); + final List> translatedRecords = (List>) processor.doExecute(Collections.singletonList(record)); + + assertTrue(translatedRecords.get(0).getData().containsKey("fileTarget")); + assertThat(translatedRecords.get(0).getData().get("fileTarget", String.class), is("fileMappedValue")); + + final Record mappingsRecord = getEvent("key1"); + final List> translatedMappingsRecords = (List>) processor.doExecute(Collections.singletonList(mappingsRecord)); + + assertTrue(translatedMappingsRecords.get(0).getData().containsKey("targetField")); + assertThat(translatedMappingsRecords.get(0).getData().get("targetField", String.class), is("mappedValue1")); + } + + @Test + void test_overlapping_sources_and_overlapping_targets() throws NoSuchFieldException, IllegalAccessException { + targetsParameterConfig = new TargetsParameterConfig(createMapEntries(createMapping("key1", "mappedValue1")), + "fileTarget", null, null, null, null); + MappingsParameterConfig fileMappingConfig = createMappingConfig(); + setField(TranslateProcessorConfig.class, fileTranslateConfig, "mappingsParameterConfigs", List.of(fileMappingConfig)); + parseMappings(); + + final TranslateProcessor processor = createObjectUnderTest(); + final Record record = getEvent("key1"); + final List> translatedRecords = (List>) processor.doExecute(Collections.singletonList(record)); + + assertTrue(translatedRecords.get(0).getData().containsKey("fileTarget")); + assertThat(translatedRecords.get(0).getData().get("fileTarget", String.class), is("mappedValue1")); + } + + void parseMappings(){ + fileTranslateConfig.isFileValid(); + fileTranslateConfig.getCombinedParameterConfigs().get(0).parseMappings(); + when(mockConfig.getCombinedParameterConfigs()).thenReturn(fileTranslateConfig.getCombinedParameterConfigs()); + } + MappingsParameterConfig createMappingConfig() throws NoSuchFieldException, IllegalAccessException { + MappingsParameterConfig fileMappingConfig = new MappingsParameterConfig(); + setField(MappingsParameterConfig.class, fileMappingConfig, "source", "sourceField"); + setField(MappingsParameterConfig.class, fileMappingConfig, "targetsParameterConfigs", List.of(targetsParameterConfig)); + return fileMappingConfig; + } + } private TranslateProcessor createObjectUnderTest() { return new TranslateProcessor(pluginMetrics, mockConfig, expressionEvaluator);