From dd846bd9e0ac96698f0b3e25088727b620ad6c36 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Thu, 22 Aug 2024 07:21:45 +0200 Subject: [PATCH] Switch Redis samples to Testcontainers. --- redis/example/pom.xml | 10 ++++--- .../redis/RedisTestConfiguration.java | 19 ++++++-------- .../redis/commands/GeoOperationsTests.java | 6 +---- .../redis/commands/KeyOperationsTests.java | 4 --- redis/pom.xml | 26 +++++++++---------- redis/pubsub/pom.xml | 10 ++++--- .../redis/RedisTestConfiguration.java | 14 +++++++++- redis/reactive/pom.xml | 10 ++++--- .../redis/RedisTestConfiguration.java | 18 +++++-------- .../redis/commands/KeyCommandsTests.java | 10 +++---- .../redis/operations/JacksonJsonTests.java | 2 -- .../redis/operations/ListOperationsTests.java | 2 -- .../operations/ValueOperationsTests.java | 2 -- redis/repositories/pom.xml | 10 +++---- .../repositories/PersonRepositoryTests.java | 12 +++++++-- redis/streams/pom.xml | 10 ++++--- .../reactive/ReactiveStreamApiTests.java | 12 +++++++-- .../redis/sync/SyncStreamApiTests.java | 12 +++++++-- redis/util/pom.xml | 6 ----- 19 files changed, 107 insertions(+), 88 deletions(-) diff --git a/redis/example/pom.xml b/redis/example/pom.xml index 2dc044e7..6437e84e 100644 --- a/redis/example/pom.xml +++ b/redis/example/pom.xml @@ -15,9 +15,13 @@ - ${project.groupId} - spring-data-redis-example-utils - ${project.version} + org.springframework.boot + spring-boot-testcontainers + test + + + org.springframework + spring-test test diff --git a/redis/example/src/test/java/example/springdata/redis/RedisTestConfiguration.java b/redis/example/src/test/java/example/springdata/redis/RedisTestConfiguration.java index 94cd96c3..c7eff431 100644 --- a/redis/example/src/test/java/example/springdata/redis/RedisTestConfiguration.java +++ b/redis/example/src/test/java/example/springdata/redis/RedisTestConfiguration.java @@ -15,11 +15,11 @@ */ package example.springdata.redis; -import jakarta.annotation.PreDestroy; - -import org.springframework.beans.factory.annotation.Autowired; +import com.redis.testcontainers.RedisContainer; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.boot.testcontainers.service.connection.ServiceConnection; +import org.springframework.context.annotation.Bean; +import org.testcontainers.utility.DockerImageName; /** * @author Christoph Strobl @@ -27,12 +27,9 @@ import org.springframework.data.redis.connection.RedisConnectionFactory; @SpringBootApplication public class RedisTestConfiguration { - @Autowired RedisConnectionFactory factory; - - /** - * Clear database before shut down. - */ - public @PreDestroy void flushTestDb() { - factory.getConnection().flushDb(); + @Bean + @ServiceConnection(name = "redis") + RedisContainer redisContainer() { + return new RedisContainer(DockerImageName.parse("redis:7")); } } diff --git a/redis/example/src/test/java/example/springdata/redis/commands/GeoOperationsTests.java b/redis/example/src/test/java/example/springdata/redis/commands/GeoOperationsTests.java index d70f4610..613ff6f7 100644 --- a/redis/example/src/test/java/example/springdata/redis/commands/GeoOperationsTests.java +++ b/redis/example/src/test/java/example/springdata/redis/commands/GeoOperationsTests.java @@ -15,13 +15,10 @@ */ package example.springdata.redis.commands; -import static org.assertj.core.api.Assertions.*; - -import example.springdata.redis.test.condition.EnabledOnCommand; +import static org.assertj.core.api.Assertions.assertThat; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.geo.Circle; @@ -37,7 +34,6 @@ import org.springframework.data.redis.core.RedisOperations; * @author Mark Paluch */ @SpringBootTest -@EnabledOnCommand("GEOADD") class GeoOperationsTests { @Autowired RedisOperations operations; diff --git a/redis/example/src/test/java/example/springdata/redis/commands/KeyOperationsTests.java b/redis/example/src/test/java/example/springdata/redis/commands/KeyOperationsTests.java index 16ee33b3..6fc637c1 100644 --- a/redis/example/src/test/java/example/springdata/redis/commands/KeyOperationsTests.java +++ b/redis/example/src/test/java/example/springdata/redis/commands/KeyOperationsTests.java @@ -15,13 +15,10 @@ */ package example.springdata.redis.commands; -import example.springdata.redis.test.condition.EnabledOnRedisAvailable; - import java.util.UUID; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.data.redis.DataRedisTest; import org.springframework.data.redis.connection.RedisConnection; @@ -36,7 +33,6 @@ import org.springframework.data.redis.serializer.StringRedisSerializer; * @author Christoph Strobl */ @DataRedisTest -@EnabledOnRedisAvailable class KeyOperationsTests { private static final String PREFIX = KeyOperationsTests.class.getSimpleName(); diff --git a/redis/pom.xml b/redis/pom.xml index 8d99e58e..4a850173 100644 --- a/redis/pom.xml +++ b/redis/pom.xml @@ -33,19 +33,19 @@ spring-boot-starter-data-redis + + org.testcontainers + junit-jupiter + test + + + + com.redis + testcontainers-redis + 2.2.2 + test + + - - - - - - com.github.kstyrc - embedded-redis - 0.6 - - - - - diff --git a/redis/pubsub/pom.xml b/redis/pubsub/pom.xml index 9ba42bdf..761b002e 100644 --- a/redis/pubsub/pom.xml +++ b/redis/pubsub/pom.xml @@ -16,9 +16,13 @@ - ${project.groupId} - spring-data-redis-example-utils - ${project.version} + org.springframework.boot + spring-boot-testcontainers + test + + + org.springframework + spring-test test diff --git a/redis/pubsub/src/test/java/example/springdata/redis/RedisTestConfiguration.java b/redis/pubsub/src/test/java/example/springdata/redis/RedisTestConfiguration.java index cec2d756..1c38139c 100644 --- a/redis/pubsub/src/test/java/example/springdata/redis/RedisTestConfiguration.java +++ b/redis/pubsub/src/test/java/example/springdata/redis/RedisTestConfiguration.java @@ -15,10 +15,22 @@ */ package example.springdata.redis; +import com.redis.testcontainers.RedisContainer; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.testcontainers.service.connection.ServiceConnection; +import org.springframework.context.annotation.Bean; +import org.testcontainers.utility.DockerImageName; /** * @author Mark Paluch + * @author Christoph Strobl */ @SpringBootApplication -public class RedisTestConfiguration {} +public class RedisTestConfiguration { + + @Bean + @ServiceConnection(name = "redis") + RedisContainer redisContainer() { + return new RedisContainer(DockerImageName.parse("redis:7")); + } +} diff --git a/redis/reactive/pom.xml b/redis/reactive/pom.xml index b730243d..241bec0f 100644 --- a/redis/reactive/pom.xml +++ b/redis/reactive/pom.xml @@ -41,9 +41,13 @@ - ${project.groupId} - spring-data-redis-example-utils - ${project.version} + org.springframework.boot + spring-boot-testcontainers + test + + + org.springframework + spring-test test diff --git a/redis/reactive/src/test/java/example/springdata/redis/RedisTestConfiguration.java b/redis/reactive/src/test/java/example/springdata/redis/RedisTestConfiguration.java index 2191dcb8..b790f72c 100644 --- a/redis/reactive/src/test/java/example/springdata/redis/RedisTestConfiguration.java +++ b/redis/reactive/src/test/java/example/springdata/redis/RedisTestConfiguration.java @@ -15,28 +15,30 @@ */ package example.springdata.redis; -import jakarta.annotation.PreDestroy; - +import com.redis.testcontainers.RedisContainer; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; import org.springframework.data.redis.connection.ReactiveRedisConnectionFactory; -import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.core.ReactiveRedisTemplate; import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializationContext; import org.springframework.data.redis.serializer.RedisSerializationContext.RedisSerializationContextBuilder; import org.springframework.data.redis.serializer.StringRedisSerializer; +import org.testcontainers.utility.DockerImageName; /** * @author Mark Paluch + * @author Christoph Strobl */ @SpringBootApplication public class RedisTestConfiguration { @Bean - public LettuceConnectionFactory redisConnectionFactory() { - return new LettuceConnectionFactory(); + @ServiceConnection(name = "redis") + RedisContainer redisContainer() { + return new RedisContainer(DockerImageName.parse("redis:7")); } /** @@ -72,10 +74,4 @@ public class RedisTestConfiguration { return new ReactiveRedisTemplate<>(connectionFactory, serializationContext); } - /** - * Clear database before shut down. - */ - public @PreDestroy void flushTestDb() { - redisConnectionFactory().getConnection().flushDb(); - } } diff --git a/redis/reactive/src/test/java/example/springdata/redis/commands/KeyCommandsTests.java b/redis/reactive/src/test/java/example/springdata/redis/commands/KeyCommandsTests.java index 12620907..1dc5598e 100644 --- a/redis/reactive/src/test/java/example/springdata/redis/commands/KeyCommandsTests.java +++ b/redis/reactive/src/test/java/example/springdata/redis/commands/KeyCommandsTests.java @@ -15,19 +15,14 @@ */ package example.springdata.redis.commands; -import example.springdata.redis.RedisTestConfiguration; -import example.springdata.redis.test.condition.EnabledOnRedisAvailable; -import reactor.core.publisher.Flux; -import reactor.test.StepVerifier; - import java.nio.ByteBuffer; import java.time.Duration; import java.util.Collections; import java.util.UUID; +import example.springdata.redis.RedisTestConfiguration; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.connection.ReactiveRedisConnection; @@ -36,6 +31,8 @@ import org.springframework.data.redis.connection.ReactiveStringCommands.SetComma import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import org.springframework.data.redis.util.ByteUtils; +import reactor.core.publisher.Flux; +import reactor.test.StepVerifier; /** * Show usage of reactive operations on Redis keys using low level API provided by @@ -44,7 +41,6 @@ import org.springframework.data.redis.util.ByteUtils; * @author Mark Paluch */ @SpringBootTest(classes = RedisTestConfiguration.class) -@EnabledOnRedisAvailable class KeyCommandsTests { private static final String PREFIX = KeyCommandsTests.class.getSimpleName(); diff --git a/redis/reactive/src/test/java/example/springdata/redis/operations/JacksonJsonTests.java b/redis/reactive/src/test/java/example/springdata/redis/operations/JacksonJsonTests.java index 81b1cb18..716d775d 100644 --- a/redis/reactive/src/test/java/example/springdata/redis/operations/JacksonJsonTests.java +++ b/redis/reactive/src/test/java/example/springdata/redis/operations/JacksonJsonTests.java @@ -18,7 +18,6 @@ package example.springdata.redis.operations; import example.springdata.redis.EmailAddress; import example.springdata.redis.Person; import example.springdata.redis.RedisTestConfiguration; -import example.springdata.redis.test.condition.EnabledOnRedisAvailable; import lombok.extern.slf4j.Slf4j; import reactor.test.StepVerifier; @@ -39,7 +38,6 @@ import org.springframework.data.redis.util.ByteUtils; */ @Slf4j @SpringBootTest(classes = RedisTestConfiguration.class) -@EnabledOnRedisAvailable class JacksonJsonTests { @Autowired ReactiveRedisOperations typedOperations; diff --git a/redis/reactive/src/test/java/example/springdata/redis/operations/ListOperationsTests.java b/redis/reactive/src/test/java/example/springdata/redis/operations/ListOperationsTests.java index 4a15c86b..46457dc1 100644 --- a/redis/reactive/src/test/java/example/springdata/redis/operations/ListOperationsTests.java +++ b/redis/reactive/src/test/java/example/springdata/redis/operations/ListOperationsTests.java @@ -16,7 +16,6 @@ package example.springdata.redis.operations; import example.springdata.redis.RedisTestConfiguration; -import example.springdata.redis.test.condition.EnabledOnRedisAvailable; import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Mono; import reactor.test.StepVerifier; @@ -38,7 +37,6 @@ import org.springframework.data.redis.core.ReactiveRedisOperations; */ @Slf4j @SpringBootTest(classes = RedisTestConfiguration.class) -@EnabledOnRedisAvailable class ListOperationsTests { @Autowired ReactiveRedisOperations operations; diff --git a/redis/reactive/src/test/java/example/springdata/redis/operations/ValueOperationsTests.java b/redis/reactive/src/test/java/example/springdata/redis/operations/ValueOperationsTests.java index 87558b5a..f27cdb82 100644 --- a/redis/reactive/src/test/java/example/springdata/redis/operations/ValueOperationsTests.java +++ b/redis/reactive/src/test/java/example/springdata/redis/operations/ValueOperationsTests.java @@ -18,7 +18,6 @@ package example.springdata.redis.operations; import static org.assertj.core.api.Assertions.*; import example.springdata.redis.RedisTestConfiguration; -import example.springdata.redis.test.condition.EnabledOnRedisAvailable; import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Mono; import reactor.test.StepVerifier; @@ -39,7 +38,6 @@ import org.springframework.data.redis.core.ReactiveRedisOperations; */ @Slf4j @SpringBootTest(classes = RedisTestConfiguration.class) -@EnabledOnRedisAvailable class ValueOperationsTests { @Autowired ReactiveRedisOperations operations; diff --git a/redis/repositories/pom.xml b/redis/repositories/pom.xml index fd8a5e13..e8fdc3e1 100644 --- a/redis/repositories/pom.xml +++ b/redis/repositories/pom.xml @@ -15,15 +15,13 @@ - ${project.groupId} - spring-data-redis-example-utils - ${project.version} + org.springframework.boot + spring-boot-testcontainers test - - com.github.kstyrc - embedded-redis + org.springframework + spring-test test diff --git a/redis/repositories/src/test/java/example/springdata/redis/repositories/PersonRepositoryTests.java b/redis/repositories/src/test/java/example/springdata/redis/repositories/PersonRepositoryTests.java index d169460e..e325046f 100644 --- a/redis/repositories/src/test/java/example/springdata/redis/repositories/PersonRepositoryTests.java +++ b/redis/repositories/src/test/java/example/springdata/redis/repositories/PersonRepositoryTests.java @@ -17,7 +17,7 @@ package example.springdata.redis.repositories; import static org.assertj.core.api.Assertions.*; -import example.springdata.redis.test.condition.EnabledOnRedisAvailable; +import com.redis.testcontainers.RedisContainer; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; @@ -29,6 +29,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.data.redis.DataRedisTest; +import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.data.domain.Example; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -40,16 +41,23 @@ import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.core.RedisOperations; import org.springframework.data.redis.core.index.GeoIndexed; import org.springframework.data.redis.core.index.Indexed; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.utility.DockerImageName; /** * @author Christoph Strobl * @author Oliver Gierke * @author Mark Paluch */ +@Testcontainers @DataRedisTest -@EnabledOnRedisAvailable class PersonRepositoryTests { + @Container + @ServiceConnection + static RedisContainer redis = new RedisContainer(DockerImageName.parse("redis:7")); + /** {@link Charset} for String conversion **/ private static final Charset CHARSET = StandardCharsets.UTF_8; diff --git a/redis/streams/pom.xml b/redis/streams/pom.xml index 73d47336..8cdcce5f 100644 --- a/redis/streams/pom.xml +++ b/redis/streams/pom.xml @@ -22,9 +22,13 @@ - ${project.groupId} - spring-data-redis-example-utils - ${project.version} + org.springframework.boot + spring-boot-testcontainers + test + + + org.springframework + spring-test test diff --git a/redis/streams/src/test/java/example/springdata/redis/reactive/ReactiveStreamApiTests.java b/redis/streams/src/test/java/example/springdata/redis/reactive/ReactiveStreamApiTests.java index 2ed3a06c..ed061f71 100644 --- a/redis/streams/src/test/java/example/springdata/redis/reactive/ReactiveStreamApiTests.java +++ b/redis/streams/src/test/java/example/springdata/redis/reactive/ReactiveStreamApiTests.java @@ -18,8 +18,12 @@ package example.springdata.redis.reactive; import static org.assertj.core.api.Assertions.*; import static org.springframework.data.redis.connection.stream.StreamOffset.*; +import com.redis.testcontainers.RedisContainer; import example.springdata.redis.SensorData; -import example.springdata.redis.test.condition.EnabledOnCommand; +import org.springframework.boot.testcontainers.service.connection.ServiceConnection; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.utility.DockerImageName; import reactor.test.StepVerifier; import java.time.Duration; @@ -43,11 +47,15 @@ import org.springframework.data.redis.stream.StreamReceiver; /** * @author Christoph Strobl */ +@Testcontainers @DataRedisTest -@EnabledOnCommand("XADD") @ImportAutoConfiguration(RedisReactiveAutoConfiguration.class) class ReactiveStreamApiTests { + @Container + @ServiceConnection + static RedisContainer redis = new RedisContainer(DockerImageName.parse("redis:7")); + @Autowired ReactiveStringRedisTemplate template; @Autowired StreamReceiver> streamReceiver; diff --git a/redis/streams/src/test/java/example/springdata/redis/sync/SyncStreamApiTests.java b/redis/streams/src/test/java/example/springdata/redis/sync/SyncStreamApiTests.java index 0cf27940..b4d7d08a 100644 --- a/redis/streams/src/test/java/example/springdata/redis/sync/SyncStreamApiTests.java +++ b/redis/streams/src/test/java/example/springdata/redis/sync/SyncStreamApiTests.java @@ -18,8 +18,8 @@ package example.springdata.redis.sync; import static org.assertj.core.api.Assertions.*; import static org.springframework.data.redis.connection.stream.StreamOffset.*; +import com.redis.testcontainers.RedisContainer; import example.springdata.redis.SensorData; -import example.springdata.redis.test.condition.EnabledOnCommand; import java.util.concurrent.TimeUnit; @@ -28,6 +28,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.data.redis.DataRedisTest; +import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.data.redis.RedisSystemException; import org.springframework.data.redis.connection.stream.MapRecord; import org.springframework.data.redis.connection.stream.ReadOffset; @@ -36,15 +37,22 @@ import org.springframework.data.redis.connection.stream.StreamOffset; import org.springframework.data.redis.core.StreamOperations; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.stream.StreamMessageListenerContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.utility.DockerImageName; /** * @author Christoph Strobl * @author Mark Paluch */ +@Testcontainers @DataRedisTest -@EnabledOnCommand("XADD") class SyncStreamApiTests { + @Container + @ServiceConnection + static RedisContainer redis = new RedisContainer(DockerImageName.parse("redis:7")); + @Autowired StringRedisTemplate template; @Autowired StreamMessageListenerContainer> messageListenerContainer; diff --git a/redis/util/pom.xml b/redis/util/pom.xml index 09db062a..8d345c0d 100644 --- a/redis/util/pom.xml +++ b/redis/util/pom.xml @@ -25,12 +25,6 @@ lettuce-core - - com.github.kstyrc - embedded-redis - true - -