From eb8839762bcfe9137b25d666080812121a2b26ea Mon Sep 17 00:00:00 2001 From: Kai Moritz Date: Sat, 18 Feb 2023 11:07:21 +0100 Subject: [PATCH] test: RED - Proofed existence of an NPE in `ShardedChatHome.getChatRoom()` - Refined `AbstractConfigurationIT` to show, that an NPE can occure in `ShardedChatHome.getChatRoom()`. - Defined the expected behaviour, if the NPE is handled correctly in the refined integration-test. --- .../chat/backend/AbstractConfigurationIT.java | 27 ++++++++--- .../AbstractConfigurationWithShardingIT.java | 47 +++++++++++++++++++ ...ryWithFilesAndShardingConfigurationIT.java | 2 +- .../InMemoryWithMongoDbConfigurationIT.java | 2 +- 4 files changed, 70 insertions(+), 8 deletions(-) create mode 100644 src/test/java/de/juplo/kafka/chat/backend/AbstractConfigurationWithShardingIT.java 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 c424b294..34a4d17f 100644 --- a/src/test/java/de/juplo/kafka/chat/backend/AbstractConfigurationIT.java +++ b/src/test/java/de/juplo/kafka/chat/backend/AbstractConfigurationIT.java @@ -9,10 +9,13 @@ import org.springframework.test.web.reactive.server.WebTestClient; import org.testcontainers.shaded.org.awaitility.Awaitility; import java.time.Duration; +import java.util.UUID; public abstract class AbstractConfigurationIT { + UUID chatRoomId = UUID.fromString("5c73531c-6fc4-426c-adcb-afc5c140a0f7"); + @LocalServerPort int port; @Autowired @@ -20,7 +23,7 @@ public abstract class AbstractConfigurationIT @Test @DisplayName("The app starts, the data is restored and accessible") - void test() + void testAppStartsDataIsRestoredAndAccessible() { Awaitility .await() @@ -29,13 +32,17 @@ public abstract class AbstractConfigurationIT { webTestClient .get() - .uri("http://localhost:{port}/actuator/health", port) + .uri( + "http://localhost:{port}/actuator/health", + port) .exchange() .expectStatus().isOk() .expectBody().jsonPath("$.status").isEqualTo("UP"); webTestClient .get() - .uri("http://localhost:{port}/list", port) + .uri( + "http://localhost:{port}/list", + port) .accept(MediaType.APPLICATION_JSON) .exchange() .expectStatus().isOk() @@ -44,21 +51,29 @@ public abstract class AbstractConfigurationIT .jsonPath("$[0].name").isEqualTo("FOO"); webTestClient .get() - .uri("http://localhost:{port}/5c73531c-6fc4-426c-adcb-afc5c140a0f7", port) + .uri("http://localhost:{port}/{chatRoomId}", + port, + chatRoomId) .accept(MediaType.APPLICATION_JSON) .exchange() .expectStatus().isOk() .expectBody().jsonPath("$.name").isEqualTo("FOO"); webTestClient .get() - .uri("http://localhost:{port}/5c73531c-6fc4-426c-adcb-afc5c140a0f7/ute/1", port) + .uri( + "http://localhost:{port}/{chatRoomId}/ute/1", + port, + chatRoomId) .accept(MediaType.APPLICATION_JSON) .exchange() .expectStatus().isOk() .expectBody().jsonPath("$.text").isEqualTo("Ich bin Ute..."); webTestClient .get() - .uri("http://localhost:{port}/5c73531c-6fc4-426c-adcb-afc5c140a0f7/peter/1", port) + .uri( + "http://localhost:{port}/{chatRoomId}/peter/1", + port, + chatRoomId) .accept(MediaType.APPLICATION_JSON) .exchange() .expectStatus().isOk() diff --git a/src/test/java/de/juplo/kafka/chat/backend/AbstractConfigurationWithShardingIT.java b/src/test/java/de/juplo/kafka/chat/backend/AbstractConfigurationWithShardingIT.java new file mode 100644 index 00000000..6e30328c --- /dev/null +++ b/src/test/java/de/juplo/kafka/chat/backend/AbstractConfigurationWithShardingIT.java @@ -0,0 +1,47 @@ +package de.juplo.kafka.chat.backend; + +import de.juplo.kafka.chat.backend.domain.ShardingStrategy; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.testcontainers.shaded.org.awaitility.Awaitility; + +import java.time.Duration; +import java.util.UUID; + + +public abstract class AbstractConfigurationWithShardingIT extends AbstractConfigurationIT +{ + @Autowired + ShardingStrategy shardingStrategy; + + @Test + @DisplayName("A PUT-message for a not owned shard yields 404 - NOT FOUND") + void testNotFoundForPutMessageToAChatRoomInNotOwnedShard() + { + UUID randomId; + do + { + randomId = UUID.randomUUID(); + } + while(shardingStrategy.selectShard(randomId) == shardingStrategy.selectShard(chatRoomId)); + UUID otherChatRoomId = randomId; + + Awaitility + .await() + .atMost(Duration.ofSeconds(15)) + .untilAsserted(() -> + webTestClient + .put() + .uri( + "http://localhost:{port}/{chatRoomId}/otto/66", + port, + otherChatRoomId) + .contentType(MediaType.TEXT_PLAIN) + .accept(MediaType.APPLICATION_JSON) + .bodyValue("The devil rules route 66") + .exchange() + .expectStatus().isNotFound()); + } +} diff --git a/src/test/java/de/juplo/kafka/chat/backend/InMemoryWithFilesAndShardingConfigurationIT.java b/src/test/java/de/juplo/kafka/chat/backend/InMemoryWithFilesAndShardingConfigurationIT.java index 72230e9c..fd2866b5 100644 --- a/src/test/java/de/juplo/kafka/chat/backend/InMemoryWithFilesAndShardingConfigurationIT.java +++ b/src/test/java/de/juplo/kafka/chat/backend/InMemoryWithFilesAndShardingConfigurationIT.java @@ -11,6 +11,6 @@ import org.springframework.boot.test.context.SpringBootTest; "chat.backend.inmemory.sharding-strategy=kafkalike", "chat.backend.inmemory.num-shards=10", "chat.backend.inmemory.owned-shards=2" }) -class InMemoryWithFilesAndShardingConfigurationIT extends AbstractConfigurationIT +class InMemoryWithFilesAndShardingConfigurationIT extends AbstractConfigurationWithShardingIT { } diff --git a/src/test/java/de/juplo/kafka/chat/backend/InMemoryWithMongoDbConfigurationIT.java b/src/test/java/de/juplo/kafka/chat/backend/InMemoryWithMongoDbConfigurationIT.java index 05f1de5f..69377369 100644 --- a/src/test/java/de/juplo/kafka/chat/backend/InMemoryWithMongoDbConfigurationIT.java +++ b/src/test/java/de/juplo/kafka/chat/backend/InMemoryWithMongoDbConfigurationIT.java @@ -17,7 +17,7 @@ import org.testcontainers.junit.jupiter.Testcontainers; properties = { "spring.data.mongodb.host=localhost", "spring.data.mongodb.database=test", - "chat.backend.inmemory.sharding-strategy=kafkalike", + "chat.backend.inmemory.sharding-strategy=none", "chat.backend.inmemory.storage-strategy=mongodb" }) @Testcontainers @Slf4j -- 2.20.1