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
@Test
@DisplayName("The app starts, the data is restored and accessible")
- void test()
+ void testAppStartsDataIsRestoredAndAccessible()
{
Awaitility
.await()
{
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()
.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()
--- /dev/null
+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());
+ }
+}
"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
{
}
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