e56aff778e9874ee0612d96e82d8217902390dc6
[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   ChatRoomRepository repository;
46   @Autowired
47   Clock clock;
48
49
50   @Override
51   protected StorageStrategy getStorageStrategy()
52   {
53     return storageStrategy;
54   }
55
56   @Override
57   protected Supplier<ChatHomeService> getChatHomeServiceSupplier()
58   {
59     return () -> new InMemoryChatHomeService(
60         1,
61         new int[] { 0 },
62         getStorageStrategy().read());
63   }
64
65   @Override
66   protected ChatRoomFactory getChatRoomFactory()
67   {
68     ShardingStrategy strategy = chatRoomId -> 0;
69     return new InMemoryChatRoomFactory(strategy, clock, 8);
70   }
71
72   @TestConfiguration
73   static class InMemoryWithMongoDbStorageStrategyITConfig
74   {
75     @Bean
76     MongoDbStorageStrategy storageStrategy(
77         ChatRoomRepository chatRoomRepository,
78         Clock clock)
79     {
80       return new MongoDbStorageStrategy(
81           chatRoomRepository,
82           clock,
83           8,
84           chatRoomId -> 0,
85           messageFlux -> new InMemoryChatRoomService(messageFlux));
86     }
87
88     @Bean
89     Clock clock()
90     {
91       return Clock.systemDefaultZone();
92     }
93   }
94
95   private static final int MONGODB_PORT = 27017;
96
97   @Container
98   private static final GenericContainer CONTAINER =
99       new GenericContainer("mongo:6")
100           .withExposedPorts(MONGODB_PORT);
101
102   public static class DataSourceInitializer
103       implements ApplicationContextInitializer<ConfigurableApplicationContext>
104   {
105     @Override
106     public void initialize(ConfigurableApplicationContext applicationContext)
107     {
108       TestPropertySourceUtils.addInlinedPropertiesToEnvironment(
109           applicationContext,
110           "spring.data.mongodb.host=localhost",
111           "spring.data.mongodb.port=" + CONTAINER.getMappedPort(MONGODB_PORT),
112           "spring.data.mongodb.database=test");
113     }
114   }
115
116   @BeforeEach
117   void setUpLogging()
118   {
119     Slf4jLogConsumer logConsumer = new Slf4jLogConsumer(log);
120     CONTAINER.followOutput(logConsumer);
121     repository.deleteAll();
122   }
123 }