diff --git a/bescheid-manager/pom.xml b/bescheid-manager/pom.xml index 35e976b6cc75e8bb950488cb7da9c96f43703e21..f6cd1421180ed4d7e08fe4433797810e000c076c 100644 --- a/bescheid-manager/pom.xml +++ b/bescheid-manager/pom.xml @@ -18,7 +18,7 @@ <vorgang-manager.version>2.19.0-SNAPSHOT</vorgang-manager.version> <nachrichten-manager.version>2.14.0</nachrichten-manager.version> <document-manager.version>1.1.0</document-manager.version> - <api-lib.version>0.13.0</api-lib.version> + <api-lib.version>0.14.0</api-lib.version> <spring-cloud-config-client.version>4.1.3</spring-cloud-config-client.version> </properties> @@ -59,6 +59,7 @@ <groupId>de.ozgcloud.api-lib</groupId> <artifactId>api-lib-core</artifactId> <version>${api-lib.version}</version> + <scope>runtime</scope> </dependency> diff --git a/vorgang-manager-base/src/test/java/de/ozgcloud/vorgang/callcontext/CallContextHandleInterceptorTest.java b/vorgang-manager-base/src/test/java/de/ozgcloud/vorgang/callcontext/CallContextHandleInterceptorTest.java index 26912e9a3d7ad539301b711214037dcfdab92594..637608f8fdd521713691226b01175711485b817f 100644 --- a/vorgang-manager-base/src/test/java/de/ozgcloud/vorgang/callcontext/CallContextHandleInterceptorTest.java +++ b/vorgang-manager-base/src/test/java/de/ozgcloud/vorgang/callcontext/CallContextHandleInterceptorTest.java @@ -23,8 +23,6 @@ */ package de.ozgcloud.vorgang.callcontext; -import static de.ozgcloud.common.grpc.GrpcUtil.*; -import static de.ozgcloud.common.grpc.GrpcUtil.KEY_REQUEST_ID; import static de.ozgcloud.vorgang.callcontext.CallContextHandleInterceptor.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; @@ -38,6 +36,7 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.springframework.security.core.context.SecurityContextHolder; +import de.ozgcloud.common.grpc.GrpcUtil; import de.ozgcloud.vorgang.callcontext.CallContextHandleInterceptor.LogContextSettingListener; import io.grpc.Metadata; import io.grpc.ServerCall; @@ -71,7 +70,7 @@ class CallContextHandleInterceptorTest { @Test void shouldReturnNewRequestIdIfNoGiven() { - headers.removeAll(createKeyOf(KEY_REQUEST_ID)); + headers.removeAll(GrpcUtil.createKeyOf(GrpcUtil.KEY_REQUEST_ID)); var reqId = listener.getRequestId(); @@ -93,7 +92,7 @@ class CallContextHandleInterceptorTest { @Test void shouldFillOrgaIdCollection() { Metadata metadata = CallContextTestFactory.createMetadata(); - metadata.put(createKeyOf(KEY_ACCESS_LIMITED_ORGAID), "orgaid_2".getBytes()); + metadata.put(GrpcUtil.createKeyOf(KEY_ACCESS_LIMITED_ORGAID), "orgaid_2".getBytes()); var user = buildListener(metadata).createUser(); @@ -103,7 +102,7 @@ class CallContextHandleInterceptorTest { @Test void shouldFillEmptyListIfNoOrgaIds() { Metadata metadata = CallContextTestFactory.createMetadata(); - metadata.removeAll(createKeyOf(KEY_ACCESS_LIMITED_ORGAID)); + metadata.removeAll(GrpcUtil.createKeyOf(KEY_ACCESS_LIMITED_ORGAID)); var user = buildListener(metadata).createUser(); @@ -126,7 +125,7 @@ class CallContextHandleInterceptorTest { @Test void shouldMapFalseIfKeyIsNotPresent() { var metadata = CallContextTestFactory.createMetadata(); - metadata.removeAll(createKeyOf(KEY_ACCESS_LIMITED)); + metadata.removeAll(GrpcUtil.createKeyOf(KEY_ACCESS_LIMITED)); var user = buildListener(metadata).createUser(); diff --git a/vorgang-manager-base/src/test/java/de/ozgcloud/vorgang/callcontext/VorgangManagerClientCallContextAttachingInterceptorTest.java b/vorgang-manager-base/src/test/java/de/ozgcloud/vorgang/callcontext/VorgangManagerClientCallContextAttachingInterceptorTest.java index 1598d49820d50e0da5a80b634ad8709252871bdb..28d15003242cad91c1602b40c4b64cc0eefb6e95 100644 --- a/vorgang-manager-base/src/test/java/de/ozgcloud/vorgang/callcontext/VorgangManagerClientCallContextAttachingInterceptorTest.java +++ b/vorgang-manager-base/src/test/java/de/ozgcloud/vorgang/callcontext/VorgangManagerClientCallContextAttachingInterceptorTest.java @@ -24,7 +24,6 @@ package de.ozgcloud.vorgang.callcontext; import static de.ozgcloud.common.grpc.GrpcUtil.*; -import static de.ozgcloud.common.grpc.GrpcUtil.KEY_REQUEST_ID; import static de.ozgcloud.vorgang.callcontext.VorgangManagerClientCallContextAttachingInterceptor.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; @@ -38,6 +37,7 @@ import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; +import de.ozgcloud.common.grpc.GrpcUtil; import io.grpc.CallOptions; import io.grpc.Channel; import io.grpc.ClientCall; @@ -77,14 +77,14 @@ class VorgangManagerClientCallContextAttachingInterceptorTest { void shouldAddClientName() { var addedMetadata = interceptCall(); - assertThat(addedMetadata.get(createKeyOf(KEY_CLIENT_NAME))).isEqualTo(VORGANG_MANAGER_CLIENT_NAME.getBytes()); + assertThat(addedMetadata.get(GrpcUtil.createKeyOf(KEY_CLIENT_NAME))).isEqualTo(VORGANG_MANAGER_CLIENT_NAME.getBytes()); } @Test void shouldAddRequestId() { var addedMetadata = interceptCall(); - assertThat(addedMetadata.get(createKeyOf(KEY_REQUEST_ID))).isNotNull(); + assertThat(addedMetadata.get(GrpcUtil.createKeyOf(GrpcUtil.KEY_REQUEST_ID))).isNotNull(); } private Metadata interceptCall() { diff --git a/vorgang-manager-server/pom.xml b/vorgang-manager-server/pom.xml index 106d6e0781303cc68056859ca7768b4e5853cbf0..7a26e6b46d773d2471e2af8a4a7f70811103b6cf 100644 --- a/vorgang-manager-server/pom.xml +++ b/vorgang-manager-server/pom.xml @@ -298,6 +298,17 @@ <scope>test</scope> </dependency> + <dependency> + <groupId>de.ozgcloud.api-lib</groupId> + <artifactId>ozg-cloud-spring-boot-starter</artifactId> + <version>${api-lib.version}</version> + </dependency> + <dependency> + <groupId>de.ozgcloud.api-lib</groupId> + <artifactId>api-lib-core</artifactId> + <version>${api-lib.version}</version> + </dependency> + <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/archive/ArchiveManagerITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/archive/ArchiveManagerITCase.java new file mode 100644 index 0000000000000000000000000000000000000000..6707c3a27418d4f522ff5ada52b65147a1457f95 --- /dev/null +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/archive/ArchiveManagerITCase.java @@ -0,0 +1,190 @@ +/* + * Copyright (C) 2024 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.archive; + +import static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.fail; +import static org.mockito.Mockito.*; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.SpyBean; +import org.springframework.data.mongodb.core.MongoOperations; +import org.springframework.test.annotation.DirtiesContext; + +import com.google.protobuf.ByteString; + +import de.ozgcloud.archive.attributes.ClientAttributeService; +import de.ozgcloud.archive.common.callcontext.CallContextUser; +import de.ozgcloud.archive.grpc.export.ExportServiceGrpc.ExportServiceBlockingStub; +import de.ozgcloud.archive.grpc.export.GrpcExportVorgangRequest; +import de.ozgcloud.command.CommandStatus; +import de.ozgcloud.common.test.DataITCase; +import de.ozgcloud.vorgang.VorgangManagerServerApplication; +import de.ozgcloud.vorgang.callcontext.TestCallContextAttachingInterceptor; +import de.ozgcloud.vorgang.callcontext.WithMockCustomUser; +import de.ozgcloud.vorgang.clientattribute.ClientAttribute; +import de.ozgcloud.vorgang.command.CommandService; +import de.ozgcloud.vorgang.command.CreateCommandRequest; +import de.ozgcloud.vorgang.vorgang.EingangTestFactory; +import de.ozgcloud.vorgang.vorgang.Vorgang; +import de.ozgcloud.vorgang.vorgang.VorgangService; +import de.ozgcloud.vorgang.vorgang.VorgangTestFactory; +import net.devh.boot.grpc.client.inject.GrpcClient; + +@SpringBootTest(classes = VorgangManagerServerApplication.class, properties = { + "grpc.server.inProcessName=test", + "grpc.client.vorgang-manager.address=in-process:test", + "grpc.client.file-manager.address=in-process:test", + "grpc.client.ozgcloud-command-manager.address=in-process:test", + "grpc.client.inProcess.address=in-process:test", +}) +@DataITCase +@DirtiesContext +@WithMockCustomUser +public class ArchiveManagerITCase { + + @Autowired + private CommandService commandService; + @Autowired + private MongoOperations mongoOperations; + @Autowired + private VorgangService vorgangService; + @SpyBean + private TestArchiveEventListener archiveEventListener; + + private Vorgang vorgang; + + @BeforeEach + void init() { + mongoOperations.dropCollection(Vorgang.COLLECTION_NAME); + } + + @Nested + class TestArchiveVorgang { + + @BeforeEach + void init() { + vorgang = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).version(0).build()); + } + + @Test + void shouldSetArchiveClientAttribute() { + commandService.createCommand(buildArchiveVorgangCommand()); + + verify(archiveEventListener, timeout(60_000)).onVorgangLockedEvent(any()); + + var updatedVorgang = mongoOperations.findById(vorgang.getId(), Vorgang.class); + assertThat(getArchivingClientAttribute(updatedVorgang).getBoolValue()).contains(true); + } + + @Test + void shouldLockVorgang() { + commandService.createCommand(buildArchiveVorgangCommand()); + + verify(archiveEventListener, timeout(60_000)).onVorgangLockedEvent(any()); + + assertThat(vorgangService.isVorgangLocked(vorgang.getId())).isTrue(); + } + + @Test + void shouldNotFinishParentCommand() { + var archiveVorgangCommand = commandService.createCommand(buildArchiveVorgangCommand()); + + verify(archiveEventListener, timeout(60_000)).onVorgangLockedEvent(any()); + + var parentCommand = commandService.getById(archiveVorgangCommand.getId()); + assertThat(parentCommand.getStatus()).isEqualTo(CommandStatus.PENDING); + } + + private CreateCommandRequest buildArchiveVorgangCommand() { + return CreateCommandRequest.builder() + .order("ARCHIVE_VORGANG") + .vorgangId(vorgang.getId()) + .relationId(vorgang.getId()) + .relationVersion(vorgang.getVersion()) + .build(); + } + + private ClientAttribute getArchivingClientAttribute(Vorgang vorgang) { + var archiveAttributes = vorgang.getClientAttributes().get(CallContextUser.ARCHIVE_MANAGER_CLIENT_NAME); + assertThat(archiveAttributes).isNotNull(); + return archiveAttributes.get(ClientAttributeService.ATTRIBUTE_NAME_ANTRAG_ARCHIVING); + } + } + + @Nested + class TestExportVorgang { + + @GrpcClient("inProcess") + private ExportServiceBlockingStub exportClient; + + @BeforeEach + void init() { + vorgang = mongoOperations.save(buildVorgang()); + } + + @Test + void shouldExportVorgang() { + var result = exportVorgang(); + + assertThat(result.fileName()).endsWith("_Abgabe.Abgabe.0401.xdomea"); + assertThat(result.content()).isNotEmpty(); + } + + private ExportServiceBlockingStub getExportClient() { + return exportClient.withInterceptors(new TestCallContextAttachingInterceptor()); + } + + private Vorgang buildVorgang() { + return VorgangTestFactory.createBuilder().id(null).version(0).clearEingangs() + .eingang(EingangTestFactory.createBuilder().clearRepresentations().clearAttachments().build()) + .build(); + } + + private ExportResult exportVorgang() { + var result = getExportClient().exportVorgang(GrpcExportVorgangRequest.newBuilder().setVorgangId(vorgang.getId()).build()); + var fileName = result.next().getVorgangFile().getFileName(); + var content = new ByteArrayOutputStream(); + while (result.hasNext()) { + ByteString chunkContent = result.next().getVorgangFile().getFileContent(); + try { + content.write(chunkContent.toByteArray()); + } catch (IOException e) { + fail(e); + } + } + return new ExportResult(fileName, content.toByteArray()); + } + + private record ExportResult(String fileName, byte[] content) { + } + } +} diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/archive/TestArchiveEventListener.java b/vorgang-manager-server/src/test/java/de/ozgcloud/archive/TestArchiveEventListener.java new file mode 100644 index 0000000000000000000000000000000000000000..b05e0b4c93a87bc97e57d264f04b8b2ac42b66f9 --- /dev/null +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/archive/TestArchiveEventListener.java @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2024 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.archive; + +import org.springframework.context.event.EventListener; + +import de.ozgcloud.command.VorgangLockedEvent; + +public class TestArchiveEventListener { + + @EventListener + public void onVorgangLockedEvent(VorgangLockedEvent event) { + } +} diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachMailITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachMailITCase.java index 45c4d3a7ddba762f9f86c7571ed3755b29848c86..50f9f4eb563236de6d0280fdb1d1e16961d9ac3e 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachMailITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachMailITCase.java @@ -77,6 +77,7 @@ import io.grpc.stub.StreamObserver; "grpc.server.in-process-name=postfachitcase", "grpc.client.ozgcloud-command-manager.address=in-process:postfachitcase", "grpc.client.command-manager.address=in-process:postfachitcase", + "grpc.client.-manager.address=in-process:postfachitcase", "grpc.client.pluto.address=in-process:postfachitcase", "ozgcloud.osi.postfach.proxyapi.url=http://localhost/ApiProxy/V1/Message", "ozgcloud.osi.postfach.proxyapi.key=1234", diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/CollaborationITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/CollaborationITCase.java index f73ea147c5bebaf8475ec0fa9206f26780363d4b..f9080eeb102b8b84a91d883d38aaad7a42397c73 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/CollaborationITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/CollaborationITCase.java @@ -24,7 +24,6 @@ package de.ozgcloud.vorgang.collaboration; import static org.assertj.core.api.Assertions.*; -import static org.assertj.core.api.InstanceOfAssertFactories.*; import static org.awaitility.Awaitility.*; import static org.junit.jupiter.api.Assertions.fail; import static org.mockito.ArgumentMatchers.*; diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/user/VorgangManagerCallContextAttachingInterceptorTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/user/VorgangManagerCallContextAttachingInterceptorTest.java index a918e29412eb0103ced498d95b5a6379dd037650..7b050894a0dde18a85c69e03cd070bdd5cdd56f2 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/user/VorgangManagerCallContextAttachingInterceptorTest.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/user/VorgangManagerCallContextAttachingInterceptorTest.java @@ -15,6 +15,7 @@ import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; +import de.ozgcloud.common.grpc.GrpcUtil; import io.grpc.CallOptions; import io.grpc.Channel; import io.grpc.ClientCall; @@ -68,7 +69,7 @@ class VorgangManagerCallContextAttachingInterceptorTest { void shouldAddRequestId() { var addedMetadata = interceptCall(); - assertThat(addedMetadata.get(createKeyOf(KEY_REQUEST_ID))).isNotNull(); + assertThat(addedMetadata.get(createKeyOf(GrpcUtil.KEY_REQUEST_ID))).isNotNull(); } private Metadata interceptCall() {