diff --git a/vorgang-manager-server/pom.xml b/vorgang-manager-server/pom.xml index 2313bd9cc6d2144fbfcadb8377583cd232575c35..3ea617b8e49dda6882330c27eb11f24aef17683e 100644 --- a/vorgang-manager-server/pom.xml +++ b/vorgang-manager-server/pom.xml @@ -325,6 +325,11 @@ <artifactId>docker-java-api</artifactId> <version>${docker-java.version}</version> </dependency> + <dependency> + <groupId>org.awaitility</groupId> + <artifactId>awaitility</artifactId> + <scope>test</scope> + </dependency> <!-- mongock --> <dependency> 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 8c3267d81c7c0e10c710ac1c7045b82163c74d2a..3bbec91322e52077a091aa576b1397025cb4fc8f 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 @@ -24,6 +24,7 @@ package de.ozgcloud.nachrichten.postfach; import static org.assertj.core.api.Assertions.*; +import static org.awaitility.Awaitility.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import static org.springframework.test.web.client.match.MockRestRequestMatchers.*; @@ -31,7 +32,9 @@ import static org.springframework.test.web.client.response.MockRestResponseCreat import java.time.ZonedDateTime; import java.time.temporal.ChronoUnit; +import java.util.Collection; import java.util.List; +import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; @@ -139,9 +142,9 @@ class PostfachMailITCase { mockServerSendSuccess(); callGrpcEndpoint(); - var mails = callGrpcListEndpoint(); + var mails = await().atMost(5, TimeUnit.SECONDS) + .until(PostfachMailITCase.this::callGrpcListEndpoint, PostfachMailITCase.this::hasAtLeastOneElement); - assertThat(mails).hasSize(1); assertThat(mails.get(0).getCreatedAt()).isNotNull(); assertThat(mails.get(0).getDirection()).isEqualTo(GrpcDirection.OUT); assertThat(mails.get(0).getSentAt()).isNotNull(); @@ -153,17 +156,24 @@ class PostfachMailITCase { @Nested class TestSendingFailed { + @BeforeEach + void init() { + mongoOperations.dropCollection(VorgangAttachedItem.COLLECTION_NAME); + } + @Test void shouldMarkFailed() { mockServerSendFailed(); callGrpcEndpoint(); - var mails = callGrpcListEndpoint(); - assertThat(mails).hasSize(1); - assertThat(mails.get(0).getSentAt()).isNotNull(); - assertThat(ZonedDateTime.parse(mails.get(0).getSentAt())).isCloseTo(ZonedDateTime.now(), within(2, ChronoUnit.SECONDS)); - assertThat(mails.get(0).getSentSuccessful()).isFalse(); + await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> { + assertThat(callGrpcListEndpoint()).hasSize(1).first().satisfies(mail -> { + assertThat(mail.getSentAt()).isNotNull(); + assertThat(ZonedDateTime.parse(mail.getSentAt())).isCloseTo(ZonedDateTime.now(), within(2, ChronoUnit.SECONDS)); + assertThat(mail.getSentSuccessful()).isFalse(); + }); + }); } @Test @@ -172,13 +182,14 @@ class PostfachMailITCase { mockServerSendSuccess(); callGrpcEndpoint(); - var mails = callGrpcListEndpoint(); + var mails = await().atMost(5, TimeUnit.SECONDS) + .until(PostfachMailITCase.this::callGrpcListEndpoint, PostfachMailITCase.this::hasAtLeastOneElement); var mailId = mails.get(0).getId(); callResendGrpcEndpoint(mailId); - - mails = callGrpcListEndpoint(); - assertThat(mails.get(0).getSentSuccessful()).isTrue(); + await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> + assertThat(callGrpcListEndpoint()).hasSize(1).first().extracting(GrpcPostfachMail::getSentSuccessful).isEqualTo(true) + ); } @Test @@ -187,7 +198,8 @@ class PostfachMailITCase { mockServerSendFailed(); callGrpcEndpoint(); - var mails = callGrpcListEndpoint(); + var mails = await().atMost(5, TimeUnit.SECONDS) + .until(PostfachMailITCase.this::callGrpcListEndpoint, PostfachMailITCase.this::hasAtLeastOneElement); var mailId = mails.get(0).getId(); callResendGrpcEndpoint(mailId); @@ -301,4 +313,7 @@ class PostfachMailITCase { return responseCaptor.getValue().getMailsList(); } + private boolean hasAtLeastOneElement(Collection<GrpcPostfachMail> mails) { + return !mails.isEmpty(); + } } diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/processor/ProcessorITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/processor/ProcessorITCase.java index 8ccc7c5f6b701a43d1784e264221a08ff7a117a4..5de6cb8db43331157cd66b2f84a1f00b859ddba1 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/processor/ProcessorITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/processor/ProcessorITCase.java @@ -1,12 +1,14 @@ package de.ozgcloud.processor; import static org.assertj.core.api.Assertions.*; +import static org.awaitility.Awaitility.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import java.time.ZonedDateTime; import java.util.Map; import java.util.Optional; +import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -83,8 +85,10 @@ class ProcessorITCase { void triggerProcessorOnNewVorgang() { publisher.publishEvent(new VorgangCreatedEvent(VorgangTestFactory.ID)); - verify(processorVorgangService, timeout(2000)).getVorgang(any()); - verify(commandService).createCommand(requestCaptor.capture()); + await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> { + verify(processorVorgangService).getVorgang(any()); + verify(commandService).createCommand(requestCaptor.capture()); + }); var request = requestCaptor.getValue(); @SuppressWarnings("unchecked") diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemEventListenerITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemEventListenerITCase.java index 3e5f8f24435015755d364aa2ecfe3feb88d53519..248ebc6edb9c5dcc677b60457a71151448a67089 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemEventListenerITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemEventListenerITCase.java @@ -23,10 +23,12 @@ */ package de.ozgcloud.vorgang.attached_item; +import static org.awaitility.Awaitility.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import java.util.Map; +import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -70,7 +72,7 @@ class VorgangAttachedItemEventListenerITCase { publisher.publishEvent(event); - verify(listener).createItem(any()); + await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> verify(listener).createItem(any())); } } @@ -84,7 +86,7 @@ class VorgangAttachedItemEventListenerITCase { publisher.publishEvent(event); - verify(listener).updateItem(any()); + await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> verify(listener).updateItem(any())); } } @@ -100,7 +102,7 @@ class VorgangAttachedItemEventListenerITCase { publisher.publishEvent(event); - verify(listener).patchItem(any()); + await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> verify(listener).patchItem(any())); } } @@ -114,7 +116,7 @@ class VorgangAttachedItemEventListenerITCase { publisher.publishEvent(event); - verify(listener).deleteItem(any()); + await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> verify(listener).deleteItem(any())); } } @@ -125,7 +127,7 @@ class VorgangAttachedItemEventListenerITCase { void shouldCallListener() { publisher.publishEvent(VorgangDeletedEventTestFactory.create()); - verify(listener).onVorgangDeleted(any()); + await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> verify(listener).onVorgangDeleted(any())); } } @@ -139,7 +141,8 @@ class VorgangAttachedItemEventListenerITCase { publisher.publishEvent(event); - verify(service).unmarkAsDeleteByIdAndVersion(CommandTestFactory.RELATION_ID, CommandTestFactory.RELATION_VERSION); + await().atMost(5, TimeUnit.SECONDS).untilAsserted( + () -> verify(service).unmarkAsDeleteByIdAndVersion(CommandTestFactory.RELATION_ID, CommandTestFactory.RELATION_VERSION)); } } diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemITCase.java index 4ba2f9714b9441f9d894588df60087c91fb68857..79ce07e580ab83de2d02838ad6837fc009116650 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemITCase.java @@ -24,11 +24,13 @@ package de.ozgcloud.vorgang.attached_item; import static org.assertj.core.api.Assertions.*; +import static org.awaitility.Awaitility.*; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; import java.util.HashMap; import java.util.Optional; +import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -88,13 +90,15 @@ class VorgangAttachedItemITCase { @Test void shouldPersistInDatabase() { publisher.publishEvent(event); - - var loaded = mongoOperations.findAll(VorgangAttachedItem.class); - - assertThat(loaded).hasSize(1); - assertThat(loaded.get(0)).usingRecursiveComparison().ignoringFields("id", "version").isEqualTo(VorgangAttachedItemTestFactory.create()); - assertThat(loaded.get(0).getId()).isNotNull(); - assertThat(loaded.get(0).getVersion()).isEqualTo(1L); + await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> { + var loadedItems = mongoOperations.findAll(VorgangAttachedItem.class); + + assertThat(loadedItems).hasSize(1).first().satisfies(item -> { + assertThat(item).usingRecursiveComparison().ignoringFields("id", "version").isEqualTo(VorgangAttachedItemTestFactory.create()); + assertThat(item.getId()).isNotNull(); + assertThat(item.getVersion()).isEqualTo(1L); + }); + }); } } @@ -132,11 +136,14 @@ class VorgangAttachedItemITCase { void shouldIncrementVersion() { publisher.publishEvent(event); - var loaded = mongoOperations.findAll(VorgangAttachedItem.class); + await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> { + var loaded = mongoOperations.findAll(VorgangAttachedItem.class); - assertThat(loaded).hasSize(1); - assertThat(loaded.get(0)).usingRecursiveComparison().ignoringFields("id", "version").isEqualTo(VorgangAttachedItemTestFactory.create()); - assertThat(loaded.get(0).getVersion()).isEqualTo(2L); + assertThat(loaded).hasSize(1).first().satisfies(item -> { + assertThat(item).usingRecursiveComparison().ignoringFields("id", "version").isEqualTo(VorgangAttachedItemTestFactory.create()); + assertThat(item.getVersion()).isEqualTo(2L); + }); + }); } } diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/status/StatusEventListenerITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/status/StatusEventListenerITCase.java index 3c42d7fc8618ac79b402e238139ebb24befb0d9a..bb751bec059f5f0bb76e50af39caa5d755a928fe 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/status/StatusEventListenerITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/status/StatusEventListenerITCase.java @@ -1,9 +1,11 @@ package de.ozgcloud.vorgang.status; +import static org.awaitility.Awaitility.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import java.util.Optional; +import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -54,56 +56,56 @@ class StatusEventListenerITCase { void shouldCreateStatusChangeEventForVorgangAnnehmen() { publishCommandCreatedEvent(Order.VORGANG_ANNEHMEN); - verify(statusService).annehmen(any()); + await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> verify(statusService).annehmen(any())); } @Test void shouldCreateStatusChangeEventForVorgangAbschliessen() { publishCommandCreatedEvent(Order.VORGANG_ABSCHLIESSEN); - verify(statusService).abschliessen(any()); + await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> verify(statusService).abschliessen(any())); } @Test void shouldCreateStatusChangeEventForVorgangBearbeiten() { publishCommandCreatedEvent(Order.VORGANG_BEARBEITEN); - verify(statusService).bearbeiten(any()); + await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> verify(statusService).bearbeiten(any())); } @Test void shouldCreateStatusChangeEventForVorgangBescheiden() { publishCommandCreatedEvent(Order.VORGANG_BESCHEIDEN); - verify(statusService).bescheiden(any()); + await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> verify(statusService).bescheiden(any())); } @Test void shouldCreateStatusChangeEventForVorgangVerwerfen() { publishCommandCreatedEvent(Order.VORGANG_VERWERFEN); - verify(statusService).verwerfen(any()); + await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> verify(statusService).verwerfen(any())); } @Test void shouldCreateStatusChangeEventForVorgangWiedereroeffnen() { publishCommandCreatedEvent(Order.VORGANG_WIEDEREROEFFNEN); - verify(statusService).wiedereroeffnen(any()); + await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> verify(statusService).wiedereroeffnen(any())); } @Test void shouldCreateStatusChangeEventForVorgangZurueckholen() { publishCommandCreatedEvent(Order.VORGANG_ZURUECKHOLEN); - verify(statusService).setStatusNeu(any()); + await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> verify(statusService).setStatusNeu(any())); } @Test void shouldCreateStatusChangeEventForVorgangZurueckstellen() { publishCommandCreatedEvent(Order.VORGANG_ZURUECKSTELLEN); - verify(statusService).annehmen(any()); + await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> verify(statusService).annehmen(any())); } @Nested @@ -112,7 +114,7 @@ class StatusEventListenerITCase { void shouldCallService() { publishCommandCreatedEvent(Order.VORGANG_ZUM_LOESCHEN_MARKIEREN); - verify(statusService).zumLoeschenMarkieren(any()); + await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> verify(statusService).zumLoeschenMarkieren(any())); } } @@ -149,7 +151,7 @@ class StatusEventListenerITCase { publisher.publishEvent(new RevokeCommandEvent(command)); - verify(statusService).revokeStatusChange(any(PersistedCommand.class)); + await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> verify(statusService).revokeStatusChange(any(PersistedCommand.class))); } } } diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardVorgangITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardVorgangITCase.java index 11b302357b277b02742b8d80c48cdf4621f40340..51637df98ba492f515656a27b27888a2dd15f3e0 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardVorgangITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardVorgangITCase.java @@ -24,10 +24,12 @@ package de.ozgcloud.vorgang.vorgang.redirect; import static org.assertj.core.api.Assertions.*; +import static org.awaitility.Awaitility.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import org.bson.types.ObjectId; @@ -138,10 +140,10 @@ class ForwardVorgangITCase { void shouldHaveCommandWithFINISHEDState() { callServiceCreateCommand(); - var commands = mongoOperations.findAll(Command.class); - assertThat(commands).hasSize(1); - var redirectCommand = commands.get(0); - assertThat(redirectCommand.getStatus()).isEqualTo(CommandStatus.FINISHED); + await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> { + var commands = mongoOperations.findAll(Command.class); + assertThat(commands).hasSize(1).first().extracting(Command::getStatus).isEqualTo(CommandStatus.FINISHED); + }); } // TODO Forwarding status @@ -162,28 +164,34 @@ class ForwardVorgangITCase { void forwardCommandShouldBeWithError() { callServiceCreateCommand(); - var commands = mongoOperations.findAll(PersistedCommand.class); - assertThat(commands).hasSize(1); - var redirectCommand = commands.get(0); - assertThat(redirectCommand.getStatus()).isEqualTo(CommandStatus.ERROR); - assertThat(redirectCommand.getErrorMessage()).isEqualTo(MailSendErrorEventTestFactory.ERROR_MSG); + await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> { + var commands = mongoOperations.findAll(PersistedCommand.class); + assertThat(commands).hasSize(1).first().satisfies(redirectCommand -> { + assertThat(redirectCommand.getStatus()).isEqualTo(CommandStatus.ERROR); + assertThat(redirectCommand.getErrorMessage()).isEqualTo(MailSendErrorEventTestFactory.ERROR_MSG); + }); + }); } @Test void vorgangShouldHaveStatusIN_BEARBEITUNG() { callServiceCreateCommand(); - var loaded = mongoOperations.findById(VorgangTestFactory.ID, Vorgang.class); - assertThat(loaded.getStatus()).isEqualTo(Status.IN_BEARBEITUNG); + await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> { + var loaded = mongoOperations.findById(VorgangTestFactory.ID, Vorgang.class); + assertThat(loaded.getStatus()).isEqualTo(Status.IN_BEARBEITUNG); + }); } @Test void forwardingShouldHaveStatusSEND_ERROR() { callServiceCreateCommand(); - var vorgang = mongoOperations.findById(VorgangTestFactory.ID, Vorgang.class); - assertThat(vorgang.getForwardings()).hasSize(1); - assertThat(vorgang.getForwardings().get(0).getStatus()).isEqualTo(Forwarding.Status.SEND_ERROR); + await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> { + var vorgang = mongoOperations.findById(VorgangTestFactory.ID, Vorgang.class); + assertThat(vorgang.getForwardings()).hasSize(1); + assertThat(vorgang.getForwardings().get(0).getStatus()).isEqualTo(Forwarding.Status.SEND_ERROR); + }); } } diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingEventListenerITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingEventListenerITCase.java index 4fc182bdb6a5387ee2b3b626c98c921700942ef1..735ee575b32e8cc21ab6ea65a8a9c6616757c79c 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingEventListenerITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingEventListenerITCase.java @@ -23,9 +23,12 @@ */ package de.ozgcloud.vorgang.vorgang.redirect; +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.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -66,7 +69,7 @@ class ForwardingEventListenerITCase { publisher.publishEvent(CommandCreatedEventTestFactory.create(command)); - verify(service).forwardByCommand(command); + await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> verify(service).forwardByCommand(command)); } } @@ -79,7 +82,7 @@ class ForwardingEventListenerITCase { publisher.publishEvent(MailSentEventTestFactory.create(forwarding)); - verify(service).onRedirectMailSent(forwarding); + await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> verify(service).onRedirectMailSent(forwarding)); } @ParameterizedTest @@ -102,7 +105,7 @@ class ForwardingEventListenerITCase { publisher.publishEvent(CommandCreatedEventTestFactory.create(command)); - verify(service).markAsSuccessfull(command); + await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> verify(service).markAsSuccessfull(command)); } }