9808aa31d357e988c7e819f7f2537fd5f8d97dda
[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.ShardingStrategy;
4 import de.juplo.kafka.chat.backend.domain.ChatHomeService;
5 import de.juplo.kafka.chat.backend.domain.ChatRoomFactory;
6 import de.juplo.kafka.chat.backend.persistence.inmemory.InMemoryChatHomeService;
7 import de.juplo.kafka.chat.backend.persistence.InMemoryWithMongoDbStorageIT.DataSourceInitializer;
8 import de.juplo.kafka.chat.backend.persistence.inmemory.InMemoryChatRoomFactory;
9 import de.juplo.kafka.chat.backend.persistence.inmemory.InMemoryChatRoomService;
10 import de.juplo.kafka.chat.backend.persistence.storage.mongodb.ChatRoomRepository;
11 import de.juplo.kafka.chat.backend.persistence.storage.mongodb.MongoDbStorageStrategy;
12 import lombok.extern.slf4j.Slf4j;
13 import org.junit.jupiter.api.BeforeEach;
14 import org.junit.jupiter.api.extension.ExtendWith;
15 import org.springframework.beans.factory.annotation.Autowired;
16 import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
17 import org.springframework.boot.test.autoconfigure.data.mongo.AutoConfigureDataMongo;
18 import org.springframework.boot.test.context.TestConfiguration;
19 import org.springframework.context.ApplicationContextInitializer;
20 import org.springframework.context.ConfigurableApplicationContext;
21 import org.springframework.context.annotation.Bean;
22 import org.springframework.test.context.ContextConfiguration;
23 import org.springframework.test.context.junit.jupiter.SpringExtension;
24 import org.springframework.test.context.support.TestPropertySourceUtils;
25 import org.testcontainers.containers.GenericContainer;
26 import org.testcontainers.containers.output.Slf4jLogConsumer;
27 import org.testcontainers.junit.jupiter.Container;
28 import org.testcontainers.junit.jupiter.Testcontainers;
29
30 import java.time.Clock;
31 import java.util.function.Supplier;
32
33
34 @Testcontainers
35 @ExtendWith({SpringExtension.class})
36 @EnableAutoConfiguration
37 @AutoConfigureDataMongo
38 @ContextConfiguration(initializers = DataSourceInitializer.class)
39 @Slf4j
40 public class InMemoryWithMongoDbStorageIT extends AbstractStorageStrategyIT
41 {
42   @Autowired
43   MongoDbStorageStrategy storageStrategy;
44   @Autowired
45   Clock clock;
46
47
48   @Override
49   protected StorageStrategy getStorageStrategy()
50   {
51     return storageStrategy;
52   }
53
54   @Override
55   protected Supplier<ChatHomeService> getChatHomeServiceSupplier()
56   {
57     return () -> new InMemoryChatHomeService(
58         1,
59         new int[] { 0 },
60         getStorageStrategy().read());
61   }
62
63   @Override
64   protected ChatRoomFactory getChatRoomFactory()
65   {
66     ShardingStrategy strategy = chatRoomId -> 0;
67     return new InMemoryChatRoomFactory(strategy, clock, 8);
68   }
69
70   @TestConfiguration
71   static class InMemoryWithMongoDbStorageStrategyITConfig
72   {
73     @Bean
74     MongoDbStorageStrategy storageStrategy(
75         ChatRoomRepository chatRoomRepository,
76         Clock clock)
77     {
78       return new MongoDbStorageStrategy(
79           chatRoomRepository,
80           clock,
81           8,
82           chatRoomId -> 0,
83           messageFlux -> new InMemoryChatRoomService(messageFlux));
84     }
85
86     @Bean
87     Clock clock()
88     {
89       return Clock.systemDefaultZone();
90     }
91   }
92
93   private static final int MONGODB_PORT = 27017;
94
95   @Container
96   private static final GenericContainer CONTAINER =
97       new GenericContainer("mongo:6")
98           .withExposedPorts(MONGODB_PORT);
99
100   public static class DataSourceInitializer
101       implements ApplicationContextInitializer<ConfigurableApplicationContext>
102   {
103     @Override
104     public void initialize(ConfigurableApplicationContext applicationContext)
105     {
106       TestPropertySourceUtils.addInlinedPropertiesToEnvironment(
107           applicationContext,
108           "spring.data.mongodb.host=localhost",
109           "spring.data.mongodb.port=" + CONTAINER.getMappedPort(MONGODB_PORT),
110           "spring.data.mongodb.database=test");
111     }
112   }
113
114   @BeforeEach
115   void setUpLogging()
116   {
117     Slf4jLogConsumer logConsumer = new Slf4jLogConsumer(log);
118     CONTAINER.followOutput(logConsumer);
119   }
120 }