1 package de.juplo.kafka.chat.backend.persistence;
3 import de.juplo.kafka.chat.backend.domain.ChatHomeService;
4 import de.juplo.kafka.chat.backend.persistence.inmemory.InMemoryChatHomeService;
5 import de.juplo.kafka.chat.backend.persistence.InMemoryWithMongoDbStorageStrategyIT.DataSourceInitializer;
6 import de.juplo.kafka.chat.backend.persistence.inmemory.InMemoryChatRoomService;
7 import de.juplo.kafka.chat.backend.persistence.storage.mongodb.ChatRoomRepository;
8 import de.juplo.kafka.chat.backend.persistence.storage.mongodb.MongoDbStorageStrategy;
9 import lombok.extern.slf4j.Slf4j;
10 import org.junit.jupiter.api.extension.ExtendWith;
11 import org.springframework.beans.factory.annotation.Autowired;
12 import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
13 import org.springframework.boot.test.autoconfigure.data.mongo.AutoConfigureDataMongo;
14 import org.springframework.boot.test.context.TestConfiguration;
15 import org.springframework.context.ApplicationContextInitializer;
16 import org.springframework.context.ConfigurableApplicationContext;
17 import org.springframework.context.annotation.Bean;
18 import org.springframework.data.mongodb.core.MongoTemplate;
19 import org.springframework.test.context.ContextConfiguration;
20 import org.springframework.test.context.junit.jupiter.SpringExtension;
21 import org.springframework.test.context.support.TestPropertySourceUtils;
22 import org.testcontainers.containers.GenericContainer;
23 import org.testcontainers.containers.output.Slf4jLogConsumer;
24 import org.testcontainers.junit.jupiter.Container;
25 import org.testcontainers.junit.jupiter.Testcontainers;
27 import java.time.Clock;
28 import java.util.function.Supplier;
32 @ExtendWith({SpringExtension.class})
33 @EnableAutoConfiguration
34 @AutoConfigureDataMongo
35 @ContextConfiguration(initializers = DataSourceInitializer.class)
37 public class InMemoryWithMongoDbStorageStrategyIT extends AbstractStorageStrategyIT
40 MongoDbStorageStrategy storageStrategy;
46 protected StorageStrategy getStorageStrategy()
48 return storageStrategy;
52 protected Supplier<ChatHomeService> getChatHomeServiceSupplier()
54 return () -> new InMemoryChatHomeService(getStorageStrategy().read(), clock, 8);
59 static class InMemoryWithMongoDbStorageStrategyITConfig
62 MongoDbStorageStrategy storageStrategy(
63 ChatRoomRepository chatRoomRepository,
66 return new MongoDbStorageStrategy(
70 messageFlux -> new InMemoryChatRoomService(messageFlux));
76 return Clock.systemDefaultZone();
80 private static final int MONGODB_PORT = 27017;
83 private static final GenericContainer CONTAINER =
84 new GenericContainer("mongo:6")
85 .withEnv("MONGO_INITDB_DATABASE", "test")
86 .withExposedPorts(MONGODB_PORT);
88 public static class DataSourceInitializer
89 implements ApplicationContextInitializer<ConfigurableApplicationContext>
92 public void initialize(ConfigurableApplicationContext applicationContext)
94 TestPropertySourceUtils.addInlinedPropertiesToEnvironment(
96 "spring.data.mongodb.host=localhost",
97 "spring.data.mongodb.port=" + CONTAINER.getMappedPort(MONGODB_PORT),
98 "spring.data.mongodb.database=test");
100 Slf4jLogConsumer logConsumer = new Slf4jLogConsumer(log);
101 CONTAINER.followOutput(logConsumer); }