Skip to content

Commit 82a95cb

Browse files
committed
Coverage
1 parent 6db503b commit 82a95cb

File tree

6 files changed

+112
-13
lines changed

6 files changed

+112
-13
lines changed

src/main/kotlin/io/github/tobi/laa/spring/boot/embedded/redis/junit/extension/RedisValidationExtension.kt

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,15 @@ import io.github.tobi.laa.spring.boot.embedded.redis.server.EmbeddedRedisServer
55
import io.github.tobi.laa.spring.boot.embedded.redis.shardedcluster.EmbeddedRedisShardedCluster
66
import org.junit.jupiter.api.extension.BeforeAllCallback
77
import org.junit.jupiter.api.extension.ExtensionContext
8+
import kotlin.reflect.KClass
89

910
/**
1011
* JUnit 5 extension to validate that the API is used correctly.
1112
*/
1213
internal class RedisValidationExtension : BeforeAllCallback {
1314

15+
private val VALID_PORT_RANGE = 0..65535
16+
1417
override fun beforeAll(context: ExtensionContext?) {
1518
val embeddedRedisServer = annotation(context, EmbeddedRedisServer::class.java)
1619
val embeddedRedisCluster = annotation(context, EmbeddedRedisCluster::class.java)
@@ -31,21 +34,29 @@ internal class RedisValidationExtension : BeforeAllCallback {
3134
}
3235

3336
private fun validateServer(config: EmbeddedRedisServer) {
34-
validatePort(config.port)
37+
require(config.port in VALID_PORT_RANGE) { "Port must be in range $VALID_PORT_RANGE" }
3538
require(config.configFile.isEmpty() || config.settings.isEmpty()) { "Either 'configFile' or 'settings' can be set, but not both" }
36-
require(config.customizer.all { it.constructors.any { it.parameters.isEmpty() } }) { "Customizers must have a no-arg constructor" }
39+
validateCustomizers(config.customizer)
3740
}
3841

3942
private fun validateCluster(config: EmbeddedRedisCluster) {
4043
TODO()
4144
}
4245

4346
private fun validateShardedCluster(config: EmbeddedRedisShardedCluster) {
44-
TODO()
47+
require(config.shards.all { it.replicas > 0 }) { "Replicas for all shards must be greater than 0" }
48+
require(config.ports.isEmpty() || config.ports.size == config.shards.sumOf { it.replicas + 1 }) { "If ports are specified, they must match the number of nodes" }
49+
require(config.ports.all { it in VALID_PORT_RANGE }) { "All ports must be in range $VALID_PORT_RANGE" }
50+
require(config.initializationTimeout > 0) { "Initialization timeout must be greater than 0" }
51+
validateCustomizers(config.customizer)
52+
}
53+
54+
private fun <T : Any> validateCustomizers(customizer: Array<KClass<out T>>) {
55+
require(customizer.all { haveNoArgConstructor(it) }) { "Customizers must have a no-arg constructor" }
4556
}
4657

47-
private fun validatePort(port: Int) {
48-
require(port in 0..65535) { "Port must be in range 0..65535" }
58+
private fun <T : Any> haveNoArgConstructor(customizer: KClass<out T>): Boolean {
59+
return customizer.constructors.any { it.parameters.isEmpty() }
4960
}
5061

5162
private fun <A : Annotation> annotation(extensionContext: ExtensionContext?, type: Class<A>): A? {

src/main/kotlin/io/github/tobi/laa/spring/boot/embedded/redis/shardedcluster/EmbeddedRedisShardedCluster.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package io.github.tobi.laa.spring.boot.embedded.redis.shardedcluster
22

3-
import io.github.tobi.laa.spring.boot.embedded.redis.junit.extension.RedisFlushAllExtension
4-
import org.junit.jupiter.api.extension.ExtendWith
3+
import io.github.tobi.laa.spring.boot.embedded.redis.junit.extension.EmbeddedRedisTest
54
import org.springframework.test.context.ContextCustomizerFactories
65
import kotlin.reflect.KClass
76

@@ -11,7 +10,7 @@ import kotlin.reflect.KClass
1110
@Target(AnnotationTarget.CLASS)
1211
@Retention(AnnotationRetention.RUNTIME)
1312
@MustBeDocumented
14-
@ExtendWith(RedisFlushAllExtension::class)
13+
@EmbeddedRedisTest
1514
@ContextCustomizerFactories(RedisShardedClusterContextCustomizerFactory::class)
1615
annotation class EmbeddedRedisShardedCluster(
1716

src/main/resources/birds.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11191,4 +11191,4 @@ Turquoise Tanager
1119111191
White-bellied Tanager
1119211192
Paradise Tanager
1119311193
Opal-crowned Tanager
11194-
Opal-rumped Tanager
11194+
Opal-rumped Tanager

src/test/kotlin/io/github/tobi/laa/spring/boot/embedded/redis/server/RedisServerContextCustomizerTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ internal class RedisServerContextCustomizerTest {
4040
@Test
4141
@DisplayName("Closing ApplicationContext should stop Redis server and Redis client")
4242
fun closingApplicationContext_shouldStopRedisServerAndRedisClient() {
43-
var server: Redis? = null
44-
var client: UnifiedJedis? = null
43+
var server: Redis?
44+
var client: UnifiedJedis?
4545
AnnotationConfigApplicationContext().use {
4646
RedisServerContextCustomizerFactory()
4747
.createContextCustomizer(AnnotatedClass::class.java, mutableListOf())
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package io.github.tobi.laa.spring.boot.embedded.redis.shardedcluster
2+
3+
import io.github.tobi.laa.spring.boot.embedded.redis.IntegrationTest
4+
import io.github.tobi.laa.spring.boot.embedded.redis.RedisStore
5+
import org.assertj.core.api.Assertions
6+
import org.junit.jupiter.api.*
7+
import org.springframework.context.ApplicationContext
8+
import redis.embedded.Redis
9+
import redis.embedded.RedisShardedCluster
10+
11+
@IntegrationTest
12+
@EmbeddedRedisShardedCluster
13+
@TestMethodOrder(MethodOrderer.OrderAnnotation::class)
14+
@DisplayName("Parameter resolver test for @EmbeddedRedisShardedCluster")
15+
internal class ParamResolverTest {
16+
17+
var paramsFromBeforeEach = listOf<Redis>()
18+
var paramsFromAfterEach = listOf<Redis>()
19+
20+
@Test
21+
@Order(1)
22+
@DisplayName("Should resolve @Test parameters correctly")
23+
fun shouldResolveTestParamsCorrectly(redis: Redis, redisCluster: RedisShardedCluster) {
24+
thenParamIsCorrectlyResolved(redis)
25+
thenParamIsCorrectlyResolved(redisCluster)
26+
}
27+
28+
@BeforeEach
29+
fun beforeEach(redis: Redis, redisCluster: RedisShardedCluster) {
30+
paramsFromBeforeEach = listOf(redis, redisCluster)
31+
}
32+
33+
@Test
34+
@Order(2)
35+
@DisplayName("Should resolve @BeforeEach params correctly")
36+
fun shouldResolveBeforeEachParamsCorrectly() {
37+
paramsFromBeforeEach.forEach { thenParamIsCorrectlyResolved(it) }
38+
}
39+
40+
@Test
41+
@Order(3)
42+
@DisplayName("Should resolve @BeforeAll params correctly")
43+
fun shouldResolveBeforeAllParamsCorrectly() {
44+
paramsFromBeforeAll.forEach { thenParamIsCorrectlyResolved(it) }
45+
}
46+
47+
@AfterEach
48+
fun afterEach(redis: Redis, redisCluster: RedisShardedCluster) {
49+
paramsFromAfterEach = listOf(redis, redisCluster)
50+
}
51+
52+
@Test
53+
@Order(4)
54+
@DisplayName("Should resolve @AfterEach params correctly")
55+
fun shouldResolveAfterEachParamsCorrectly() {
56+
paramsFromAfterEach.forEach { thenParamIsCorrectlyResolved(it) }
57+
}
58+
59+
private companion object {
60+
61+
var paramsFromBeforeAll = listOf<Redis>()
62+
63+
var context: ApplicationContext? = null
64+
65+
@JvmStatic
66+
@BeforeAll
67+
fun injectContext(context: ApplicationContext) {
68+
this.context = context
69+
}
70+
71+
@JvmStatic
72+
@BeforeAll
73+
fun beforeAll(redis: Redis, redisCluster: RedisShardedCluster) {
74+
paramsFromBeforeAll = listOf(redis, redisCluster)
75+
}
76+
77+
@JvmStatic
78+
@AfterAll
79+
fun afterAll(redis: Redis, redisCluster: RedisShardedCluster) {
80+
// no @Test methods will be executed after this method, so assertions are put here instead
81+
thenParamIsCorrectlyResolved(redis)
82+
thenParamIsCorrectlyResolved(redisCluster)
83+
}
84+
85+
private fun thenParamIsCorrectlyResolved(param: Any?) {
86+
Assertions.assertThat(param).isNotNull.isEqualTo(RedisStore.server(context!!)!!)
87+
}
88+
}
89+
}

src/test/kotlin/io/github/tobi/laa/spring/boot/embedded/redis/shardedcluster/RedisShardedClusterContextCustomizerTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ internal class RedisShardedClusterContextCustomizerTest {
4141
@Test
4242
@DisplayName("Closing ApplicationContext should stop Redis server and Redis client")
4343
fun closingApplicationContext_shouldStopRedisServerAndRedisClient() {
44-
var server: Redis? = null
45-
var client: UnifiedJedis? = null
44+
var server: Redis?
45+
var client: UnifiedJedis?
4646
AnnotationConfigApplicationContext().use {
4747
RedisShardedClusterContextCustomizerFactory()
4848
.createContextCustomizer(AnnotatedClass::class.java, mutableListOf())

0 commit comments

Comments
 (0)