test: RED - Proofed existence of an NPE in `ShardedChatHome.getChatRoom()`
authorKai Moritz <kai@juplo.de>
Sat, 18 Feb 2023 10:07:21 +0000 (11:07 +0100)
committerKai Moritz <kai@juplo.de>
Sun, 20 Aug 2023 11:37:37 +0000 (13:37 +0200)
- 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.

src/test/java/de/juplo/kafka/chat/backend/AbstractConfigurationIT.java
src/test/java/de/juplo/kafka/chat/backend/AbstractConfigurationWithShardingIT.java [new file with mode: 0644]
src/test/java/de/juplo/kafka/chat/backend/InMemoryWithFilesAndShardingConfigurationIT.java
src/test/java/de/juplo/kafka/chat/backend/InMemoryWithMongoDbConfigurationIT.java

index c424b29..53ad04e 100644 (file)
@@ -20,8 +20,10 @@ public abstract class AbstractConfigurationIT
 
   @Test
   @DisplayName("The app starts, the data is restored and accessible")
-  void test()
+  void testAppStartsDataIsRestoredAndAccessible()
   {
+    String chatRoomId = "5c73531c-6fc4-426c-adcb-afc5c140a0f7";
+
     Awaitility
         .await()
         .atMost(Duration.ofSeconds(15))
@@ -29,13 +31,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 +50,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 (file)
index 0000000..e6fd95a
--- /dev/null
@@ -0,0 +1,35 @@
+package de.juplo.kafka.chat.backend;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.springframework.http.MediaType;
+import org.testcontainers.shaded.org.awaitility.Awaitility;
+
+import java.time.Duration;
+
+
+public abstract class AbstractConfigurationWithShardingIT extends AbstractConfigurationIT
+{
+  @Test
+  @DisplayName("A PUT-message for a not owned shard yields 404 - NOT FOUND")
+  void testNotFoundForPutMessageToAChatRoomInNotOwnedShard()
+  {
+    String otherChatRoomId = "4e7246a6-29ae-43ea-b56f-669c3481ac19";
+
+    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());
+  }
+}
index 72230e9..fd2866b 100644 (file)
@@ -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
 {
 }
index 05f1de5..6937736 100644 (file)
@@ -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