Skip to content
Snippets Groups Projects
Commit 63348d56 authored by OZGCloud's avatar OZGCloud
Browse files

Merge pull request 'OZG-6990 Archivierung: Vorgang auf in Archivierung setzen'...

Merge pull request 'OZG-6990 Archivierung: Vorgang auf in Archivierung setzen' (#506) from OZG-6990-VorgangAufInArchivierungSetzen into master

Reviewed-on: https://git.ozg-sh.de/ozgcloud-app/vorgang-manager/pulls/506


Reviewed-by: default avatarOZGCloud <ozgcloud@mgm-tp.com>
parents cfba60cb 87f1ff38
No related branches found
No related tags found
No related merge requests found
Showing
with 249 additions and 12 deletions
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
<vorgang-manager.version>2.19.0-SNAPSHOT</vorgang-manager.version> <vorgang-manager.version>2.19.0-SNAPSHOT</vorgang-manager.version>
<nachrichten-manager.version>2.14.0</nachrichten-manager.version> <nachrichten-manager.version>2.14.0</nachrichten-manager.version>
<document-manager.version>1.1.0</document-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> <spring-cloud-config-client.version>4.1.3</spring-cloud-config-client.version>
</properties> </properties>
...@@ -59,6 +59,7 @@ ...@@ -59,6 +59,7 @@
<groupId>de.ozgcloud.api-lib</groupId> <groupId>de.ozgcloud.api-lib</groupId>
<artifactId>api-lib-core</artifactId> <artifactId>api-lib-core</artifactId>
<version>${api-lib.version}</version> <version>${api-lib.version}</version>
<scope>runtime</scope>
</dependency> </dependency>
......
...@@ -23,8 +23,6 @@ ...@@ -23,8 +23,6 @@
*/ */
package de.ozgcloud.vorgang.callcontext; 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 de.ozgcloud.vorgang.callcontext.CallContextHandleInterceptor.*;
import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*; import static org.mockito.ArgumentMatchers.*;
...@@ -38,6 +36,7 @@ import org.mockito.InjectMocks; ...@@ -38,6 +36,7 @@ import org.mockito.InjectMocks;
import org.mockito.Mock; import org.mockito.Mock;
import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolder;
import de.ozgcloud.common.grpc.GrpcUtil;
import de.ozgcloud.vorgang.callcontext.CallContextHandleInterceptor.LogContextSettingListener; import de.ozgcloud.vorgang.callcontext.CallContextHandleInterceptor.LogContextSettingListener;
import io.grpc.Metadata; import io.grpc.Metadata;
import io.grpc.ServerCall; import io.grpc.ServerCall;
...@@ -71,7 +70,7 @@ class CallContextHandleInterceptorTest { ...@@ -71,7 +70,7 @@ class CallContextHandleInterceptorTest {
@Test @Test
void shouldReturnNewRequestIdIfNoGiven() { void shouldReturnNewRequestIdIfNoGiven() {
headers.removeAll(createKeyOf(KEY_REQUEST_ID)); headers.removeAll(GrpcUtil.createKeyOf(GrpcUtil.KEY_REQUEST_ID));
var reqId = listener.getRequestId(); var reqId = listener.getRequestId();
...@@ -93,7 +92,7 @@ class CallContextHandleInterceptorTest { ...@@ -93,7 +92,7 @@ class CallContextHandleInterceptorTest {
@Test @Test
void shouldFillOrgaIdCollection() { void shouldFillOrgaIdCollection() {
Metadata metadata = CallContextTestFactory.createMetadata(); 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(); var user = buildListener(metadata).createUser();
...@@ -103,7 +102,7 @@ class CallContextHandleInterceptorTest { ...@@ -103,7 +102,7 @@ class CallContextHandleInterceptorTest {
@Test @Test
void shouldFillEmptyListIfNoOrgaIds() { void shouldFillEmptyListIfNoOrgaIds() {
Metadata metadata = CallContextTestFactory.createMetadata(); Metadata metadata = CallContextTestFactory.createMetadata();
metadata.removeAll(createKeyOf(KEY_ACCESS_LIMITED_ORGAID)); metadata.removeAll(GrpcUtil.createKeyOf(KEY_ACCESS_LIMITED_ORGAID));
var user = buildListener(metadata).createUser(); var user = buildListener(metadata).createUser();
...@@ -126,7 +125,7 @@ class CallContextHandleInterceptorTest { ...@@ -126,7 +125,7 @@ class CallContextHandleInterceptorTest {
@Test @Test
void shouldMapFalseIfKeyIsNotPresent() { void shouldMapFalseIfKeyIsNotPresent() {
var metadata = CallContextTestFactory.createMetadata(); var metadata = CallContextTestFactory.createMetadata();
metadata.removeAll(createKeyOf(KEY_ACCESS_LIMITED)); metadata.removeAll(GrpcUtil.createKeyOf(KEY_ACCESS_LIMITED));
var user = buildListener(metadata).createUser(); var user = buildListener(metadata).createUser();
......
...@@ -24,7 +24,6 @@ ...@@ -24,7 +24,6 @@
package de.ozgcloud.vorgang.callcontext; package de.ozgcloud.vorgang.callcontext;
import static de.ozgcloud.common.grpc.GrpcUtil.*; 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 de.ozgcloud.vorgang.callcontext.VorgangManagerClientCallContextAttachingInterceptor.*;
import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*; import static org.mockito.ArgumentMatchers.*;
...@@ -38,6 +37,7 @@ import org.mockito.Captor; ...@@ -38,6 +37,7 @@ import org.mockito.Captor;
import org.mockito.InjectMocks; import org.mockito.InjectMocks;
import org.mockito.Mock; import org.mockito.Mock;
import de.ozgcloud.common.grpc.GrpcUtil;
import io.grpc.CallOptions; import io.grpc.CallOptions;
import io.grpc.Channel; import io.grpc.Channel;
import io.grpc.ClientCall; import io.grpc.ClientCall;
...@@ -77,14 +77,14 @@ class VorgangManagerClientCallContextAttachingInterceptorTest { ...@@ -77,14 +77,14 @@ class VorgangManagerClientCallContextAttachingInterceptorTest {
void shouldAddClientName() { void shouldAddClientName() {
var addedMetadata = interceptCall(); 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 @Test
void shouldAddRequestId() { void shouldAddRequestId() {
var addedMetadata = interceptCall(); var addedMetadata = interceptCall();
assertThat(addedMetadata.get(createKeyOf(KEY_REQUEST_ID))).isNotNull(); assertThat(addedMetadata.get(GrpcUtil.createKeyOf(GrpcUtil.KEY_REQUEST_ID))).isNotNull();
} }
private Metadata interceptCall() { private Metadata interceptCall() {
......
...@@ -298,6 +298,17 @@ ...@@ -298,6 +298,17 @@
<scope>test</scope> <scope>test</scope>
</dependency> </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> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId> <artifactId>spring-boot-starter-test</artifactId>
......
/*
* 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) {
}
}
}
/*
* 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) {
}
}
...@@ -77,6 +77,7 @@ import io.grpc.stub.StreamObserver; ...@@ -77,6 +77,7 @@ import io.grpc.stub.StreamObserver;
"grpc.server.in-process-name=postfachitcase", "grpc.server.in-process-name=postfachitcase",
"grpc.client.ozgcloud-command-manager.address=in-process:postfachitcase", "grpc.client.ozgcloud-command-manager.address=in-process:postfachitcase",
"grpc.client.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", "grpc.client.pluto.address=in-process:postfachitcase",
"ozgcloud.osi.postfach.proxyapi.url=http://localhost/ApiProxy/V1/Message", "ozgcloud.osi.postfach.proxyapi.url=http://localhost/ApiProxy/V1/Message",
"ozgcloud.osi.postfach.proxyapi.key=1234", "ozgcloud.osi.postfach.proxyapi.key=1234",
......
...@@ -24,7 +24,6 @@ ...@@ -24,7 +24,6 @@
package de.ozgcloud.vorgang.collaboration; package de.ozgcloud.vorgang.collaboration;
import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.Assertions.*;
import static org.assertj.core.api.InstanceOfAssertFactories.*;
import static org.awaitility.Awaitility.*; import static org.awaitility.Awaitility.*;
import static org.junit.jupiter.api.Assertions.fail; import static org.junit.jupiter.api.Assertions.fail;
import static org.mockito.ArgumentMatchers.*; import static org.mockito.ArgumentMatchers.*;
......
...@@ -15,6 +15,7 @@ import org.mockito.Captor; ...@@ -15,6 +15,7 @@ import org.mockito.Captor;
import org.mockito.InjectMocks; import org.mockito.InjectMocks;
import org.mockito.Mock; import org.mockito.Mock;
import de.ozgcloud.common.grpc.GrpcUtil;
import io.grpc.CallOptions; import io.grpc.CallOptions;
import io.grpc.Channel; import io.grpc.Channel;
import io.grpc.ClientCall; import io.grpc.ClientCall;
...@@ -68,7 +69,7 @@ class VorgangManagerCallContextAttachingInterceptorTest { ...@@ -68,7 +69,7 @@ class VorgangManagerCallContextAttachingInterceptorTest {
void shouldAddRequestId() { void shouldAddRequestId() {
var addedMetadata = interceptCall(); var addedMetadata = interceptCall();
assertThat(addedMetadata.get(createKeyOf(KEY_REQUEST_ID))).isNotNull(); assertThat(addedMetadata.get(createKeyOf(GrpcUtil.KEY_REQUEST_ID))).isNotNull();
} }
private Metadata interceptCall() { private Metadata interceptCall() {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment