}
}
+ int[] getOwnedShards()
+ {
+ return IntStream
+ .range(0, numShards)
+ .filter(shard -> isShardOwned[shard])
+ .toArray();
+ }
+
Mono<ChatRoom> getChatRoom(int shard, UUID id)
{
if (loadInProgress)
import de.juplo.kafka.chat.backend.domain.ChatHome;
import de.juplo.kafka.chat.backend.domain.ChatRoom;
+import de.juplo.kafka.chat.backend.domain.UnknownChatroomException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.common.utils.Utils;
public Mono<ChatRoom> getChatRoom(UUID id)
{
int shard = selectShard(id);
- return chatRoomChannel.getChatRoom(shard, id);
+ return chatRoomChannel
+ .getChatRoom(shard, id)
+ .switchIfEmpty(Mono.error(() -> new UnknownChatroomException(id)));
}
int selectShard(UUID chatRoomId)
import java.time.Duration;
+import static org.hamcrest.Matchers.endsWith;
+
public abstract class AbstractConfigurationIT
{
@Autowired
WebTestClient webTestClient;
+
@Test
@DisplayName("The app starts, the data is restored and accessible")
void testAppStartsDataIsRestoredAndAccessible()
.expectBody().jsonPath("$.text").isEqualTo("Hallo, ich heiße Peter!");
});
}
+
+ @Test
+ @DisplayName("A PUT-message for a non-existent chat-room yields 404 NOT FOUND")
+ void testNotFoundForPutMessageToNonExistentChatRoom()
+ {
+ String otherChatRoomId = "7f59ec77-832e-4a17-8d22-55ef46242c17";
+
+ 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()
+ .expectBody()
+ .jsonPath("$.type").value(endsWith("/problem/unknown-chatroom"))
+ .jsonPath("$.chatroomId").isEqualTo(otherChatRoomId));
+ }
}
import java.time.Duration;
+import static org.hamcrest.Matchers.endsWith;
+
public abstract class AbstractConfigurationWithShardingIT extends AbstractConfigurationIT
{
void testNotFoundForPutMessageToAChatRoomInNotOwnedShard()
{
String otherChatRoomId = "4e7246a6-29ae-43ea-b56f-669c3481ac19";
+ int shard = 0;
Awaitility
.await()
.accept(MediaType.APPLICATION_JSON)
.bodyValue("The devil rules route 66")
.exchange()
- .expectStatus().isNotFound());
+ .expectStatus().isNotFound()
+ .expectBody()
+ .jsonPath("$.type").value(endsWith("/problem/shard-not-owned"))
+ .jsonPath("$.shard").isEqualTo(shard));
}
}