Skip to content
Snippets Groups Projects
Commit df36a13d authored by Jan Zickermann's avatar Jan Zickermann
Browse files

Merge branch 'KOP-2949-Resillienteres-Mapping' into 'main'

KOP-2949 Catch RuntimeExceptions, defensively

See merge request !4
parents acbe990f 74344a64
Branches
Tags
1 merge request!4KOP-2949 Catch RuntimeExceptions, defensively
Pipeline #2281 passed
...@@ -33,7 +33,9 @@ import de.ozgcloud.eingang.common.formdata.FormData; ...@@ -33,7 +33,9 @@ import de.ozgcloud.eingang.common.formdata.FormData;
import de.ozgcloud.eingang.common.formdata.FormDataUtils; import de.ozgcloud.eingang.common.formdata.FormDataUtils;
import de.ozgcloud.eingang.semantik.enginebased.EngineBasedSemantikAdapter; import de.ozgcloud.eingang.semantik.enginebased.EngineBasedSemantikAdapter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
@Log4j2
@Component @Component
@RequiredArgsConstructor @RequiredArgsConstructor
public class FormSolutionsEngineBasedAdapter implements EngineBasedSemantikAdapter { public class FormSolutionsEngineBasedAdapter implements EngineBasedSemantikAdapter {
...@@ -51,13 +53,22 @@ public class FormSolutionsEngineBasedAdapter implements EngineBasedSemantikAdapt ...@@ -51,13 +53,22 @@ public class FormSolutionsEngineBasedAdapter implements EngineBasedSemantikAdapt
var processedFormData = formData; var processedFormData = formData;
for (var mapper : mappers) { for (var mapper : mappers) {
processedFormData = mapper.parseFormData(processedFormData); processedFormData = applyFormDataMapperAndCatchException(mapper, processedFormData);
} }
return removeProcessedData(processedFormData); return removeProcessedData(processedFormData);
} }
protected FormData removeProcessedData(FormData formData) { private FormData applyFormDataMapperAndCatchException(FormSolutionsEngineBasedMapper mapper, FormData formData) {
try {
return mapper.parseFormData(formData);
} catch (RuntimeException e) {
LOG.error("Error while parsing form data with mapper {}", mapper.getClass().getSimpleName(), e);
return formData;
}
}
FormData removeProcessedData(FormData formData) {
return FormDataUtils.from(formData) return FormDataUtils.from(formData)
.remove(ASSISTANT) .remove(ASSISTANT)
.remove(ANLIEGEN_ID) .remove(ANLIEGEN_ID)
......
...@@ -29,7 +29,7 @@ import static org.assertj.core.api.Assertions.*; ...@@ -29,7 +29,7 @@ import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*; import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.*;
import java.util.Collections; import java.util.List;
import java.util.Map; import java.util.Map;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
...@@ -42,7 +42,6 @@ import org.mockito.Spy; ...@@ -42,7 +42,6 @@ import org.mockito.Spy;
import org.springframework.test.util.ReflectionTestUtils; import org.springframework.test.util.ReflectionTestUtils;
import de.ozgcloud.eingang.common.formdata.FormData; import de.ozgcloud.eingang.common.formdata.FormData;
import de.ozgcloud.eingang.common.formdata.FormDataTestFactory;
class FormSolutionsEngineBasedAdapterTest { class FormSolutionsEngineBasedAdapterTest {
...@@ -50,73 +49,162 @@ class FormSolutionsEngineBasedAdapterTest { ...@@ -50,73 +49,162 @@ class FormSolutionsEngineBasedAdapterTest {
@InjectMocks @InjectMocks
private FormSolutionsEngineBasedAdapter adapter; private FormSolutionsEngineBasedAdapter adapter;
@Mock @Mock
private FormSolutionsEngineBasedMapper mapper; private FormSolutionsEngineBasedMapper mapper0;
@Mock
private FormSolutionsEngineBasedMapper mapper1;
@DisplayName("Parse formData") @DisplayName("Parse formData")
@Nested @Nested
class TestParseFormData { class TestParseFormData {
private final FormData formData = FormDataTestFactory.create(); @Mock
private FormData formData0;
@Mock
private FormData formData1;
@Mock
private FormData formData2;
@Mock
private FormData formData3;
@BeforeEach @BeforeEach
void mockMappers() { void mockMappers() {
ReflectionTestUtils.setField(adapter, "mappers", Collections.singletonList(mapper)); ReflectionTestUtils.setField(adapter, "mappers", List.of(mapper0, mapper1));
} }
@Test @DisplayName("without exception")
void shouldCallMappers() { @Nested
when(mapper.parseFormData(any())).thenReturn(formData); class TestWithoutException {
adapter.parseFormData(formData); @BeforeEach
void mock() {
when(mapper0.parseFormData(any())).thenReturn(formData1);
when(mapper1.parseFormData(any())).thenReturn(formData2);
doReturn(formData3).when(adapter).removeProcessedData(any());
}
verify(mapper).parseFormData(formData); @DisplayName("should call first mapper")
} @Test
void shouldCallFirstMapper() {
parseFormData();
@Test verify(mapper0).parseFormData(formData0);
void shouldCallRemoveProcessedRawData() { }
when(mapper.parseFormData(any())).thenReturn(formData);
adapter.parseFormData(formData); @DisplayName("should call second mapper")
@Test
void shouldCallSecondMapper() {
parseFormData();
verify(mapper1).parseFormData(formData1);
}
@DisplayName("should call removeProcessedData")
@Test
void shouldCallRemoveProcessedData() {
parseFormData();
verify(adapter).removeProcessedData(formData2);
}
@DisplayName("should return")
@Test
void shouldReturn() {
var result = parseFormData();
assertThat(result).isEqualTo(formData3);
}
verify(adapter).removeProcessedData(formData);
} }
@DisplayName("remove processed data") @DisplayName("with exception")
@Nested @Nested
class TestRemoveProcessedData { class TestWithException {
private final Map<String, Object> formDataMap = Map.of(ASSISTANT, "testValue", @BeforeEach
ANLIEGEN_ID, "testValue2", KOMMUNALVERWALTUNG_ID, "testValue3", void mock() {
POSTKORBHANDLE, "testValue4"); when(mapper0.parseFormData(any())).thenThrow(new RuntimeException());
private final FormData formData = FormData.builder().formData(formDataMap).build(); when(mapper1.parseFormData(any())).thenReturn(formData1);
doReturn(formData2).when(adapter).removeProcessedData(any());
}
@DisplayName("should call first mapper")
@Test @Test
void shouldRemoveAssistant() { void shouldCallFirstMapper() {
var cleanedFormData = adapter.removeProcessedData(formData); parseFormData();
assertThat(cleanedFormData.getFormData()).doesNotContainKey(ASSISTANT); verify(mapper0).parseFormData(formData0);
} }
@DisplayName("should call second mapper with same data")
@Test @Test
void shouldRemoveAnliegenId() { void shouldCallSecondMapperWithSameData() {
var cleanedFormData = adapter.removeProcessedData(formData); parseFormData();
assertThat(cleanedFormData.getFormData()).doesNotContainKey(ANLIEGEN_ID); verify(mapper1).parseFormData(formData0);
} }
@DisplayName("should call removeProcessedData")
@Test @Test
void shouldRemoveKommunalVerwaltungId() { void shouldCallRemoveProcessedData() {
var cleanedFormData = adapter.removeProcessedData(formData); parseFormData();
assertThat(cleanedFormData.getFormData()).doesNotContainKey(KOMMUNALVERWALTUNG_ID); verify(adapter).removeProcessedData(formData1);
} }
@DisplayName("should return")
@Test @Test
void shouldRemovePostkorbhandle() { void shouldReturn() {
var cleanedFormData = adapter.removeProcessedData(formData); var result = parseFormData();
assertThat(cleanedFormData.getFormData()).doesNotContainKey(POSTKORBHANDLE); assertThat(result).isEqualTo(formData2);
} }
}
FormData parseFormData() {
return adapter.parseFormData(formData0);
}
}
@DisplayName("remove processed data")
@Nested
class TestRemoveProcessedData {
private final Map<String, Object> formDataMap = Map.of(ASSISTANT, "testValue",
ANLIEGEN_ID, "testValue2", KOMMUNALVERWALTUNG_ID, "testValue3",
POSTKORBHANDLE, "testValue4");
private final FormData formData = FormData.builder().formData(formDataMap).build();
@Test
void shouldRemoveAssistant() {
var cleanedFormData = adapter.removeProcessedData(formData);
assertThat(cleanedFormData.getFormData()).doesNotContainKey(ASSISTANT);
}
@Test
void shouldRemoveAnliegenId() {
var cleanedFormData = adapter.removeProcessedData(formData);
assertThat(cleanedFormData.getFormData()).doesNotContainKey(ANLIEGEN_ID);
}
@Test
void shouldRemoveKommunalVerwaltungId() {
var cleanedFormData = adapter.removeProcessedData(formData);
assertThat(cleanedFormData.getFormData()).doesNotContainKey(KOMMUNALVERWALTUNG_ID);
}
@Test
void shouldRemovePostkorbhandle() {
var cleanedFormData = adapter.removeProcessedData(formData);
assertThat(cleanedFormData.getFormData()).doesNotContainKey(POSTKORBHANDLE);
} }
} }
} }
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment