X-Git-Url: https://juplo.de/gitweb/?a=blobdiff_plain;f=src%2Ftest%2Fjava%2Fde%2Fjuplo%2Fkafka%2Fchat%2Fbackend%2FInMemoryWithMongoDbStorageIT.java;h=43a09003baf164f3c66caa574768ce962e7a2e65;hb=a8868405a208e0bfd176890b6387fb5c794358e9;hp=1a93841c05504637d8485d0c552fd02d712cd0a2;hpb=61df7f429e17781b3239b5e084cf02540fbe6319;p=demos%2Fkafka%2Fchat diff --git a/src/test/java/de/juplo/kafka/chat/backend/InMemoryWithMongoDbStorageIT.java b/src/test/java/de/juplo/kafka/chat/backend/InMemoryWithMongoDbStorageIT.java index 1a93841c..43a09003 100644 --- a/src/test/java/de/juplo/kafka/chat/backend/InMemoryWithMongoDbStorageIT.java +++ b/src/test/java/de/juplo/kafka/chat/backend/InMemoryWithMongoDbStorageIT.java @@ -1,101 +1,108 @@ package de.juplo.kafka.chat.backend; +import de.juplo.kafka.chat.backend.InMemoryWithMongoDbStorageIT.DataSourceInitializer; +import de.juplo.kafka.chat.backend.implementation.StorageStrategy; +import de.juplo.kafka.chat.backend.storage.mongodb.ChatRoomRepository; +import de.juplo.kafka.chat.backend.storage.mongodb.MessageRepository; +import de.juplo.kafka.chat.backend.storage.mongodb.MongoDbStorageStrategy; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.web.server.LocalServerPort; -import org.springframework.http.MediaType; -import org.springframework.test.context.DynamicPropertyRegistry; -import org.springframework.test.context.DynamicPropertySource; -import org.springframework.test.web.reactive.server.WebTestClient; -import org.testcontainers.containers.BindMode; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.autoconfigure.data.mongo.AutoConfigureDataMongo; +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.context.ApplicationContextInitializer; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.context.support.TestPropertySourceUtils; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.output.Slf4jLogConsumer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import org.testcontainers.shaded.org.awaitility.Awaitility; -import java.time.Duration; +import java.time.Clock; -@SpringBootTest( - webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, - properties = { - "chat.backend.storage=mongodb", - "spring.data.mongodb.host=localhost", - "spring.data.mongodb.database=test" }) @Testcontainers +@ExtendWith({SpringExtension.class}) +@EnableAutoConfiguration +@AutoConfigureDataMongo +@ContextConfiguration(initializers = DataSourceInitializer.class) @Slf4j -class InMemoryWithMongoDbStorageIT +public class InMemoryWithMongoDbStorageIT extends AbstractInMemoryStorageIT { - @LocalServerPort - private int port; - @Autowired - private WebTestClient webTestClient; + @Autowired + MongoDbStorageStrategy storageStrategy; + @Autowired + ChatRoomRepository chatRoomRepository; + @Autowired + MessageRepository messageRepository; - @Test - @DisplayName("The app starts, the data is restored and accessible") - void test() - { - Awaitility - .await() - .atMost(Duration.ofSeconds(15)) - .untilAsserted(() -> - { - webTestClient - .get() - .uri("http://localhost:{port}/actuator/health", port) - .exchange() - .expectStatus().isOk() - .expectBody().jsonPath("$.status").isEqualTo("UP"); - webTestClient - .get() - .uri("http://localhost:{port}/4ace69b7-a79f-481b-ad0d-d756d60b66ec", port) - .accept(MediaType.APPLICATION_JSON) - .exchange() - .expectStatus().isOk() - .expectBody().jsonPath("$.name").isEqualTo("FOO"); - webTestClient - .get() - .uri("http://localhost:{port}/4ace69b7-a79f-481b-ad0d-d756d60b66ec/ute/1", port) - .accept(MediaType.APPLICATION_JSON) - .exchange() - .expectStatus().isOk() - .expectBody().jsonPath("$.text").isEqualTo("Ich bin Ute..."); - webTestClient - .get() - .uri("http://localhost:{port}/4ace69b7-a79f-481b-ad0d-d756d60b66ec/peter/1", port) - .accept(MediaType.APPLICATION_JSON) - .exchange() - .expectStatus().isOk() - .expectBody().jsonPath("$.text").isEqualTo("Hallo, ich heiße Peter!"); - }); - } - private static final int MONGODB_PORT = 27017; + public InMemoryWithMongoDbStorageIT() + { + super(Clock.systemDefaultZone()); + } - @Container - private static final GenericContainer CONTAINER = - new GenericContainer("mongo:6") - .withClasspathResourceMapping( - "data/mongodb", - "/docker-entrypoint-initdb.d", - BindMode.READ_ONLY) - .withExposedPorts(MONGODB_PORT); - @DynamicPropertySource - static void addMongoPortProperty(DynamicPropertyRegistry registry) - { - registry.add("spring.data.mongodb.port", () -> CONTAINER.getMappedPort(27017)); - } + @Override + protected StorageStrategy getStorageStrategy() + { + return storageStrategy; + } - @BeforeEach - void setUpLogging() - { - Slf4jLogConsumer logConsumer = new Slf4jLogConsumer(log); - CONTAINER.followOutput(logConsumer); - } + @TestConfiguration + static class InMemoryWithMongoDbStorageStrategyITConfig + { + @Bean + MongoDbStorageStrategy storageStrategy( + ChatRoomRepository chatRoomRepository, + MessageRepository messageRepository, + Clock clock) + { + return new MongoDbStorageStrategy( + chatRoomRepository, + messageRepository, + chatRoomId -> 0); + } + + @Bean + Clock clock() + { + return Clock.systemDefaultZone(); + } + } + + private static final int MONGODB_PORT = 27017; + + @Container + private static final GenericContainer CONTAINER = + new GenericContainer("mongo:6") + .withExposedPorts(MONGODB_PORT); + + public static class DataSourceInitializer + implements ApplicationContextInitializer + { + @Override + public void initialize(ConfigurableApplicationContext applicationContext) + { + TestPropertySourceUtils.addInlinedPropertiesToEnvironment( + applicationContext, + "spring.data.mongodb.host=localhost", + "spring.data.mongodb.port=" + CONTAINER.getMappedPort(MONGODB_PORT), + "spring.data.mongodb.database=test"); + } + } + + @BeforeEach + void setUpLogging() + { + Slf4jLogConsumer logConsumer = new Slf4jLogConsumer(log); + CONTAINER.followOutput(logConsumer); + chatRoomRepository.deleteAll(); + messageRepository.deleteAll(); + } }