X-Git-Url: http://juplo.de/gitweb/?a=blobdiff_plain;f=src%2Ftest%2Fjava%2Fde%2Fjuplo%2Fkafka%2Fchat%2Fbackend%2FAbstractConfigurationIT.java;h=3e0efd34d67ebe0e459fce8038ce48d604b8e9aa;hb=9bde1226e097e04c09f687a94148c0138a38f5b2;hp=3f25cedfb314f0ec50657225fe09fcb2ac967d2f;hpb=ad2750e7cc30a885119c2ef3396374d81c3806ed;p=demos%2Fkafka%2Fchat diff --git a/src/test/java/de/juplo/kafka/chat/backend/AbstractConfigurationIT.java b/src/test/java/de/juplo/kafka/chat/backend/AbstractConfigurationIT.java index 3f25cedf..3e0efd34 100644 --- a/src/test/java/de/juplo/kafka/chat/backend/AbstractConfigurationIT.java +++ b/src/test/java/de/juplo/kafka/chat/backend/AbstractConfigurationIT.java @@ -1,27 +1,32 @@ package de.juplo.kafka.chat.backend; +import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import de.juplo.kafka.chat.backend.api.ChatRoomInfoTo; +import de.juplo.kafka.chat.backend.api.MessageTo; import lombok.extern.slf4j.Slf4j; -import org.hamcrest.BaseMatcher; -import org.hamcrest.Description; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.web.server.LocalServerPort; +import org.springframework.core.io.Resource; import org.springframework.http.MediaType; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.web.reactive.server.WebTestClient; import org.testcontainers.shaded.org.awaitility.Awaitility; +import reactor.core.publisher.Flux; import java.io.IOException; import java.time.Duration; +import java.util.List; import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; import static org.assertj.core.api.Assertions.assertThat; import static org.hamcrest.Matchers.endsWith; +import static pl.rzrz.assertj.reactor.Assertions.assertThat; @Slf4j @@ -39,10 +44,20 @@ public abstract class AbstractConfigurationIT @Autowired ObjectMapper objectMapper; + @Value("classpath:data/files/5c73531c-6fc4-426c-adcb-afc5c140a0f7.json") + Resource existingChatRoomRessource; + MessageTo[] expectedExistingMessages; + @BeforeEach - void waitForApp() + void waitForApp() throws IOException { + expectedExistingMessages = objectMapper + .readValue( + existingChatRoomRessource.getInputStream(), + new TypeReference>() {}) + .toArray(size -> new MessageTo[size]); + Awaitility .await() .atMost(Duration.ofSeconds(15)) @@ -190,44 +205,33 @@ public abstract class AbstractConfigurationIT @DisplayName("A message can be put into a newly created chat-room") void testPutMessageInNewChatRoom() throws IOException { + ChatRoomInfoTo chatRoomInfo; + do + { + // The first request creates a new chat-room + // It must be repeated, until a chat-room was created, + // that is owned by the instance + chatRoomInfo = webTestClient + .post() + .uri("http://localhost:{port}/create", port) + .contentType(MediaType.TEXT_PLAIN) + .bodyValue("bar") + .accept(MediaType.APPLICATION_JSON) + .exchange() + .returnResult(ChatRoomInfoTo.class) + .getResponseBody() + .retry(30) + .blockFirst(); + } + while(!(chatRoomInfo.getShard() == null || chatRoomInfo.getShard().intValue() == 2)); + + UUID chatRoomId = chatRoomInfo.getId(); + Awaitility .await() .atMost(Duration.ofSeconds(15)) .untilAsserted(() -> { - // The first request creates a new chat-room - // It must be repeated, until a chat-room was created, - // that is owned by the instance - byte[] result = webTestClient - .post() - .uri("http://localhost:{port}/create", port) - .contentType(MediaType.TEXT_PLAIN) - .bodyValue("bar") - .accept(MediaType.APPLICATION_JSON) - .exchange() - .expectStatus().isOk() - .expectBody() - .jsonPath("$.id").exists() - .jsonPath("$.name").isEqualTo("bar") - .jsonPath("$.shard").value(new BaseMatcher() { - @Override - public boolean matches(Object actual) - { - return actual == null - ? true - : actual.equals(Integer.valueOf(2)); - } - - @Override - public void describeTo(Description description) - { - description.appendText("shard has expected value 2, or is empty"); - } - }) - .returnResult() - .getResponseBody(); - ChatRoomInfoTo chatRoomInfo = objectMapper.readValue(result, ChatRoomInfoTo.class); - UUID chatRoomId = chatRoomInfo.getId(); webTestClient .put() .uri( @@ -245,4 +249,69 @@ public abstract class AbstractConfigurationIT .jsonPath("$.text").isEqualTo("Hello world!"); }); } + + @Test + @DisplayName("Restored messages can be seen, when listening to restored chat-room") + void testListenToRestoredChatRoomYieldsRestoredMessages() + { + Awaitility + .await() + .atMost(Duration.ofSeconds(15)) + .untilAsserted(() -> + { + Flux result = webTestClient + .get() + .uri( + "http://localhost:{port}/{chatRoomId}/listen", + port, + EXISTING_CHATROOM) + .accept(MediaType.TEXT_EVENT_STREAM) + .exchange() + .expectStatus().isOk() + .returnResult(MessageTo.class) + .getResponseBody(); + + List messages = result + .take(expectedExistingMessages.length) + .collectList() + .block(); + assertThat(messages).containsExactly(expectedExistingMessages); + }); + } + + @Test + @DisplayName("Newly send messages can be seen, when listening to restored chat-room") + void testListenToRestoredChatRoomYieldsAddedMessages() + { + MessageTo sentMessage = webTestClient + .put() + .uri( + "http://localhost:{port}/{chatRoomId}/nerd/7", + port, + EXISTING_CHATROOM) + .contentType(MediaType.TEXT_PLAIN) + .accept(MediaType.APPLICATION_JSON) + .bodyValue("Hello world!") + .exchange() + .expectStatus() + .isOk() + .returnResult(MessageTo.class) + .getResponseBody() + .next() + .block(); + + Flux result = webTestClient + .get() + .uri( + "http://localhost:{port}/{chatRoomId}/listen", + port, + EXISTING_CHATROOM) + .accept(MediaType.TEXT_EVENT_STREAM) + .exchange() + .expectStatus().isOk() + .returnResult(MessageTo.class) + .getResponseBody(); + + assertThat(result.next().block()).isEqualTo(sentMessage); + } }