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

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

KOP-2949 Catch RuntimeExceptions, defensively

See merge request !5
parents 937fc9c3 065bb45e
No related branches found
No related tags found
1 merge request!5KOP-2949 Catch RuntimeExceptions, defensively
Pipeline #2345 passed
...@@ -32,7 +32,9 @@ import de.ozgcloud.eingang.common.formdata.FormData; ...@@ -32,7 +32,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 de.ozgcloud.eingang.semantik.enginebased.afm.intelliform.IntelliFormRepresentationAdapter; import de.ozgcloud.eingang.semantik.enginebased.afm.intelliform.IntelliFormRepresentationAdapter;
import lombok.extern.log4j.Log4j2;
@Log4j2
@Component @Component
@RequiredArgsConstructor @RequiredArgsConstructor
public class AfmEngineBasedAdapter implements EngineBasedSemantikAdapter { public class AfmEngineBasedAdapter implements EngineBasedSemantikAdapter {
...@@ -46,14 +48,23 @@ public class AfmEngineBasedAdapter implements EngineBasedSemantikAdapter { ...@@ -46,14 +48,23 @@ public class AfmEngineBasedAdapter implements EngineBasedSemantikAdapter {
var processedFormData = intelliFormRepresentationAdapter.adaptByRepresentations(formData); var processedFormData = intelliFormRepresentationAdapter.adaptByRepresentations(formData);
for (var mapper : mappers) { for (var mapper : mappers) {
processedFormData = mapper.parseFormData(processedFormData); processedFormData = applyFormDataMapperAndCatchException(mapper, processedFormData);
} }
return removeProcessedData(processedFormData); return removeProcessedData(processedFormData);
} }
private FormData applyFormDataMapperAndCatchException(AfmEngineBasedMapper 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;
}
}
private FormData removeProcessedData(FormData formData) { FormData removeProcessedData(FormData formData) {
return FormDataUtils.from(formData) return FormDataUtils.from(formData)
.remove(AfmAntragstellerMapper.POSTFACH_ID) .remove(AfmAntragstellerMapper.POSTFACH_ID)
.build(); .build();
......
...@@ -26,7 +26,7 @@ package de.ozgcloud.eingang.semantik.enginebased.afm; ...@@ -26,7 +26,7 @@ package de.ozgcloud.eingang.semantik.enginebased.afm;
import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.Assertions.*;
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;
...@@ -39,7 +39,7 @@ import org.mockito.Spy; ...@@ -39,7 +39,7 @@ 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.FormHeader; import de.ozgcloud.eingang.common.formdata.FormDataTestFactory;
import de.ozgcloud.eingang.semantik.enginebased.afm.intelliform.IntelliFormRepresentationAdapter; import de.ozgcloud.eingang.semantik.enginebased.afm.intelliform.IntelliFormRepresentationAdapter;
class AfmEngineBasedAdapterTest { class AfmEngineBasedAdapterTest {
...@@ -47,8 +47,6 @@ class AfmEngineBasedAdapterTest { ...@@ -47,8 +47,6 @@ class AfmEngineBasedAdapterTest {
@Spy @Spy
@InjectMocks @InjectMocks
private AfmEngineBasedAdapter adapter; private AfmEngineBasedAdapter adapter;
@Mock
private AfmEngineBasedMapper mapper;
@Mock @Mock
private IntelliFormRepresentationAdapter intelliFormRepresentationAdapters; private IntelliFormRepresentationAdapter intelliFormRepresentationAdapters;
...@@ -56,50 +54,144 @@ class AfmEngineBasedAdapterTest { ...@@ -56,50 +54,144 @@ class AfmEngineBasedAdapterTest {
@DisplayName("Parse form data") @DisplayName("Parse form data")
@Nested @Nested
class TestParseFromData { class TestParseFromData {
private static final String VORGANG_NUMMER = "AAAA-1234"; @Mock
private AfmEngineBasedMapper mapper0;
private final Map<String, Object> formDataMap = Map.of(AfmAntragstellerMapper.POSTFACH_ID, "postfachIdValue");
private final FormData formData = FormData.builder() @Mock
.header(FormHeader.builder() private AfmEngineBasedMapper mapper1;
.vorgangNummer(VORGANG_NUMMER)
.build() @Mock
) private FormData formData0;
.formData(formDataMap)
.build(); @Mock
private FormData formData1;
@Mock
private FormData formData2;
@Mock
private FormData formData3;
@Mock
private FormData formData4;
@DisplayName("without exception")
@Nested
class TestWithoutException {
private final FormData processedFormData = FormData.builder()
.formData(formDataMap)
.build();
@BeforeEach @BeforeEach
void mock() { void mock() {
ReflectionTestUtils.setField(adapter, "mappers", Collections.singletonList(mapper)); ReflectionTestUtils.setField(adapter, "mappers", List.of(mapper0, mapper1));
when(intelliFormRepresentationAdapters.adaptByRepresentations(any())).thenReturn(formData1);
when(mapper0.parseFormData(any())).thenReturn(formData2);
when(mapper1.parseFormData(any())).thenReturn(formData3);
doReturn(formData4).when(adapter).removeProcessedData(any());
}
@DisplayName("should call adaptByRepresentations")
@Test
void shouldCallAdaptByRepresentations() {
parseFormData();
verify(intelliFormRepresentationAdapters).adaptByRepresentations(formData0);
}
@DisplayName("should call first mapper")
@Test
void shouldCallFirstMapper() {
parseFormData();
verify(mapper0).parseFormData(formData1);
}
@DisplayName("should call second mapper")
@Test
void shouldCallSecondMapper() {
parseFormData();
verify(mapper1).parseFormData(formData2);
}
@DisplayName("should call removeProcessedData")
@Test
void shouldCallRemoveProcessedData() {
parseFormData();
when(mapper.parseFormData(processedFormData)).thenReturn(processedFormData); verify(adapter).removeProcessedData(formData3);
when(intelliFormRepresentationAdapters.adaptByRepresentations(formData)).thenReturn(processedFormData);
} }
@DisplayName("should return")
@Test @Test
void shouldCallRepresentationAdapter() { void shouldReturn() {
adapter.parseFormData(formData); var result = parseFormData();
assertThat(result).isEqualTo(formData4);
}
}
@DisplayName("with exception")
@Nested
class TestWithException {
@BeforeEach
void mock() {
ReflectionTestUtils.setField(adapter, "mappers", List.of(mapper0, mapper1));
verify(intelliFormRepresentationAdapters).adaptByRepresentations(formData); when(intelliFormRepresentationAdapters.adaptByRepresentations(any())).thenReturn(formData1);
when(mapper0.parseFormData(any())).thenReturn(formData2);
when(mapper1.parseFormData(any())).thenThrow(new RuntimeException());
doReturn(formData4).when(adapter).removeProcessedData(any());
} }
@DisplayName("should call removeProcessedData with old formData")
@Test @Test
void shouldCallMappers() { void shouldCallRemoveProcessedDataWithOldFormData() {
adapter.parseFormData(formData); parseFormData();
verify(mapper).parseFormData(processedFormData); verify(adapter).removeProcessedData(formData2);
} }
@DisplayName("should return")
@Test @Test
void shouldRemovePostfachId() { void shouldReturn() {
var mappedFormData = adapter.parseFormData(formData); var result = parseFormData();
assertThat(result).isEqualTo(formData4);
}
}
assertThat(mappedFormData.getFormData()).doesNotContainKey(AfmAntragstellerMapper.POSTFACH_ID); FormData parseFormData() {
return adapter.parseFormData(formData0);
} }
}
@DisplayName("remove processed data")
@Nested
class TestRemoveProcessedData {
private final FormData formData = FormDataTestFactory.createBuilder()
.formData(Map.of(
AfmAntragstellerMapper.POSTFACH_ID, "postfachIdValue",
"key", "value"
))
.build();
private final FormData outputFormData = FormDataTestFactory.createBuilder()
.formData(Map.of(
"key", "value"
))
.build();
@DisplayName("should return without postfachId")
@Test
void shouldReturnWithoutPostfachId() {
var mappedFormData = adapter.removeProcessedData(formData);
assertThat(mappedFormData).usingRecursiveComparison().isEqualTo(outputFormData);
}
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment