1+ import com .azure .messaging .servicebus .ServiceBusMessage ;
2+ import com .azure .messaging .servicebus .ServiceBusSenderClient ;
3+ import com .azure .spring .cloud .autoconfigure .implementation .context .AzureGlobalPropertiesAutoConfiguration ;
4+ import com .azure .spring .cloud .autoconfigure .implementation .servicebus .AzureServiceBusAutoConfiguration ;
5+ import com .azure .spring .cloud .autoconfigure .implementation .servicebus .AzureServiceBusMessagingAutoConfiguration ;
6+ import com .azure .spring .cloud .autoconfigure .implementation .servicebus .properties .AzureServiceBusConnectionDetails ;
7+ import com .azure .spring .cloud .service .servicebus .consumer .ServiceBusErrorHandler ;
8+ import com .azure .spring .cloud .service .servicebus .consumer .ServiceBusRecordMessageListener ;
9+ import com .azure .spring .messaging .servicebus .core .ServiceBusTemplate ;
10+ import org .junit .jupiter .api .Test ;
11+ import org .springframework .beans .factory .annotation .Autowired ;
12+ import org .springframework .boot .autoconfigure .ImportAutoConfiguration ;
13+ import org .springframework .boot .test .context .SpringBootTest ;
14+ import org .springframework .context .annotation .Bean ;
15+ import org .springframework .context .annotation .Configuration ;
16+ import org .springframework .messaging .support .MessageBuilder ;
17+
18+ import java .time .Duration ;
19+ import java .util .Set ;
20+ import java .util .concurrent .ConcurrentHashMap ;
21+
22+ import static org .assertj .core .api .Assertions .assertThat ;
23+ import static org .awaitility .Awaitility .waitAtMost ;
24+
25+ @ SpringBootTest (properties = {
26+ "spring.docker.compose.skip.in-tests=false" ,
27+ "spring.docker.compose.file=classpath:servicebus-compose.yaml" ,
28+ "spring.docker.compose.stop.command=down" ,
29+ "spring.docker.compose.readiness.timeout=PT5M" ,
30+ "spring.cloud.azure.servicebus.namespace=sbemulatorns" ,
31+ "spring.cloud.azure.servicebus.entity-name=queue.1" ,
32+ "spring.cloud.azure.servicebus.entity-type=queue" ,
33+ "spring.cloud.azure.servicebus.producer.entity-name=queue.1" ,
34+ "spring.cloud.azure.servicebus.producer.entity-type=queue" ,
35+ "spring.cloud.azure.servicebus.processor.entity-name=queue.1" ,
36+ "spring.cloud.azure.servicebus.processor.entity-type=queue"
37+ })
38+ class ServiceBusDockerComposeTest {
39+
40+ @ Autowired
41+ private AzureServiceBusConnectionDetails connectionDetails ;
42+
43+ @ Autowired
44+ private ServiceBusSenderClient senderClient ;
45+
46+ @ Autowired
47+ private ServiceBusTemplate serviceBusTemplate ;
48+
49+ @ Test
50+ void connectionDetailsShouldBeProvidedByFactory () {
51+ assertThat (connectionDetails ).isNotNull ();
52+ assertThat (connectionDetails .getConnectionString ())
53+ .isNotBlank ()
54+ .startsWith ("Endpoint=sb://" );
55+ }
56+
57+ @ Test
58+ void senderClientCanSendMessage () {
59+ // Wait for Service Bus emulator to be fully ready and queue entity to be available
60+ // The emulator depends on SQL Edge and needs time to initialize the messaging entities
61+ waitAtMost (Duration .ofSeconds (120 )).pollInterval (Duration .ofSeconds (2 )).untilAsserted (() -> {
62+ this .senderClient .sendMessage (new ServiceBusMessage ("Hello World!" ));
63+ });
64+
65+ waitAtMost (Duration .ofSeconds (30 )).pollDelay (Duration .ofSeconds (5 )).untilAsserted (() -> {
66+ assertThat (Config .MESSAGES ).contains ("Hello World!" );
67+ });
68+ }
69+
70+ @ Test
71+ void serviceBusTemplateCanSendMessage () {
72+ // Wait for Service Bus emulator to be fully ready and queue entity to be available
73+ // The emulator depends on SQL Edge and needs time to initialize the messaging entities
74+ waitAtMost (Duration .ofSeconds (120 )).pollInterval (Duration .ofSeconds (2 )).untilAsserted (() -> {
75+ this .serviceBusTemplate .sendAsync ("queue.1" , MessageBuilder .withPayload ("Hello from ServiceBusTemplate!" ).build ()).block ();
76+ });
77+
78+ waitAtMost (Duration .ofSeconds (30 )).pollDelay (Duration .ofSeconds (5 )).untilAsserted (() -> {
79+ assertThat (Config .MESSAGES ).contains ("Hello from ServiceBusTemplate!" );
80+ });
81+ }
82+
83+ @ Configuration (proxyBeanMethods = false )
84+ @ ImportAutoConfiguration (classes = {
85+ AzureGlobalPropertiesAutoConfiguration .class ,
86+ AzureServiceBusAutoConfiguration .class ,
87+ AzureServiceBusMessagingAutoConfiguration .class })
88+ static class Config {
89+
90+ private static final Set <String > MESSAGES = ConcurrentHashMap .newKeySet ();
91+
92+ @ Bean
93+ ServiceBusRecordMessageListener processMessage () {
94+ return context -> {
95+ MESSAGES .add (context .getMessage ().getBody ().toString ());
96+ };
97+ }
98+
99+ @ Bean
100+ ServiceBusErrorHandler errorHandler () {
101+ // No-op error handler for tests: acknowledge errors without affecting test execution.
102+ return (context ) -> {
103+ };
104+ }
105+ }
106+ }
0 commit comments