From 1a1cbc457874d75784fb0fb328becc7f515c8ccd Mon Sep 17 00:00:00 2001
From: Tobias Bruns <kontakt@tobias-bruns.de>
Date: Wed, 12 Feb 2025 15:09:17 +0100
Subject: [PATCH] OZG-7689 fix bean management

---
 pom.xml                                       |  12 +-
 .../command/CommandRemoteService.java         |   4 +-
 .../processor/command/CommandService.java     |   2 +-
 ...ava => ProcessorManagerCommandMapper.java} |   2 +-
 .../ozgcloud/processor/ProcessorITCase.java   | 130 ++++++++++++++++++
 .../command/CommandRemoteServiceTest.java     |   2 +-
 6 files changed, 141 insertions(+), 11 deletions(-)
 rename src/main/java/de/ozgcloud/processor/command/{CommandMapper.java => ProcessorManagerCommandMapper.java} (91%)
 create mode 100644 src/test/java/de/ozgcloud/processor/ProcessorITCase.java

diff --git a/pom.xml b/pom.xml
index 311eeb0..82105bb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -89,6 +89,12 @@
 			<groupId>com.fasterxml.jackson.datatype</groupId>
 			<artifactId>jackson-datatype-jsr310</artifactId>
 		</dependency>
+		
+		<!-- commons -->
+		<dependency>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>commons-lang3</artifactId>
+		</dependency>
 
 		<!-- test -->
 		<dependency>
@@ -136,12 +142,6 @@
 			<scope>test</scope>
 		</dependency>
 
-		<!-- commons -->
-		<dependency>
-			<groupId>org.apache.commons</groupId>
-			<artifactId>commons-lang3</artifactId>
-		</dependency>
-
 	</dependencies>
 
 	<build>
diff --git a/src/main/java/de/ozgcloud/processor/command/CommandRemoteService.java b/src/main/java/de/ozgcloud/processor/command/CommandRemoteService.java
index 7f07dc8..6daf930 100644
--- a/src/main/java/de/ozgcloud/processor/command/CommandRemoteService.java
+++ b/src/main/java/de/ozgcloud/processor/command/CommandRemoteService.java
@@ -7,13 +7,13 @@ import de.ozgcloud.vorgang.grpc.command.GrpcGetCommandRequest;
 import lombok.RequiredArgsConstructor;
 import net.devh.boot.grpc.client.inject.GrpcClient;
 
-@Service
+@Service("processorManagerCommandService")
 @RequiredArgsConstructor
 class CommandRemoteService {
 
 	@GrpcClient("command-manager")
 	private final CommandServiceBlockingStub commandServiceStub;
-	private final CommandMapper mapper;
+	private final ProcessorManagerCommandMapper mapper;
 
 	public Command getCommand(String id) {
 		var grpcCommand = commandServiceStub.getCommand(buildRequest(id));
diff --git a/src/main/java/de/ozgcloud/processor/command/CommandService.java b/src/main/java/de/ozgcloud/processor/command/CommandService.java
index 4a3c6c6..61f293d 100644
--- a/src/main/java/de/ozgcloud/processor/command/CommandService.java
+++ b/src/main/java/de/ozgcloud/processor/command/CommandService.java
@@ -4,7 +4,7 @@ import org.springframework.stereotype.Service;
 
 import lombok.RequiredArgsConstructor;
 
-@Service
+@Service("processorCommandService")
 @RequiredArgsConstructor
 public class CommandService {
 
diff --git a/src/main/java/de/ozgcloud/processor/command/CommandMapper.java b/src/main/java/de/ozgcloud/processor/command/ProcessorManagerCommandMapper.java
similarity index 91%
rename from src/main/java/de/ozgcloud/processor/command/CommandMapper.java
rename to src/main/java/de/ozgcloud/processor/command/ProcessorManagerCommandMapper.java
index d3084d8..10021f0 100644
--- a/src/main/java/de/ozgcloud/processor/command/CommandMapper.java
+++ b/src/main/java/de/ozgcloud/processor/command/ProcessorManagerCommandMapper.java
@@ -9,7 +9,7 @@ import de.ozgcloud.processor.vorgang.VorgangId;
 import de.ozgcloud.vorgang.grpc.command.GrpcCommand;
 
 @Mapper
-interface CommandMapper {
+interface ProcessorManagerCommandMapper {
 
 	@Mapping(target = "order", source = "orderString")
 	Command fromGrpc(GrpcCommand command);
diff --git a/src/test/java/de/ozgcloud/processor/ProcessorITCase.java b/src/test/java/de/ozgcloud/processor/ProcessorITCase.java
new file mode 100644
index 0000000..9116dae
--- /dev/null
+++ b/src/test/java/de/ozgcloud/processor/ProcessorITCase.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.processor;
+
+import static org.awaitility.Awaitility.*;
+import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.*;
+
+import java.util.concurrent.TimeUnit;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
+
+import de.ozgcloud.command.VorgangCreatedEvent;
+import de.ozgcloud.common.test.ITCase;
+import de.ozgcloud.processor.processor.ProcessorService;
+import de.ozgcloud.processor.vorgang.Vorgang;
+import de.ozgcloud.processor.vorgang.VorgangId;
+import de.ozgcloud.processor.vorgang.VorgangService;
+import de.ozgcloud.processor.vorgang.VorgangTestFactory;
+
+//TODO:
+// - rebuild it as api-test
+// - build it as ProcessorManager-local test
+// ozg api lib mit in-process server unterstützen: https://stackoverflow.com/questions/71059894/does-grpc-have-a-channel-that-can-be-used-for-testing
+
+@SpringBootTest(properties = {
+		"ozgcloud.processors.0.name=test",
+		"ozgcloud.processors.0.address=http://localhost:8090/testprocessor",
+		"ozgcloud.processors.0.forms.0.formEngineName=testFormEngine",
+		"ozgcloud.processors.0.forms.0.formId=testForm",
+		"grpc.server.in-process-name=test",
+		"ozgcloud.command-manager.address=in-process:test",
+//}, classes = { VorgangManagerServerApplication.class })
+}, classes = { ProcessorTestApplication.class })
+//@WithMockCustomUser
+@ITCase
+@DirtiesContext
+@Disabled
+class ProcessorITCase {
+
+	@Autowired
+	private ApplicationEventPublisher publisher;
+
+	@MockitoBean
+	private VorgangService processorVorgangService;
+
+//	@MockitoBean
+//	private PostfachService postfachService;
+//	@MockitoBean
+//	private de.ozgcloud.notification.vorgang.VorgangService notificationService;
+//	@MockitoBean
+//	private UserNotificationEventListener userNotificationEventListener;
+//
+//	@MockitoBean
+//	private CommandService commandService;
+	@MockitoBean
+	private ProcessorService processorService;
+
+//	@Captor
+//	private ArgumentCaptor<CreateCommandRequest> requestCaptor;
+
+	@BeforeEach
+	void init() {
+		when(processorVorgangService.getVorgang(any())).thenReturn(buildVorgang());
+
+//		when(notificationService.getVorgang(any())).thenReturn(de.ozgcloud.notification.vorgang.Vorgang.builder().build());
+
+		when(processorService.processVorgang(any(), anyString())).thenThrow(RuntimeException.class);
+	}
+
+//	@BeforeEach
+//	void setupCommandService() {
+//		var commandBuilder = PersistedCommand.builder().id("42").status(CommandStatus.PENDING).createdAt(ZonedDateTime.now());
+//
+//		when(commandService.createCommand(any())).thenReturn(commandBuilder.build());
+//		when(commandService.findById("42"))
+//				.thenReturn(Optional.of(commandBuilder.status(CommandStatus.FINISHED).finishedAt(ZonedDateTime.now()).build()));
+//	}
+
+	@Test
+	void triggerProcessorOnNewVorgang() {
+		publisher.publishEvent(new VorgangCreatedEvent(VorgangTestFactory.ID.toString()));
+
+		await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> {
+			verify(processorVorgangService).getVorgang(any());
+//			verify(commandService).createCommand(requestCaptor.capture());
+		});
+//
+//		var request = requestCaptor.getValue();
+//		@SuppressWarnings("unchecked")
+//		Map<String, Object> item = (Map<String, Object>) request.getBodyObject().get("item");
+//		assertThat(item).containsEntry("text", "Es ist eine Fehler bei der Verarbeitung des Vorganges aufgetreten");
+	}
+
+	private Vorgang buildVorgang() {
+		return Vorgang.builder()
+				.id(VorgangId.from(de.ozgcloud.processor.vorgang.VorgangTestFactory.ID))
+				.formEngineName("testFormEngine")
+				.formId("testForm")
+				.build();
+	}
+}
diff --git a/src/test/java/de/ozgcloud/processor/command/CommandRemoteServiceTest.java b/src/test/java/de/ozgcloud/processor/command/CommandRemoteServiceTest.java
index 57c2a3c..290be1f 100644
--- a/src/test/java/de/ozgcloud/processor/command/CommandRemoteServiceTest.java
+++ b/src/test/java/de/ozgcloud/processor/command/CommandRemoteServiceTest.java
@@ -23,7 +23,7 @@ class CommandRemoteServiceTest {
 	@Mock
 	private CommandServiceBlockingStub stub;
 	@Mock
-	private CommandMapper mapper;
+	private ProcessorManagerCommandMapper mapper;
 
 	@Nested
 	class TestGetCommand {
-- 
GitLab