diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/collaboration/CollaborationService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/collaboration/CollaborationService.java index 2ac1a1e277bb6cdadfea950cefeb4ddea589ce97..7afd28a3be542ed4c8a5bfb8651dfabc59f969c4 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/collaboration/CollaborationService.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/collaboration/CollaborationService.java @@ -38,11 +38,10 @@ public class CollaborationService { public String createCollaborationVorgang(CollaborationRequest request) { var vorgang = updateVorgang(vorgangService.getById(request.getVorgangId()), request); - return vorgangService.createVorgang(vorgang); + return vorgangService.createVorgangSilent(vorgang); } Vorgang updateVorgang(Vorgang vorgang, CollaborationRequest request) { - vorgang.getClientAttributes().clear(); return vorgang.toBuilder() .header(updateHeader(vorgang.getHeader(), request)) .build(); diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangService.java index 172138a213608eaf6ee332fbc2673281e784180e..4e6b37051239340631d052eb5657620a73fff729 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangService.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangService.java @@ -129,14 +129,23 @@ public class VorgangService { return vorgang.toBuilder().clearEingangs().eingang(eingang); } - public String createVorgang(Vorgang vorgang) { + public String createVorgangSilent(Vorgang vorgang) { var mappedEingang = kopControlDataMapper.moveLabelsToControlData(vorgang.getEingangs().getFirst()); - var modifiedBuilder = vorgang.toBuilder().id(null).version(0).inCreation(false).clearEingangs().eingang(mappedEingang).build(); - var result = repository.save(modifiedBuilder); - publishVorgangeCreatedEvent(result); + var result = repository.save(createVorgangCopy(vorgang, mappedEingang)); return result.getId(); } + Vorgang createVorgangCopy(Vorgang vorgang, Eingang eingang) { + return Vorgang.builder() + .name(vorgang.getName()) + .nummer(vorgang.getNummer()) + .formEngineName(vorgang.getFormEngineName()) + .aktenzeichen(vorgang.getAktenzeichen()) + .header(vorgang.getHeader()) + .eingang(eingang) + .forwardings(vorgang.getForwardings()) + .build(); + } private void publishVorgangeCreatedEvent(Vorgang vorgang) { publisher.publishEvent(new VorgangCreatedEvent(vorgang.getId())); } 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 new file mode 100644 index 0000000000000000000000000000000000000000..4a89482ef8b80bd443d1d30a9da2b881d12fb491 --- /dev/null +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/CollaborationITCase.java @@ -0,0 +1,168 @@ +/* + * 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.vorgang.collaboration; + +import static org.assertj.core.api.Assertions.*; +import static org.awaitility.Awaitility.*; +import static org.mockito.Mockito.*; + +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.data.mongodb.core.MongoOperations; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.test.annotation.DirtiesContext; + +import de.ozgcloud.apilib.user.OzgCloudUserId; +import de.ozgcloud.apilib.user.OzgCloudUserProfile; +import de.ozgcloud.apilib.user.OzgCloudUserProfileService; +import de.ozgcloud.command.Command; +import de.ozgcloud.command.CommandStatus; +import de.ozgcloud.common.test.DataITCase; +import de.ozgcloud.vorgang.attached_item.VorgangAttachedItem; +import de.ozgcloud.vorgang.callcontext.CallContext; +import de.ozgcloud.vorgang.callcontext.WithMockCustomUser; +import de.ozgcloud.vorgang.command.CommandService; +import de.ozgcloud.vorgang.command.CommandTestFactory; +import de.ozgcloud.vorgang.command.CreateCommandRequest; +import de.ozgcloud.vorgang.vorgang.Vorgang; +import de.ozgcloud.vorgang.vorgang.VorgangHead; +import de.ozgcloud.vorgang.vorgang.VorgangTestFactory; + +@SpringBootTest(properties = { + "grpc.server.inProcessName=test", + "grpc.client.vorgang-manager.address=in-process:test", + "grpc.client.ozgcloud-command-manager.address=in-process:test", +}) +@DataITCase +@WithMockCustomUser +@DirtiesContext +class CollaborationITCase { + + @Autowired + private CommandService commandService; + + @Autowired + private MongoOperations mongoOperations; + + @MockBean + private OzgCloudUserProfileService ozgCloudUserProfileService; + @Mock + private OzgCloudUserProfile ozgCloudUserProfile; + + @BeforeEach + void init() { + mongoOperations.dropCollection(Command.class); + mongoOperations.dropCollection(Vorgang.class); + mongoOperations.dropCollection(VorgangAttachedItem.class); + when(ozgCloudUserProfile.getId()).thenReturn(OzgCloudUserId.from(CommandTestFactory.CREATED_BY)); + when(ozgCloudUserProfileService.getById(any())).thenReturn(ozgCloudUserProfile); + } + + @Nested + class TestCreateCollaborationVorgang { + + private static final String FIELD_COLLABORATION_VORGANG_ID = "collaborationVorgangId"; + private static final String TITEL = "Collaboration Vorgang"; + private static final String ANFRAGE = "Anfrage"; + private static final String ZUSTAENDIGE_STELLE = UUID.randomUUID().toString(); + + private String vorgangId; + + @BeforeEach + void init() { + vorgangId = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).version(0L).build()).getId(); + } + + @Test + void shouldSetCollaborationVorgangId() { + var command = commandService.createCommand(buildCreateCollaborationVorgangCommand(vorgangId)); + + waitUntilCommandFinished(command.getId()); + + var collaborationRequests = loadCollaborationRequest(vorgangId); + assertThat(collaborationRequests).hasSize(1).first().extracting(VorgangAttachedItem::getItem, MAP) + .containsKey(FIELD_COLLABORATION_VORGANG_ID); + } + + @Test + void shouldCreateCollaborationVorgang() { + var command = commandService.createCommand(buildCreateCollaborationVorgangCommand(vorgangId)); + + waitUntilCommandFinished(command.getId()); + + var collaborationVorgang = loadCollaborationVorgang(vorgangId); + assertThat(collaborationVorgang.getHeader()).extracting(VorgangHead::getCollaborationLevel) + .isEqualTo(CollaborationRequestTestFactory.COLLABORATION_LEVEL); + assertThat(collaborationVorgang.getHeader()).extracting(VorgangHead::getOrganisationsEinheitId) + .isEqualTo(CollaborationRequestTestFactory.ZUSTAENDIGE_STELLE); + assertThat(collaborationVorgang.getClientAttributes()).isEmpty(); + } + + private CreateCommandRequest buildCreateCollaborationVorgangCommand(String vorgangId) { + return CreateCommandRequest.builder() + .callContext(CallContext.builder().client("test").build()) + .vorgangId(vorgangId) + .relationId(vorgangId) + .order("CREATE_COLLABORATION_REQUEST") + .bodyObject(Map.of( + "titel", TITEL, + "anfrage", ANFRAGE, + "zustaendigeStelle", CollaborationRequestTestFactory.ZUSTAENDIGE_STELLE + )) + .build(); + } + + private void waitUntilCommandFinished(String commandId) { + await().atMost(5, TimeUnit.SECONDS).until( + () -> mongoOperations.findById(commandId, Command.class), + command -> command.getStatus() == CommandStatus.FINISHED + ); + } + + private Vorgang loadCollaborationVorgang(String sourceVorgangId) { + var collaborationVorgangId = loadCollaborationRequest(sourceVorgangId).getFirst().getItem().get(FIELD_COLLABORATION_VORGANG_ID); + return mongoOperations.findById(collaborationVorgangId, Vorgang.class); + } + + private List<VorgangAttachedItem> loadCollaborationRequest(String vorgangId) { + var query = new Query(new Criteria().andOperator( + Criteria.where("vorgangId").is(vorgangId), + Criteria.where("itemName").is("CollaborationRequest") + )); + return mongoOperations.find(query, VorgangAttachedItem.class); + } + } + +} \ No newline at end of file diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/CollaborationServiceTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/CollaborationServiceTest.java index 07cc14f7840e896df34a84096a96707e48da1cb0..7e2ab2c24e670d8205c28280e68076d5c5a8cafd 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/CollaborationServiceTest.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/CollaborationServiceTest.java @@ -62,7 +62,7 @@ class CollaborationServiceTest { @BeforeEach void init() { when(vorgangService.getById(any())).thenReturn(loadedVorgang); - when(vorgangService.createVorgang(any())).thenReturn(COLLABORATION_VORGANG_ID); + when(vorgangService.createVorgangSilent(any())).thenReturn(COLLABORATION_VORGANG_ID); doReturn(modifiedVorgang).when(service).updateVorgang(any(), any()); } @@ -84,7 +84,7 @@ class CollaborationServiceTest { void shouldCallCreateVorgang() { createCollaborationVorgang(); - verify(vorgangService).createVorgang(modifiedVorgang); + verify(vorgangService).createVorgangSilent(modifiedVorgang); } @Test @@ -108,13 +108,6 @@ class CollaborationServiceTest { @Mock private VorgangHead updatedHead; - @Test - void shouldRemoveClientAttributes() { - var result = modifyVorgang(); - - assertThat(result.getClientAttributes()).isEmpty(); - } - @Test void shouldCallUpdateHeader() { modifyVorgang(); diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangServiceTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangServiceTest.java index 82b54fb91cf1cd94faaca488f313e3971a8f0504..d23a82274596be343dc089c5a1367637c74e4e88 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangServiceTest.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangServiceTest.java @@ -53,6 +53,7 @@ import de.ozgcloud.vorgang.command.CommandTestFactory; import de.ozgcloud.vorgang.common.errorhandling.NotFoundException; import de.ozgcloud.vorgang.servicekonto.ServiceKontoTestFactory; import de.ozgcloud.vorgang.vorgang.redirect.ForwardingService; +import de.ozgcloud.vorgang.vorgang.redirect.ForwardingTestFactory; class VorgangServiceTest { @@ -291,7 +292,7 @@ class VorgangServiceTest { } @Nested - class TestCreateVorgang { + class TestCreateVorgangSilent { private static final Eingang EINGANG = EingangTestFactory.create(); private static final Vorgang SRC_VORGANG = VorgangTestFactory.createBuilder().clientAttributes(null).clearEingangs().eingang(EINGANG).build(); @@ -301,17 +302,15 @@ class VorgangServiceTest { private Eingang mappedEingang; @Mock private Vorgang createdVorgang; - - @Captor - private ArgumentCaptor<Vorgang> vorgangCaptor; - @Captor - private ArgumentCaptor<VorgangCreatedEvent> eventCaptor; + @Mock + private Vorgang vorgangCopy; @BeforeEach void init() { when(kopControlDataMapper.moveLabelsToControlData(any(Eingang.class))).thenReturn(mappedEingang); when(createdVorgang.getId()).thenReturn(CREATED_VORGANG_ID); when(repository.save(any())).thenReturn(createdVorgang); + doReturn(vorgangCopy).when(service).createVorgangCopy(any(), any()); } @Test @@ -322,54 +321,142 @@ class VorgangServiceTest { } @Test - void shouldResetIdBeforeSave() { + void shouldCallCreateVorgangCopy() { createVorgang(); - verify(repository).save(vorgangCaptor.capture()); - assertThat(vorgangCaptor.getValue().getId()).isNull(); + verify(service).createVorgangCopy(SRC_VORGANG, mappedEingang); } @Test - void shouldResetVersionBeforeSave() { + void shouldNotPublishVorgangCreatedEvent() { createVorgang(); - verify(repository).save(vorgangCaptor.capture()); - assertThat(vorgangCaptor.getValue().getVersion()).isEqualTo(0); + verify(publisher, never()).publishEvent(any(VorgangCreatedEvent.class)); } @Test - void shouldSetInCreationFalse() { + void shouldCallSaveVorgang() { createVorgang(); - verify(repository).save(vorgangCaptor.capture()); - assertThat(vorgangCaptor.getValue().isInCreation()).isFalse(); + verify(repository).save(vorgangCopy); } @Test - void shouldSetMappedEingang() { - createVorgang(); + void shouldReturnCreatedVorgangId() { + var result = createVorgang(); - verify(repository).save(vorgangCaptor.capture()); - assertThat(vorgangCaptor.getValue().getEingangs()).hasSize(1).first().isEqualTo(mappedEingang); + assertThat(result).isEqualTo(CREATED_VORGANG_ID); } + private String createVorgang() { + return service.createVorgangSilent(SRC_VORGANG); + } + } + + @Nested + class TestCreateVorgangCopy { + + @Mock + private Eingang eingang; + @Test - void shouldPublishVorgangCreatedEvent() { - createVorgang(); + void shouldNotCopyId() { + var result = createVorgangCopy(); - verify(publisher).publishEvent(eventCaptor.capture()); - assertThat(eventCaptor.getValue().getSource()).isEqualTo(CREATED_VORGANG_ID); + assertThat(result.getId()).isNull(); } @Test - void shouldReturnCreatedVorgangId() { - var result = createVorgang(); + void shouldNotCopyVersion() { + var result = createVorgangCopy(); - assertThat(result).isEqualTo(CREATED_VORGANG_ID); + assertThat(result.getVersion()).isZero(); } - private String createVorgang() { - return service.createVorgang(SRC_VORGANG); + @Test + void shouldSetInCreationFalse() { + var result = createVorgangCopy(); + + assertThat(result.isInCreation()).isFalse(); + } + + @Test + void shouldNotCopyStatus() { + var result = createVorgangCopy(); + + assertThat(result.getStatus()).isEqualTo(Vorgang.Status.NEU); + } + + @Test + void shouldNotCopyAssignedTo() { + var result = createVorgangCopy(); + + assertThat(result.getAssignedTo()).isNull(); + } + + @Test + void shouldNotCopyClientAttributes() { + var result = createVorgangCopy(); + + assertThat(result.getClientAttributes()).isEmpty(); + } + + @Test + void shouldCopyName() { + var result = createVorgangCopy(); + + assertThat(result.getName()).isEqualTo(VorgangTestFactory.NAME); + } + + @Test + void shouldCopyNummer() { + var result = createVorgangCopy(); + + assertThat(result.getNummer()).isEqualTo(VorgangTestFactory.VORGANG_NUMMER); + } + + @Test + void shouldSetFormEngineName() { + var result = service.createVorgangCopy(VorgangTestFactory.createBuilder().formEngineName(VorgangTestFactory.FORM_ENGINE_NAME).build(), + eingang); + + assertThat(result.getFormEngineName()).isEqualTo(VorgangTestFactory.FORM_ENGINE_NAME); + } + + @Test + void shouldCopyAktenzeichen() { + var result = createVorgangCopy(); + + assertThat(result.getAktenzeichen()).isEqualTo(VorgangTestFactory.AKTENZEICHEN); + } + + @Test + void shouldCopyHeader() { + var header = VorgangHeadTestFactory.create(); + + var result = service.createVorgangCopy(VorgangTestFactory.createBuilder().header(header).build(), eingang); + + assertThat(result.getHeader()).isEqualTo(header); + } + + @Test + void shouldSetEingang() { + var result = createVorgangCopy(); + + assertThat(result.getEingangs()).hasSize(1).first().isSameAs(eingang); + } + + @Test + void shouldSetForwardings() { + var forwarding = ForwardingTestFactory.create(); + + var result = service.createVorgangCopy(VorgangTestFactory.createBuilder().forwarding(forwarding).build(), eingang); + + assertThat(result.getForwardings()).containsExactly(forwarding); + } + + private Vorgang createVorgangCopy() { + return service.createVorgangCopy(VorgangTestFactory.create(), eingang); } } @@ -429,8 +516,7 @@ class VorgangServiceTest { void shouldThrowAccessDeniedException() { when(vorgangAuthorizationService.authorizeByOrganisationseinheitenId(any(), any())).thenReturn(false); - assertThrows(AccessDeniedException.class, - () -> service.getById(VorgangTestFactory.ID, FilterCriteriaTestFactory.create())); // NOSONAR + assertThrows(AccessDeniedException.class, () -> service.getById(VorgangTestFactory.ID, FilterCriteriaTestFactory.create())); //NOSONAR } }