Skip to content

Commit 939eaf6

Browse files
authored
#2 add RabbitMQ support (#7)
1 parent 306171c commit 939eaf6

8 files changed

Lines changed: 156 additions & 0 deletions

File tree

README.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,23 @@ dependencies {
278278
* `minio.secret-key`
279279
* `minio.region`
280280

281+
## RabbitMQ
282+
283+
* **Module-ID**: rabbitmq
284+
* **Default-Image**: rabbitmq
285+
286+
````kotlin
287+
dependencies {
288+
testResourcesImplementation ("io.cloudflight.testresources.springboot:springboot-testresources-rabbitmq:0.0.3")
289+
}
290+
````
291+
292+
* **Provided properties**:
293+
* `spring.rabbitmq.host`
294+
* `spring.rabbitmq.port`
295+
* `spring.rabbitmq.username`
296+
* `spring.rabbitmq.password`
297+
281298
## Redis
282299

283300
* **Module-ID**: redis

settings.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@ include("springboot-testresources-minio")
99
include("springboot-testresources-jdbc")
1010
include("springboot-testresources-jdbc:springboot-testresources-jdbc-mariadb")
1111
include("springboot-testresources-jdbc:springboot-testresources-jdbc-postgres")
12+
include("springboot-testresources-rabbitmq")
1213
include("springboot-testresources-redis")
1314

1415
include("testprojects:jdbc:mariadb")
1516
include("testprojects:jdbc:postgres")
1617
include("testprojects:minio")
18+
include("testprojects:rabbitmq")
1719
include("testprojects:redis")
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
description = "Spring Boot TestResourceProvider for RabbitMQ"
2+
3+
dependencies {
4+
implementation("org.testcontainers:rabbitmq")
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package io.cloudflight.testresources.springboot.rabbitmq;
2+
3+
import io.micronaut.testresources.testcontainers.AbstractTestContainersProvider;
4+
import org.testcontainers.containers.RabbitMQContainer;
5+
import org.testcontainers.utility.DockerImageName;
6+
7+
import java.util.*;
8+
9+
public class RabbitMQTestResourceProvider extends AbstractTestContainersProvider<RabbitMQContainer> {
10+
11+
private static final String RABBITMQ_HOST = "spring.rabbitmq.host";
12+
private static final String RABBITMQ_PORT = "spring.rabbitmq.port";
13+
private static final String RABBITMQ_USERNAME = "spring.rabbitmq.username";
14+
private static final String RABBITMQ_PASSWORD = "spring.rabbitmq.password";
15+
private static final String DEFAULT_IMAGE = "rabbitmq";
16+
private static final String SIMPLE_NAME = "rabbitmq";
17+
18+
private static final List<String> SUPPORTED_KEYS = List.of(RABBITMQ_HOST, RABBITMQ_PORT, RABBITMQ_USERNAME, RABBITMQ_PASSWORD);
19+
private static final Set<String> SUPPORTED_KEYSET = Set.copyOf(SUPPORTED_KEYS);
20+
21+
@Override
22+
public List<String> getResolvableProperties(Map<String, Collection<String>> propertyEntries, Map<String, Object> testResourcesConfig) {
23+
return SUPPORTED_KEYS;
24+
}
25+
26+
@Override
27+
protected String getSimpleName() {
28+
return SIMPLE_NAME;
29+
}
30+
31+
@Override
32+
protected String getDefaultImageName() {
33+
return DEFAULT_IMAGE;
34+
}
35+
36+
@Override
37+
protected RabbitMQContainer createContainer(DockerImageName imageName, Map<String, Object> requestedProperties, Map<String, Object> testResourcesConfiguration) {
38+
return new RabbitMQContainer(imageName);
39+
}
40+
41+
@Override
42+
protected Optional<String> resolveProperty(String propertyName, RabbitMQContainer container) {
43+
switch (propertyName) {
44+
case RABBITMQ_HOST -> {
45+
return Optional.of(container.getHost());
46+
}
47+
case RABBITMQ_PORT -> {
48+
return Optional.of(container.getAmqpPort().toString());
49+
}
50+
case RABBITMQ_USERNAME -> {
51+
return Optional.of(container.getAdminUsername());
52+
}
53+
case RABBITMQ_PASSWORD -> {
54+
return Optional.of(container.getAdminPassword());
55+
}
56+
default -> {
57+
return Optional.empty();
58+
}
59+
}
60+
}
61+
62+
@Override
63+
protected boolean shouldAnswer(String propertyName, Map<String, Object> requestedProperties, Map<String, Object> testResourcesConfiguration) {
64+
return SUPPORTED_KEYSET.contains(propertyName);
65+
}
66+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
io.cloudflight.testresources.springboot.rabbitmq.RabbitMQTestResourceProvider
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
plugins {
2+
id("io.micronaut.test-resources")
3+
}
4+
5+
dependencies {
6+
implementation("org.springframework.boot:spring-boot-starter-amqp")
7+
8+
testImplementation("org.springframework.boot:spring-boot-starter-test")
9+
testImplementation("org.awaitility:awaitility")
10+
11+
testRuntimeOnly(project(":springboot-testresources-client"))
12+
testResourcesImplementation(project(":springboot-testresources-rabbitmq"))
13+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package io.cloudflight.testresources.springboot.rabbitmq
2+
3+
import org.springframework.amqp.core.Queue
4+
import org.springframework.amqp.rabbit.annotation.RabbitListener
5+
import org.springframework.boot.autoconfigure.SpringBootApplication
6+
import org.springframework.context.annotation.Bean
7+
import org.springframework.context.annotation.Configuration
8+
import org.springframework.stereotype.Service
9+
10+
@SpringBootApplication
11+
class Application
12+
13+
@Configuration
14+
class AmqpConfiguration {
15+
@Bean
16+
fun myQueue(): Queue {
17+
return Queue("myQueue", false)
18+
}
19+
}
20+
21+
@Service
22+
class Receiver {
23+
24+
val messages = mutableListOf<String>()
25+
@RabbitListener(queues = ["myQueue"])
26+
fun listen(message: String) {
27+
messages.add(message)
28+
}
29+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package io.cloudflight.testresources.springboot.rabbitmq
2+
3+
import org.awaitility.Awaitility.await
4+
import org.junit.jupiter.api.Test
5+
import org.springframework.amqp.rabbit.core.RabbitTemplate
6+
import org.springframework.beans.factory.annotation.Autowired
7+
import org.springframework.boot.test.context.SpringBootTest
8+
import java.time.Duration.ofSeconds
9+
10+
@SpringBootTest
11+
class ApplicationTest(
12+
@Autowired private val rabbitTemplate: RabbitTemplate,
13+
@Autowired private val receiver: Receiver
14+
) {
15+
16+
@Test
17+
fun `send message via RabbitMQ`() {
18+
rabbitTemplate.convertAndSend("myQueue", "Hello, world!");
19+
await().atMost(ofSeconds(5)).until {
20+
receiver.messages.size == 1 && receiver.messages.first() == "Hello, world!"
21+
}
22+
}
23+
}

0 commit comments

Comments
 (0)