diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemEventListener.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemEventListener.java index bc2698d065807fa34449c44f86bb2cf82e544319..cf991372cac1e53ef918bf360128a4939f9ccb6c 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemEventListener.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemEventListener.java @@ -95,13 +95,17 @@ class VorgangAttachedItemEventListener { } private void doUpdate(Command command, VorgangAttachedItem filledItem) { - if (Objects.nonNull(command.getRelationVersion())) { + if (isVersionSet(command)) { service.update(command.getId(), filledItem.toBuilder().version(command.getRelationVersion()).build()); } else { service.forceUpdate(command.getId(), filledItem.getId(), filledItem.getItem()); } } + private boolean isVersionSet(Command command) { + return Objects.nonNull(command.getRelationVersion()) && command.getRelationVersion() > 0; + } + VorgangAttachedItem getVorgangAttachedItem(String id) { return service.getById(id); } diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PersistPostfachNachrichtServiceImplITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PersistPostfachNachrichtServiceImplITCase.java index cbd18b8e88f7de97c722790032fab203b0bfeffc..f8709896e72698d0234579ef4dda729dd1e5126e 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PersistPostfachNachrichtServiceImplITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PersistPostfachNachrichtServiceImplITCase.java @@ -24,14 +24,15 @@ package de.ozgcloud.nachrichten.postfach; import static org.assertj.core.api.Assertions.*; +import static org.awaitility.Awaitility.*; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.UUID; import java.util.concurrent.TimeUnit; import org.apache.commons.collections.MapUtils; -import org.awaitility.Awaitility; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -55,6 +56,7 @@ import lombok.SneakyThrows; "grpc.server.inProcessName=test", "grpc.client.vorgang-manager.address=in-process:test", "grpc.client.ozgcloud-command-manager.address=in-process:test", + "grpc.client.pluto.address=in-process:test", }) @DataITCase @DirtiesContext @@ -63,6 +65,8 @@ class PersistPostfachNachrichtServiceImplITCase { @Autowired private PersistPostfachNachrichtServiceImpl service; + @Autowired + private PostfachNachrichtMapper postfachNachrichtMapper; @Autowired private MongoOperations mongoOperations; @@ -75,6 +79,36 @@ class PersistPostfachNachrichtServiceImplITCase { vorgangId = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).build(), Vorgang.COLLECTION_NAME).getId(); } + @Nested + class TestPersistPostfachNachricht { + + @Test + void shouldPersistPostfachNachricht() { + var postfachNachricht = PostfachNachrichtTestFactory.createBuilder().id(null).vorgangId(vorgangId).build(); + service.persistNachricht(Optional.empty(), postfachNachricht); + + assertThat(loadPostfachNachrichts()).hasSize(1).first().usingRecursiveComparison().ignoringFields("id").isEqualTo(postfachNachricht); + } + + @Test + void shouldUpdatePersistedNachricht() { + var persistedNachrichtId = mongoOperations.save(VorgangAttachedItemTestFactory.createBuilder().id(null).version(0) + .itemName(PersistPostfachNachrichtServiceImpl.ITEM_NAME).item(PostfachNachrichtTestFactory.asMap()).build()).getId(); + var postfachNachricht = PostfachNachrichtTestFactory.createBuilder().id(persistedNachrichtId).vorgangId(vorgangId) + .subject("updated subject").mailBody("updated body").build(); + + service.persistNachricht(Optional.empty(), postfachNachricht); + + assertThat(loadPostfachNachrichts()).hasSize(1).first().usingRecursiveComparison().isEqualTo(postfachNachricht); + } + + private List<PostfachNachricht> loadPostfachNachrichts() { + return await().atMost(60, TimeUnit.MINUTES) + .until(() -> mongoOperations.findAll(VorgangAttachedItem.class), list -> !list.isEmpty()).stream() + .map(VorgangAttachedItem::getItem).map(postfachNachrichtMapper::fromMapToPostfachMail).toList(); + } + } + @DisplayName("Find rueckfragen") @Nested class TestFindRueckfragen { @@ -101,7 +135,7 @@ class PersistPostfachNachrichtServiceImplITCase { void shouldPersistAnswer() { service.persistAnswer(referencedNachrichtId, createPostfachNachricht()); - Awaitility.await().atMost(60, TimeUnit.SECONDS).untilAsserted(() -> { + await().atMost(60, TimeUnit.SECONDS).untilAsserted(() -> { var persistedAnswers = findAllVorgangAttachedItems(); assertThat(persistedAnswers).hasSize(1).first() .extracting(VorgangAttachedItem::getItem) diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemEventListenerTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemEventListenerTest.java index ff6d202f4ecc7f06568d57f6405ca0e18852d7a3..28611d93e880d5012906f5dc8da81aea4c5a2846 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemEventListenerTest.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemEventListenerTest.java @@ -38,6 +38,9 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.NullSource; +import org.junit.jupiter.params.provider.ValueSource; import org.mapstruct.factory.Mappers; import org.mockito.ArgumentCaptor; import org.mockito.Captor; @@ -73,9 +76,9 @@ class VorgangAttachedItemEventListenerTest { @Nested class TestCreateItem { - private Map<String, Object> bodyMap = VorgangAttachedItemTestFactory.asMap(); + private final Map<String, Object> bodyMap = VorgangAttachedItemTestFactory.asMap(); - private Command command = CommandTestFactory.createBuilder().bodyObject(bodyMap).relationId(VorgangTestFactory.ID).build(); + private final Command command = CommandTestFactory.createBuilder().bodyObject(bodyMap).relationId(VorgangTestFactory.ID).build(); @Captor private ArgumentCaptor<VorgangAttachedItem> itemCaptor; @@ -136,7 +139,7 @@ class VorgangAttachedItemEventListenerTest { @DisplayName("Update item") @Nested class TestUpdateItem { - private Map<String, Object> bodyMap = VorgangAttachedItemTestFactory.asMap(); + private final Map<String, Object> bodyMap = VorgangAttachedItemTestFactory.asMap(); private Command command = buildCommand(bodyMap); @@ -195,6 +198,20 @@ class VorgangAttachedItemEventListenerTest { verify(service).update(eq(CommandTestFactory.ID), itemCaptor.capture()); assertThat(itemCaptor.getValue().getId()).isEqualTo(VorgangAttachedItemTestFactory.ID); } + + @DisplayName("should call forceUpdate when") + @ParameterizedTest(name = "relationVersion is {0}") + @NullSource + @ValueSource(longs = { -10, 0 }) + void shouldCallForceUpdate(Long relationVersion) { + command = CommandTestFactory.createBuilder().relationId(VorgangAttachedItemTestFactory.ID).relationVersion(relationVersion) + .bodyObject(bodyMap) + .build(); + + listener.updateItem(CommandCreatedEventTestFactory.create(command)); + + verify(service).forceUpdate(CommandTestFactory.ID, VorgangAttachedItemTestFactory.ID, VorgangAttachedItemTestFactory.STRING_MAP); + } } private void doUpdateItem() { @@ -250,15 +267,15 @@ class VorgangAttachedItemEventListenerTest { @Captor private ArgumentCaptor<VorgangAttachedItemUpdatedEvent> eventCaptor; - private Map<String, Object> itemMap = Map.of("number", "73"); - private Set<String> itemKeys = Set.of("number"); - private Map<String, Object> bodyMap = Map.of("id", VorgangAttachedItemTestFactory.ID, VorgangAttachedItem.FIELDNAME_ITEM, + private final Map<String, Object> itemMap = Map.of("number", "73"); + private final Set<String> itemKeys = Set.of("number"); + private final Map<String, Object> bodyMap = Map.of("id", VorgangAttachedItemTestFactory.ID, VorgangAttachedItem.FIELDNAME_ITEM, itemMap); - private Command command = CommandTestFactory.createBuilder().relationId(VorgangAttachedItemTestFactory.ID) + private final Command command = CommandTestFactory.createBuilder().relationId(VorgangAttachedItemTestFactory.ID) .relationVersion(VorgangAttachedItemTestFactory.VERSION).bodyObject(bodyMap).build(); - private Map<String, Object> patchMap = Collections.emptyMap(); + private final Map<String, Object> patchMap = Collections.emptyMap(); @BeforeEach void mock() { @@ -352,7 +369,7 @@ class VorgangAttachedItemEventListenerTest { @DisplayName("Delete item") class TestDeleteItem { - private Command command = CommandTestFactory.createBuilder().relationId(VorgangAttachedItemTestFactory.ID) + private final Command command = CommandTestFactory.createBuilder().relationId(VorgangAttachedItemTestFactory.ID) .relationVersion(VorgangAttachedItemTestFactory.VERSION).build(); @Nested