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