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