1 package de.juplo.kafka.chat.backend.persistence;
3 import de.juplo.kafka.chat.backend.domain.ChatHomeService;
4 import de.juplo.kafka.chat.backend.domain.ChatRoomFactory;
5 import de.juplo.kafka.chat.backend.persistence.inmemory.InMemoryChatHomeService;
6 import de.juplo.kafka.chat.backend.persistence.InMemoryWithMongoDbStorageIT.DataSourceInitializer;
7 import de.juplo.kafka.chat.backend.persistence.inmemory.InMemoryChatRoomFactory;
8 import de.juplo.kafka.chat.backend.persistence.inmemory.InMemoryChatRoomService;
9 import de.juplo.kafka.chat.backend.persistence.storage.mongodb.ChatRoomRepository;
10 import de.juplo.kafka.chat.backend.persistence.storage.mongodb.MongoDbStorageStrategy;
11 import lombok.extern.slf4j.Slf4j;
12 import org.junit.jupiter.api.BeforeEach;
13 import org.junit.jupiter.api.extension.ExtendWith;
14 import org.springframework.beans.factory.annotation.Autowired;
15 import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
16 import org.springframework.boot.test.autoconfigure.data.mongo.AutoConfigureDataMongo;
17 import org.springframework.boot.test.context.TestConfiguration;
18 import org.springframework.context.ApplicationContextInitializer;
19 import org.springframework.context.ConfigurableApplicationContext;
20 import org.springframework.context.annotation.Bean;
21 import org.springframework.test.context.ContextConfiguration;
22 import org.springframework.test.context.junit.jupiter.SpringExtension;
23 import org.springframework.test.context.support.TestPropertySourceUtils;
24 import org.testcontainers.containers.GenericContainer;
25 import org.testcontainers.containers.output.Slf4jLogConsumer;
26 import org.testcontainers.junit.jupiter.Container;
27 import org.testcontainers.junit.jupiter.Testcontainers;
29 import java.time.Clock;
33 @ExtendWith({SpringExtension.class})
34 @EnableAutoConfiguration
35 @AutoConfigureDataMongo
36 @ContextConfiguration(initializers = DataSourceInitializer.class)
38 public class InMemoryWithMongoDbStorageIT extends AbstractStorageStrategyIT
41 MongoDbStorageStrategy storageStrategy;
43 ChatRoomRepository repository;
49 protected StorageStrategy getStorageStrategy()
51 return storageStrategy;
55 protected StorageStrategyITConfig getConfig()
57 return new StorageStrategyITConfig()
59 InMemoryChatHomeService chatHomeService = new InMemoryChatHomeService(
62 getStorageStrategy().read());
64 InMemoryChatRoomFactory chatRoomFactory = new InMemoryChatRoomFactory(
70 public ChatHomeService getChatHomeService()
72 return chatHomeService;
76 public ChatRoomFactory getChatRoomFactory()
78 return chatRoomFactory;
84 static class InMemoryWithMongoDbStorageStrategyITConfig
87 MongoDbStorageStrategy storageStrategy(
88 ChatRoomRepository chatRoomRepository,
91 return new MongoDbStorageStrategy(
96 messageFlux -> new InMemoryChatRoomService(messageFlux));
102 return Clock.systemDefaultZone();
106 private static final int MONGODB_PORT = 27017;
109 private static final GenericContainer CONTAINER =
110 new GenericContainer("mongo:6")
111 .withExposedPorts(MONGODB_PORT);
113 public static class DataSourceInitializer
114 implements ApplicationContextInitializer<ConfigurableApplicationContext>
117 public void initialize(ConfigurableApplicationContext applicationContext)
119 TestPropertySourceUtils.addInlinedPropertiesToEnvironment(
121 "spring.data.mongodb.host=localhost",
122 "spring.data.mongodb.port=" + CONTAINER.getMappedPort(MONGODB_PORT),
123 "spring.data.mongodb.database=test");
130 Slf4jLogConsumer logConsumer = new Slf4jLogConsumer(log);
131 CONTAINER.followOutput(logConsumer);
132 repository.deleteAll();