From 6806a63e4566b892514415a5a52d7847e1b80fb1 Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Tue, 10 Sep 2024 12:52:35 +0200
Subject: [PATCH] OZG-6636 extract serviceKonto mapping to mapper class

---
 .../FormCycleServiceKontoMapper.java          |  32 ++++++
 .../eingang/formcycle/FormDataController.java |  31 +-----
 .../FormCycleFormDataTestFactory.java         |  15 +--
 .../FormCycleServiceKontoMapperTest.java      |  83 ++++++++++++++
 .../formcycle/FormDataControllerTest.java     | 104 ++++++------------
 5 files changed, 160 insertions(+), 105 deletions(-)
 create mode 100644 formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormCycleServiceKontoMapper.java
 create mode 100644 formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormCycleServiceKontoMapperTest.java

diff --git a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormCycleServiceKontoMapper.java b/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormCycleServiceKontoMapper.java
new file mode 100644
index 000000000..7a994654a
--- /dev/null
+++ b/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormCycleServiceKontoMapper.java
@@ -0,0 +1,32 @@
+package de.ozgcloud.eingang.formcycle;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import de.ozgcloud.eingang.common.formdata.ServiceKonto;
+import de.ozgcloud.eingang.common.formdata.ServiceKonto.PostfachAddress;
+import de.ozgcloud.eingang.common.formdata.StringBasedIdentifier;
+
+@Component
+class FormCycleServiceKontoMapper {
+
+	public ServiceKonto fromGrpc(FormCycleServiceKonto serviceKonto) {
+		return ServiceKonto.builder()
+				.type(serviceKonto.getType())
+				.postfachAddress(buildPostfachAddress(serviceKonto))
+				.trustLevel(StringUtils.trimToNull(serviceKonto.getTrustLevel()))
+				.build();
+	}
+
+	PostfachAddress buildPostfachAddress(FormCycleServiceKonto serviceKonto) {
+		if (!serviceKonto.hasAddress()) {
+			return null;
+		}
+		var address = serviceKonto.getAddress();
+		return PostfachAddress.builder().identifier(buildPostfachId(address.getIdentifier())).version(address.getVersion()).build();
+	}
+
+	private StringBasedIdentifier buildPostfachId(String identifier) {
+		return StringBasedIdentifier.builder().postfachId(identifier).build();
+	}
+}
\ No newline at end of file
diff --git a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormDataController.java b/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormDataController.java
index 0410813ad..128fc4e36 100644
--- a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormDataController.java
+++ b/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormDataController.java
@@ -32,7 +32,6 @@ import java.util.Objects;
 import java.util.Optional;
 import java.util.UUID;
 
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -45,9 +44,6 @@ import de.ozgcloud.common.errorhandling.TechnicalException;
 import de.ozgcloud.eingang.common.formdata.FormData;
 import de.ozgcloud.eingang.common.formdata.IncomingFile;
 import de.ozgcloud.eingang.common.formdata.IncomingFileGroup;
-import de.ozgcloud.eingang.common.formdata.ServiceKonto;
-import de.ozgcloud.eingang.common.formdata.ServiceKonto.PostfachAddress;
-import de.ozgcloud.eingang.common.formdata.StringBasedIdentifier;
 import de.ozgcloud.eingang.common.vorgang.VorgangNummerSupplier;
 import de.ozgcloud.eingang.semantik.SemantikAdapter;
 import de.ozgcloud.eingang.semantik.enginebased.FilesMapperHelper;
@@ -67,6 +63,7 @@ class FormDataController {
 	private final SemantikAdapter semantikAdapter;
 	private final VorgangNummerSupplier vorgangNummerSupplier;
 	private final FormDataHtmlCleaner formDataHtmlCleaner;
+	private final FormCycleServiceKontoMapper serviceKontoMapper;
 
 	@PostMapping(consumes = "multipart/form-data", produces = HTTP_TYPE_PROTOBUF)
 	public FormCycleConfirmationResponse receiveFormData(@RequestPart FormCycleFormData formData,
@@ -99,7 +96,7 @@ class FormDataController {
 		return files.orElseGet(Collections::emptyList).stream().map(this::buildIncomingFile).toList();
 	}
 
-	private FormData addFiles(FormCycleFormData inFormData, Optional<Collection<MultipartFile>> attachments, FormData mappedFormData) {
+	FormData addFiles(FormCycleFormData inFormData, Optional<Collection<MultipartFile>> attachments, FormData mappedFormData) {
 		var groups = new AttachmentGroupsBuilder(inFormData.getAttachmentGroupList(), attachments).buildGroups();
 
 		return mappedFormData.toBuilder().attachments(groups).numberOfAttachments(FilesMapperHelper.countAttachedFiles(groups)).build();
@@ -158,28 +155,8 @@ class FormDataController {
 
 	FormData addServiceKonto(FormCycleFormData formData, FormData mappedFormData) {
 		if (formData.hasServiceKonto()) {
-			mappedFormData.getHeader().setServiceKonto(buildServiceKonto(formData.getServiceKonto()));
+			mappedFormData.getHeader().setServiceKonto(serviceKontoMapper.fromGrpc(formData.getServiceKonto()));
 		}
 		return mappedFormData;
 	}
-
-	ServiceKonto buildServiceKonto(FormCycleServiceKonto formCycleServiceKonto) {
-		return ServiceKonto.builder()
-				.type(formCycleServiceKonto.getType())
-				.postfachAddress(buildPostfachAddress(formCycleServiceKonto))
-				.trustLevel(StringUtils.trimToNull(formCycleServiceKonto.getTrustLevel()))
-				.build();
-	}
-
-	PostfachAddress buildPostfachAddress(FormCycleServiceKonto formCycleServiceKonto) {
-		if (!formCycleServiceKonto.hasAddress()) {
-			return null;
-		}
-		var address = formCycleServiceKonto.getAddress();
-		return PostfachAddress.builder().identifier(buildPostfachId(address.getIdentifier())).version(address.getVersion()).build();
-	}
-
-	private StringBasedIdentifier buildPostfachId(String identifier) {
-		return StringBasedIdentifier.builder().postfachId(identifier).build();
-	}
-}
+}
\ No newline at end of file
diff --git a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormCycleFormDataTestFactory.java b/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormCycleFormDataTestFactory.java
index 78691f91a..369bc8a16 100644
--- a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormCycleFormDataTestFactory.java
+++ b/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormCycleFormDataTestFactory.java
@@ -28,16 +28,18 @@ import de.ozgcloud.eingang.formcycle.FormCycleFormData.Builder;
 import de.ozgcloud.vorgang.common.grpc.GrpcFormDataTestFactory;
 import de.ozgcloud.vorgang.vorgang.GrpcFormData;
 
-class FormCycleFormDataTestFactory {
+public class FormCycleFormDataTestFactory {
 
-	static FormCycleFormData create() {
+	public static final FormCycleServiceKonto SERVICE_KONTO = FormCycleServiceKontoTestFactory.create();
+
+	public static FormCycleFormData create() {
 		return createBuilder().build();
 	}
 
-	static Builder createBuilder() {
+	public static Builder createBuilder() {
 		return FormCycleFormData.newBuilder()
 				.setHeader(FormCycleFormHeaderTestFactory.create())
-				.setServiceKonto(FormCycleServiceKontoTestFactory.create())
+				.setServiceKonto(SERVICE_KONTO)
 				.setFormData(GrpcFormDataTestFactory.create())
 				.addAttachmentGroup(FormCycleAttachmentGroup.newBuilder()
 						.setName(IncomingFileGroupTestFactory.NAME)
@@ -45,8 +47,7 @@ class FormCycleFormDataTestFactory {
 						.build());
 	}
 
-	static FormCycleFormData withFormData(GrpcFormData formData) {
+	public static FormCycleFormData withFormData(GrpcFormData formData) {
 		return createBuilder().clearFormData().setFormData(formData).build();
 	}
-
-}
+}
\ No newline at end of file
diff --git a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormCycleServiceKontoMapperTest.java b/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormCycleServiceKontoMapperTest.java
new file mode 100644
index 000000000..dd44600b8
--- /dev/null
+++ b/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormCycleServiceKontoMapperTest.java
@@ -0,0 +1,83 @@
+package de.ozgcloud.eingang.formcycle;
+
+import static org.assertj.core.api.Assertions.*;
+
+import org.apache.commons.lang3.StringUtils;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.Spy;
+
+import de.ozgcloud.eingang.common.formdata.ServiceKonto.PostfachAddress;
+import de.ozgcloud.eingang.common.formdata.ServiceKontoTestFactory;
+import de.ozgcloud.eingang.common.formdata.StringBasedIdentifier;
+
+class FormCycleServiceKontoMapperTest {
+
+	@Spy
+	private FormCycleServiceKontoMapper mapper;
+
+	@DisplayName("From grpc")
+	@Nested
+	class TestFromGrpc {
+
+		@DisplayName("trustLevel")
+		@Nested
+		class TestTrustLevel {
+
+			@Test
+			void shouldMap() {
+				var serviceKonto = mapper.fromGrpc(FormCycleServiceKontoTestFactory.create());
+
+				assertThat(serviceKonto.getTrustLevel()).isEqualTo(ServiceKontoTestFactory.TRUST_LEVEL);
+			}
+
+			@Test
+			void shouldMapAsNullIfEmpty() {
+				var serviceKontoWithEmptyTrustLevel = FormCycleServiceKontoTestFactory.createBuilder().setTrustLevel(StringUtils.EMPTY).build();
+
+				var serviceKonto = mapper.fromGrpc(serviceKontoWithEmptyTrustLevel);
+
+				assertThat(serviceKonto.getTrustLevel()).isNull();
+			}
+		}
+
+		@DisplayName("build postfacha address")
+		@Nested
+		class TestBuildPostfachAddress {
+
+			@Test
+			void shouldMapPostkorbId() {
+				var postfachAddress = mapper.buildPostfachAddress(FormCycleServiceKontoTestFactory.create());
+
+				assertThat(((StringBasedIdentifier) postfachAddress.getIdentifier()).getPostfachId())
+						.isEqualTo(FormCyclePostfachAddressTestFactory.POSTKORB_ID);
+			}
+
+			@Test
+			void shouldNotMapEmptyPostkorbId() {
+				var postfachAddress = mapper.buildPostfachAddress(FormCycleServiceKonto.newBuilder().build());
+
+				assertThat(postfachAddress).isNull();
+			}
+
+			@Test
+			void shouldMapPostfachIdentifier() {
+				var postfachAddress = mapper.buildPostfachAddress(FormCycleServiceKontoTestFactory.create());
+
+				assertThat(getIdentifier(postfachAddress)).isEqualTo(FormCyclePostfachAddressTestFactory.POSTKORB_ID);
+			}
+
+			private String getIdentifier(PostfachAddress postfachAddress) {
+				return ((StringBasedIdentifier) postfachAddress.getIdentifier()).getPostfachId();
+			}
+
+			@Test
+			void shouldMapPostfachAddressVersion() {
+				var postfachAddress = mapper.buildPostfachAddress(FormCycleServiceKontoTestFactory.create());
+
+				assertThat(postfachAddress.getVersion()).isEqualTo(FormCyclePostfachAddressTestFactory.VERSION);
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormDataControllerTest.java b/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormDataControllerTest.java
index 2a6a232a9..4bce56df9 100644
--- a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormDataControllerTest.java
+++ b/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormDataControllerTest.java
@@ -34,7 +34,6 @@ import java.io.ByteArrayOutputStream;
 import java.util.Collections;
 import java.util.Optional;
 
-import org.apache.commons.lang3.StringUtils;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
@@ -56,9 +55,8 @@ import de.ozgcloud.eingang.common.formdata.FormHeader;
 import de.ozgcloud.eingang.common.formdata.FormHeaderTestFactory;
 import de.ozgcloud.eingang.common.formdata.IncomingFileGroupTestFactory;
 import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory;
-import de.ozgcloud.eingang.common.formdata.ServiceKonto.PostfachAddress;
+import de.ozgcloud.eingang.common.formdata.ServiceKonto;
 import de.ozgcloud.eingang.common.formdata.ServiceKontoTestFactory;
-import de.ozgcloud.eingang.common.formdata.StringBasedIdentifier;
 import de.ozgcloud.eingang.common.vorgang.VorgangNummerSupplier;
 import de.ozgcloud.eingang.semantik.SemantikAdapter;
 import lombok.SneakyThrows;
@@ -77,6 +75,8 @@ class FormDataControllerTest {
 	private VorgangNummerSupplier vorgangNummerSupplier;
 	@Mock
 	private FormDataHtmlCleaner htmlCleaner;
+	@Mock
+	private FormCycleServiceKontoMapper serviceKontoMapper;
 
 	private MockMvc mockMvc;
 
@@ -136,7 +136,7 @@ class FormDataControllerTest {
 		void shouldCallHtmlCleaner() {
 			doPostRequest();
 
-			verify(htmlCleaner).clean(any());
+			verify(htmlCleaner).clean(mappedFormData);
 		}
 
 		@Test
@@ -157,11 +157,12 @@ class FormDataControllerTest {
 		}
 
 		@Test
-		void shouldMapPostkorbId() {
+		void shouldCallAddServiceKonto() {
+			doReturn(mappedFormData).when(controller).addFiles(any(), any(), any());
+
 			doPostRequest();
 
-			verify(semantikAdapter).processFormData(formDataCaptor.capture());
-			assertThat(getPostfachIdFormData(formDataCaptor.getValue())).isEqualTo(FormCyclePostfachAddressTestFactory.POSTKORB_ID);
+			verify(controller).addServiceKonto(notNull(), eq(mappedFormData));
 		}
 
 		@Nested
@@ -300,84 +301,45 @@ class FormDataControllerTest {
 		}
 	}
 
-	@DisplayName("ServiceKonto mapping")
+	@DisplayName("Add serviceKonto")
 	@Nested
 	class TestServiceKontoMapping {
 
-		@Test
-		void shouldMapServiceKontoType() {
-			var formData = controller.addServiceKonto(FormCycleFormDataTestFactory.create(), buildEmptyFormDataWithHeader());
-
-			assertThat(getServiceKontoType(formData)).isEqualTo(FormCycleServiceKontoTestFactory.TYPE);
-		}
-
-		@Test
-		void shouldNotMapEmptyServiceKonto() {
-			controller.addServiceKonto(FormCycleFormData.newBuilder().build(), buildEmptyFormDataWithHeader());
-
-			verify(controller, never()).buildServiceKonto(any());
-		}
-
-		@DisplayName("trustLevel")
+		@DisplayName("on existing")
 		@Nested
-		class TestTrustLevel {
+		class TestOnExisting {
 
-			@Test
-			void shouldMap() {
-				var formData = controller.addServiceKonto(FormCycleFormDataTestFactory.create(), buildEmptyFormDataWithHeader());
+			private final ServiceKonto serviceKonto = ServiceKontoTestFactory.create();
 
-				assertThat(formData.getHeader().getServiceKonto().getTrustLevel()).isEqualTo(ServiceKontoTestFactory.TRUST_LEVEL);
+			@BeforeEach
+			void mock() {
+				when(serviceKontoMapper.fromGrpc(any())).thenReturn(serviceKonto);
 			}
 
 			@Test
-			void shouldMapAsNullIfEmpty() {
-				var serviceKontoWithEmptyTrustLevel = FormCycleServiceKontoTestFactory.createBuilder().setTrustLevel(StringUtils.EMPTY).build();
-				var formCycleFormData = FormCycleFormDataTestFactory.createBuilder().setServiceKonto(serviceKontoWithEmptyTrustLevel).build();
-
-				var formData = controller.addServiceKonto(formCycleFormData, buildEmptyFormDataWithHeader());
+			void shouldCallMapper() {
+				controller.addServiceKonto(FormCycleFormDataTestFactory.create(), buildEmptyFormDataWithHeader());
 
-				assertThat(formData.getHeader().getServiceKonto().getTrustLevel()).isNull();
+				verify(serviceKontoMapper).fromGrpc(FormCycleFormDataTestFactory.SERVICE_KONTO);
 			}
-		}
-
-		private String getServiceKontoType(FormData formData) {
-			return formData.getHeader().getServiceKonto().getType();
-		}
-
-		@Nested
-		class TestPostkorbIdMapping {
 
 			@Test
-			void shouldMapPostkorbId() {
+			void shouldMapServiceKontoType() {
 				var formData = controller.addServiceKonto(FormCycleFormDataTestFactory.create(), buildEmptyFormDataWithHeader());
 
-				assertThat(getPostfachIdFormData(formData)).isEqualTo(FormCyclePostfachAddressTestFactory.POSTKORB_ID);
-			}
-
-			@Test
-			void shouldNotMapEmptyPostkorbId() {
-				var postfachAddress = controller.buildPostfachAddress(FormCycleServiceKonto.newBuilder().build());
-
-				assertThat(postfachAddress).isNull();
-			}
-
-			@Test
-			void shouldMapPostfachIdentifier() {
-				var postfachAddress = controller.buildPostfachAddress(FormCycleServiceKontoTestFactory.create());
-
-				assertThat(getIdentifier(postfachAddress)).isEqualTo(FormCyclePostfachAddressTestFactory.POSTKORB_ID);
+				assertThat(getServiceKontoType(formData)).isEqualTo(ServiceKontoTestFactory.TYPE);
 			}
+		}
 
-			private String getIdentifier(PostfachAddress postfachAddress) {
-				return ((StringBasedIdentifier) postfachAddress.getIdentifier()).getPostfachId();
-			}
+		@Test
+		void shouldBeNullIfNotExists() {
+			var formData = controller.addServiceKonto(FormCycleFormData.newBuilder().build(), buildEmptyFormDataWithHeader());
 
-			@Test
-			void shouldMapPostfachAddressVersion() {
-				var postfachAddress = controller.buildPostfachAddress(FormCycleServiceKontoTestFactory.create());
+			assertThat(formData.getHeader().getServiceKonto()).isNull();
+		}
 
-				assertThat(postfachAddress.getVersion()).isEqualTo(FormCyclePostfachAddressTestFactory.VERSION);
-			}
+		private String getServiceKontoType(FormData formData) {
+			return formData.getHeader().getServiceKonto().getType();
 		}
 
 		private FormData buildEmptyFormDataWithHeader() {
@@ -385,8 +347,8 @@ class FormDataControllerTest {
 		}
 	}
 
-	private String getPostfachIdFormData(FormData formData) {
-		return ((StringBasedIdentifier) formData.getHeader().getServiceKonto().getPostfachAddresses()
-				.get(0).getIdentifier()).getPostfachId();
-	}
-}
+//	private String getPostfachIdFormData(FormData formData) {
+//		return ((StringBasedIdentifier) formData.getHeader().getServiceKonto().getPostfachAddresses()
+//				.get(0).getIdentifier()).getPostfachId();
+//	}
+}
\ No newline at end of file
-- 
GitLab