Skip to content

Commit 65c8ad4

Browse files
committed
Add test about ServiceBusDockerComposeTest in spring-messaging-azure-servicebus
1 parent 81b4c41 commit 65c8ad4

4 files changed

Lines changed: 258 additions & 1 deletion

File tree

servicebus/spring-messaging-azure-servicebus/servicebus-spring-messaging/pom.xml

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
<properties>
2323
<maven.compiler.source>17</maven.compiler.source>
2424
<maven.compiler.target>17</maven.compiler.target>
25-
<version.spring.cloud.azure>7.0.0</version.spring.cloud.azure>
25+
<version.spring.cloud.azure>7.1.0-beta.1</version.spring.cloud.azure>
2626
</properties>
2727

2828
<dependencyManagement>
@@ -46,6 +46,16 @@
4646
<groupId>com.azure.spring</groupId>
4747
<artifactId>spring-cloud-azure-starter</artifactId>
4848
</dependency>
49+
<dependency>
50+
<groupId>org.springframework.boot</groupId>
51+
<artifactId>spring-boot-starter-test</artifactId>
52+
<scope>test</scope>
53+
</dependency>
54+
<dependency>
55+
<groupId>com.azure.spring</groupId>
56+
<artifactId>spring-cloud-azure-docker-compose</artifactId>
57+
<scope>test</scope>
58+
</dependency>
4959
</dependencies>
5060

5161
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
package com.azure.spring.sample.servicebus.messaging;
2+
3+
4+
import com.azure.messaging.servicebus.ServiceBusMessage;
5+
import com.azure.messaging.servicebus.ServiceBusSenderClient;
6+
import com.azure.spring.cloud.autoconfigure.implementation.context.AzureGlobalPropertiesAutoConfiguration;
7+
import com.azure.spring.cloud.autoconfigure.implementation.servicebus.AzureServiceBusAutoConfiguration;
8+
import com.azure.spring.cloud.autoconfigure.implementation.servicebus.AzureServiceBusMessagingAutoConfiguration;
9+
import com.azure.spring.cloud.autoconfigure.implementation.servicebus.properties.AzureServiceBusConnectionDetails;
10+
import com.azure.spring.cloud.service.servicebus.consumer.ServiceBusErrorHandler;
11+
import com.azure.spring.cloud.service.servicebus.consumer.ServiceBusRecordMessageListener;
12+
import com.azure.spring.messaging.servicebus.core.ServiceBusTemplate;
13+
import org.junit.jupiter.api.Test;
14+
import org.springframework.beans.factory.annotation.Autowired;
15+
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
16+
import org.springframework.boot.test.context.SpringBootTest;
17+
import org.springframework.context.annotation.Bean;
18+
import org.springframework.context.annotation.Configuration;
19+
import org.springframework.messaging.support.MessageBuilder;
20+
21+
import java.time.Duration;
22+
import java.util.Set;
23+
import java.util.concurrent.ConcurrentHashMap;
24+
25+
import static org.assertj.core.api.Assertions.assertThat;
26+
import static org.awaitility.Awaitility.waitAtMost;
27+
28+
@SpringBootTest(properties = {
29+
"spring.docker.compose.skip.in-tests=false",
30+
"spring.docker.compose.file=classpath:servicebus-compose.yaml",
31+
"spring.docker.compose.stop.command=down",
32+
"spring.docker.compose.readiness.timeout=PT5M",
33+
"spring.cloud.azure.servicebus.namespace=sbemulatorns",
34+
"spring.cloud.azure.servicebus.entity-name=queue.1",
35+
"spring.cloud.azure.servicebus.entity-type=queue",
36+
"spring.cloud.azure.servicebus.producer.entity-name=queue.1",
37+
"spring.cloud.azure.servicebus.producer.entity-type=queue",
38+
"spring.cloud.azure.servicebus.processor.entity-name=queue.1",
39+
"spring.cloud.azure.servicebus.processor.entity-type=queue"
40+
})
41+
class ServiceBusDockerComposeTest {
42+
43+
@Autowired
44+
private AzureServiceBusConnectionDetails connectionDetails;
45+
46+
@Autowired
47+
private ServiceBusSenderClient senderClient;
48+
49+
@Autowired
50+
private ServiceBusTemplate serviceBusTemplate;
51+
52+
@Test
53+
void connectionDetailsShouldBeProvidedByFactory() {
54+
assertThat(connectionDetails).isNotNull();
55+
assertThat(connectionDetails.getConnectionString())
56+
.isNotBlank()
57+
.startsWith("Endpoint=sb://");
58+
}
59+
60+
@Test
61+
void senderClientCanSendMessage() {
62+
// Wait for Service Bus emulator to be fully ready and queue entity to be available
63+
// The emulator depends on SQL Edge and needs time to initialize the messaging entities
64+
waitAtMost(Duration.ofSeconds(120)).pollInterval(Duration.ofSeconds(2)).untilAsserted(() -> {
65+
this.senderClient.sendMessage(new ServiceBusMessage("Hello World!"));
66+
});
67+
68+
waitAtMost(Duration.ofSeconds(30)).pollDelay(Duration.ofSeconds(5)).untilAsserted(() -> {
69+
assertThat(Config.MESSAGES).contains("Hello World!");
70+
});
71+
}
72+
73+
@Test
74+
void serviceBusTemplateCanSendMessage() {
75+
// Wait for Service Bus emulator to be fully ready and queue entity to be available
76+
// The emulator depends on SQL Edge and needs time to initialize the messaging entities
77+
waitAtMost(Duration.ofSeconds(120)).pollInterval(Duration.ofSeconds(2)).untilAsserted(() -> {
78+
this.serviceBusTemplate.sendAsync("queue.1", MessageBuilder.withPayload("Hello from ServiceBusTemplate!").build()).block();
79+
});
80+
81+
waitAtMost(Duration.ofSeconds(30)).pollDelay(Duration.ofSeconds(5)).untilAsserted(() -> {
82+
assertThat(Config.MESSAGES).contains("Hello from ServiceBusTemplate!");
83+
});
84+
}
85+
86+
@Configuration(proxyBeanMethods = false)
87+
@ImportAutoConfiguration(classes = {
88+
AzureGlobalPropertiesAutoConfiguration.class,
89+
AzureServiceBusAutoConfiguration.class,
90+
AzureServiceBusMessagingAutoConfiguration.class})
91+
static class Config {
92+
93+
private static final Set<String> MESSAGES = ConcurrentHashMap.newKeySet();
94+
95+
@Bean
96+
ServiceBusRecordMessageListener processMessage() {
97+
return context -> {
98+
MESSAGES.add(context.getMessage().getBody().toString());
99+
};
100+
}
101+
102+
@Bean
103+
ServiceBusErrorHandler errorHandler() {
104+
// No-op error handler for tests: acknowledge errors without affecting test execution.
105+
return (context) -> {
106+
};
107+
}
108+
}
109+
}
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
{
2+
"UserConfig": {
3+
"Namespaces": [
4+
{
5+
"Name": "sbemulatorns",
6+
"Queues": [
7+
{
8+
"Name": "queue.1",
9+
"Properties": {
10+
"DeadLetteringOnMessageExpiration": false,
11+
"DefaultMessageTimeToLive": "PT1H",
12+
"DuplicateDetectionHistoryTimeWindow": "PT20S",
13+
"ForwardDeadLetteredMessagesTo": "",
14+
"ForwardTo": "",
15+
"LockDuration": "PT1M",
16+
"MaxDeliveryCount": 10,
17+
"RequiresDuplicateDetection": false,
18+
"RequiresSession": false
19+
}
20+
}
21+
],
22+
23+
"Topics": [
24+
{
25+
"Name": "topic.1",
26+
"Properties": {
27+
"DefaultMessageTimeToLive": "PT1H",
28+
"DuplicateDetectionHistoryTimeWindow": "PT20S",
29+
"RequiresDuplicateDetection": false
30+
},
31+
"Subscriptions": [
32+
{
33+
"Name": "subscription.1",
34+
"Properties": {
35+
"DeadLetteringOnMessageExpiration": false,
36+
"DefaultMessageTimeToLive": "PT1H",
37+
"LockDuration": "PT1M",
38+
"MaxDeliveryCount": 10,
39+
"ForwardDeadLetteredMessagesTo": "",
40+
"ForwardTo": "",
41+
"RequiresSession": false
42+
},
43+
"Rules": [
44+
{
45+
"Name": "app-prop-filter-1",
46+
"Properties": {
47+
"FilterType": "Correlation",
48+
"CorrelationFilter": {
49+
"ContentType": "application/text",
50+
"CorrelationId": "id1",
51+
"Label": "subject1",
52+
"MessageId": "msgid1",
53+
"ReplyTo": "someQueue",
54+
"ReplyToSessionId": "sessionId",
55+
"SessionId": "session1",
56+
"To": "xyz"
57+
}
58+
}
59+
}
60+
]
61+
},
62+
{
63+
"Name": "subscription.2",
64+
"Properties": {
65+
"DeadLetteringOnMessageExpiration": false,
66+
"DefaultMessageTimeToLive": "PT1H",
67+
"LockDuration": "PT1M",
68+
"MaxDeliveryCount": 10,
69+
"ForwardDeadLetteredMessagesTo": "",
70+
"ForwardTo": "",
71+
"RequiresSession": false
72+
},
73+
"Rules": [
74+
{
75+
"Name": "user-prop-filter-1",
76+
"Properties": {
77+
"FilterType": "Correlation",
78+
"CorrelationFilter": {
79+
"Properties": {
80+
"prop3": "value3"
81+
}
82+
}
83+
}
84+
}
85+
]
86+
},
87+
{
88+
"Name": "subscription.3",
89+
"Properties": {
90+
"DeadLetteringOnMessageExpiration": false,
91+
"DefaultMessageTimeToLive": "PT1H",
92+
"LockDuration": "PT1M",
93+
"MaxDeliveryCount": 10,
94+
"ForwardDeadLetteredMessagesTo": "",
95+
"ForwardTo": "",
96+
"RequiresSession": false
97+
}
98+
}
99+
]
100+
}
101+
]
102+
}
103+
],
104+
"Logging": {
105+
"Type": "File"
106+
}
107+
}
108+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
services:
2+
servicebus:
3+
image: mcr.microsoft.com/azure-messaging/servicebus-emulator:latest
4+
pull_policy: always
5+
volumes:
6+
- "./Config.json:/ServiceBus_Emulator/ConfigFiles/Config.json"
7+
ports:
8+
- "5672"
9+
environment:
10+
SQL_SERVER: sqledge
11+
MSSQL_SA_PASSWORD: A_Str0ng_Required_Password
12+
ACCEPT_EULA: Y
13+
depends_on:
14+
- sqledge
15+
networks:
16+
sb-emulator:
17+
aliases:
18+
- "sb-emulator"
19+
sqledge:
20+
image: "mcr.microsoft.com/azure-sql-edge:latest"
21+
networks:
22+
sb-emulator:
23+
aliases:
24+
- "sqledge"
25+
environment:
26+
ACCEPT_EULA: Y
27+
MSSQL_SA_PASSWORD: A_Str0ng_Required_Password
28+
29+
networks:
30+
sb-emulator:

0 commit comments

Comments
 (0)