refactor: Cleaned up code
[demos/kafka/chat] / src / test / java / de / juplo / kafka / chat / backend / InMemoryWithMongoDbStorageIT.java
1 package de.juplo.kafka.chat.backend;
2
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;
25
26 import java.time.Clock;
27
28
29 @Testcontainers
30 @ExtendWith({SpringExtension.class})
31 @EnableAutoConfiguration
32 @AutoConfigureDataMongo
33 @ContextConfiguration(initializers = DataSourceInitializer.class)
34 @Slf4j
35 public class InMemoryWithMongoDbStorageIT extends AbstractInMemoryStorageIT
36 {
37   @Autowired
38   MongoDbStorageStrategy storageStrategy;
39   @Autowired
40   ChatRoomRepository chatRoomRepository;
41   @Autowired
42   MessageRepository messageRepository;
43
44
45   public InMemoryWithMongoDbStorageIT()
46   {
47     super(Clock.systemDefaultZone());
48   }
49
50
51   @Override
52   protected StorageStrategy getStorageStrategy()
53   {
54     return storageStrategy;
55   }
56
57   @TestConfiguration
58   static class InMemoryWithMongoDbStorageStrategyITConfig
59   {
60     @Bean
61     MongoDbStorageStrategy storageStrategy(
62         ChatRoomRepository chatRoomRepository,
63         MessageRepository messageRepository)
64     {
65       return new MongoDbStorageStrategy(chatRoomRepository, messageRepository);
66     }
67
68     @Bean
69     Clock clock()
70     {
71       return Clock.systemDefaultZone();
72     }
73   }
74
75   private static final int MONGODB_PORT = 27017;
76
77   @Container
78   private static final GenericContainer CONTAINER =
79       new GenericContainer("mongo:6").withExposedPorts(MONGODB_PORT);
80
81   public static class DataSourceInitializer
82       implements ApplicationContextInitializer<ConfigurableApplicationContext>
83   {
84     @Override
85     public void initialize(ConfigurableApplicationContext applicationContext)
86     {
87       TestPropertySourceUtils.addInlinedPropertiesToEnvironment(
88           applicationContext,
89           "spring.data.mongodb.host=localhost",
90           "spring.data.mongodb.port=" + CONTAINER.getMappedPort(MONGODB_PORT),
91           "spring.data.mongodb.database=test");
92     }
93   }
94
95   @BeforeEach
96   void setUpLogging()
97   {
98     Slf4jLogConsumer logConsumer = new Slf4jLogConsumer(log);
99     CONTAINER.followOutput(logConsumer);
100     chatRoomRepository.deleteAll();
101     messageRepository.deleteAll();
102   }
103 }