f86c9d3f7299325421eac64dd170823bb781931d
[demos/kafka/chat] / src / test / java / de / juplo / kafka / chat / backend / persistence / InMemoryWithMongoDbStorageIT.java
1 package de.juplo.kafka.chat.backend.persistence;
2
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;
28
29 import java.time.Clock;
30
31
32 @Testcontainers
33 @ExtendWith({SpringExtension.class})
34 @EnableAutoConfiguration
35 @AutoConfigureDataMongo
36 @ContextConfiguration(initializers = DataSourceInitializer.class)
37 @Slf4j
38 public class InMemoryWithMongoDbStorageIT extends AbstractStorageStrategyIT
39 {
40   @Autowired
41   MongoDbStorageStrategy storageStrategy;
42   @Autowired
43   ChatRoomRepository repository;
44   @Autowired
45   Clock clock;
46
47
48   @Override
49   protected StorageStrategy getStorageStrategy()
50   {
51     return storageStrategy;
52   }
53
54   @Override
55   protected StorageStrategyITConfig getConfig()
56   {
57     return new StorageStrategyITConfig()
58     {
59       InMemoryChatHomeService chatHomeService = new InMemoryChatHomeService(
60           1,
61           new int[] { 0 },
62           getStorageStrategy().read());
63
64       InMemoryChatRoomFactory chatRoomFactory = new InMemoryChatRoomFactory(
65           chatRoomId -> 0,
66           clock,
67           8);
68
69       @Override
70       public ChatHomeService getChatHomeService()
71       {
72         return chatHomeService;
73       }
74
75       @Override
76       public ChatRoomFactory getChatRoomFactory()
77       {
78         return chatRoomFactory;
79       }
80     };
81   }
82
83   @TestConfiguration
84   static class InMemoryWithMongoDbStorageStrategyITConfig
85   {
86     @Bean
87     MongoDbStorageStrategy storageStrategy(
88         ChatRoomRepository chatRoomRepository,
89         Clock clock)
90     {
91       return new MongoDbStorageStrategy(
92           chatRoomRepository,
93           clock,
94           8,
95           chatRoomId -> 0,
96           messageFlux -> new InMemoryChatRoomService(messageFlux));
97     }
98
99     @Bean
100     Clock clock()
101     {
102       return Clock.systemDefaultZone();
103     }
104   }
105
106   private static final int MONGODB_PORT = 27017;
107
108   @Container
109   private static final GenericContainer CONTAINER =
110       new GenericContainer("mongo:6")
111           .withExposedPorts(MONGODB_PORT);
112
113   public static class DataSourceInitializer
114       implements ApplicationContextInitializer<ConfigurableApplicationContext>
115   {
116     @Override
117     public void initialize(ConfigurableApplicationContext applicationContext)
118     {
119       TestPropertySourceUtils.addInlinedPropertiesToEnvironment(
120           applicationContext,
121           "spring.data.mongodb.host=localhost",
122           "spring.data.mongodb.port=" + CONTAINER.getMappedPort(MONGODB_PORT),
123           "spring.data.mongodb.database=test");
124     }
125   }
126
127   @BeforeEach
128   void setUpLogging()
129   {
130     Slf4jLogConsumer logConsumer = new Slf4jLogConsumer(log);
131     CONTAINER.followOutput(logConsumer);
132     repository.deleteAll();
133   }
134 }