1 package de.juplo.kafka.chat.backend;
3 import de.juplo.kafka.chat.backend.InMemoryWithMongoDbStorageIT.DataSourceInitializer;
4 import de.juplo.kafka.chat.backend.implementation.StorageStrategy;
5 import de.juplo.kafka.chat.backend.storage.mongodb.ChatRoomRepository;
6 import de.juplo.kafka.chat.backend.storage.mongodb.MessageRepository;
7 import de.juplo.kafka.chat.backend.storage.mongodb.MongoDbStorageStrategy;
8 import lombok.extern.slf4j.Slf4j;
9 import org.junit.jupiter.api.BeforeEach;
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.test.context.ContextConfiguration;
19 import org.springframework.test.context.junit.jupiter.SpringExtension;
20 import org.springframework.test.context.support.TestPropertySourceUtils;
21 import org.testcontainers.containers.GenericContainer;
22 import org.testcontainers.containers.output.Slf4jLogConsumer;
23 import org.testcontainers.junit.jupiter.Container;
24 import org.testcontainers.junit.jupiter.Testcontainers;
26 import java.time.Clock;
30 @ExtendWith({SpringExtension.class})
31 @EnableAutoConfiguration
32 @AutoConfigureDataMongo
33 @ContextConfiguration(initializers = DataSourceInitializer.class)
35 public class InMemoryWithMongoDbStorageIT extends AbstractInMemoryStorageIT
38 MongoDbStorageStrategy storageStrategy;
40 ChatRoomRepository chatRoomRepository;
42 MessageRepository messageRepository;
45 public InMemoryWithMongoDbStorageIT()
47 super(Clock.systemDefaultZone());
52 protected StorageStrategy getStorageStrategy()
54 return storageStrategy;
58 static class InMemoryWithMongoDbStorageStrategyITConfig
61 MongoDbStorageStrategy storageStrategy(
62 ChatRoomRepository chatRoomRepository,
63 MessageRepository messageRepository,
66 return new MongoDbStorageStrategy(
75 return Clock.systemDefaultZone();
79 private static final int MONGODB_PORT = 27017;
82 private static final GenericContainer CONTAINER =
83 new GenericContainer("mongo:6")
84 .withExposedPorts(MONGODB_PORT);
86 public static class DataSourceInitializer
87 implements ApplicationContextInitializer<ConfigurableApplicationContext>
90 public void initialize(ConfigurableApplicationContext applicationContext)
92 TestPropertySourceUtils.addInlinedPropertiesToEnvironment(
94 "spring.data.mongodb.host=localhost",
95 "spring.data.mongodb.port=" + CONTAINER.getMappedPort(MONGODB_PORT),
96 "spring.data.mongodb.database=test");
103 Slf4jLogConsumer logConsumer = new Slf4jLogConsumer(log);
104 CONTAINER.followOutput(logConsumer);
105 chatRoomRepository.deleteAll();
106 messageRepository.deleteAll();