Skip to content

Commit 776d02c

Browse files
adding tests to verify egress calls
1 parent 5fa5f3d commit 776d02c

File tree

4 files changed

+202
-0
lines changed

4 files changed

+202
-0
lines changed

saas-modules/twilio-whatsapp/pom.xml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,23 @@
4444
<artifactId>json</artifactId>
4545
<version>${json.version}</version>
4646
</dependency>
47+
<dependency>
48+
<groupId>org.mock-server</groupId>
49+
<artifactId>mockserver-netty</artifactId>
50+
<version>${mockserver.version}</version>
51+
</dependency>
52+
<dependency>
53+
<groupId>org.mock-server</groupId>
54+
<artifactId>mockserver-spring-test-listener</artifactId>
55+
<version>${mockserver.version}</version>
56+
</dependency>
4757
</dependencies>
4858

4959
<properties>
5060
<java.version>17</java.version>
5161
<json.version>20240303</json.version>
5262
<twilio.version>10.4.1</twilio.version>
63+
<mockserver.version>5.15.0</mockserver.version>
5364
</properties>
5465

5566
</project>
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package com.baeldung.twilio.whatsapp;
2+
3+
import javax.net.ssl.SSLContext;
4+
5+
import org.apache.http.HttpHost;
6+
import org.apache.http.client.config.RequestConfig;
7+
import org.apache.http.conn.ssl.NoopHostnameVerifier;
8+
import org.apache.http.impl.client.HttpClientBuilder;
9+
import org.apache.http.ssl.SSLContextBuilder;
10+
11+
import com.twilio.http.HttpClient;
12+
import com.twilio.http.NetworkHttpClient;
13+
import com.twilio.http.TwilioRestClient;
14+
import com.twilio.http.TwilioRestClient.Builder;
15+
16+
import lombok.RequiredArgsConstructor;
17+
import lombok.SneakyThrows;
18+
19+
@RequiredArgsConstructor
20+
class TwilioProxyClient {
21+
22+
private final String accountSid;
23+
private final String authToken;
24+
private final String host;
25+
private final int port;
26+
27+
public TwilioRestClient getHttpClient() {
28+
HttpClient httpClient = createHttpClient();
29+
return new Builder(accountSid, authToken)
30+
.httpClient(httpClient)
31+
.build();
32+
}
33+
34+
@SneakyThrows
35+
private HttpClient createHttpClient() {
36+
SSLContext sslContext = SSLContextBuilder.create()
37+
.loadTrustMaterial((chain, authType) -> true)
38+
.build();
39+
40+
HttpClientBuilder clientBuilder = HttpClientBuilder.create()
41+
.setSSLContext(sslContext)
42+
.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
43+
.setProxy(new HttpHost(host, port))
44+
.setDefaultRequestConfig(RequestConfig.DEFAULT);
45+
46+
return new NetworkHttpClient(clientBuilder);
47+
}
48+
49+
}
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
package com.baeldung.twilio.whatsapp;
2+
3+
import static org.mockserver.model.HttpRequest.request;
4+
import static org.mockserver.model.HttpResponse.response;
5+
import static org.mockserver.model.Parameter.param;
6+
7+
import java.net.InetSocketAddress;
8+
9+
import org.junit.jupiter.api.BeforeEach;
10+
import org.junit.jupiter.api.Test;
11+
import org.mockserver.client.MockServerClient;
12+
import org.mockserver.model.ParameterBody;
13+
import org.mockserver.springtest.MockServerTest;
14+
import org.mockserver.verify.VerificationTimes;
15+
import org.springframework.beans.factory.annotation.Autowired;
16+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
17+
import org.springframework.boot.test.context.SpringBootTest;
18+
import org.springframework.test.context.ActiveProfiles;
19+
20+
import com.twilio.Twilio;
21+
22+
import net.bytebuddy.utility.RandomString;
23+
24+
@SpringBootTest
25+
@MockServerTest
26+
@ActiveProfiles("integration-test")
27+
@EnableConfigurationProperties(TwilioConfigurationProperties.class)
28+
class WhatsappMessageDispatcherIntegrationTest {
29+
30+
private MockServerClient mockServerClient;
31+
32+
@Autowired
33+
private WhatsappMessageDispatcher whatsappMessageDispatcher;
34+
35+
@Autowired
36+
private TwilioConfigurationProperties twilioConfigurationProperties;
37+
38+
private String twilioApiPath;
39+
40+
private static final String EMPTY_JSON = "{}";
41+
42+
@BeforeEach
43+
void setUp() {
44+
String accountSid = twilioConfigurationProperties.getAccountSid();
45+
String authToken = twilioConfigurationProperties.getAuthToken();
46+
47+
InetSocketAddress remoteAddress = mockServerClient.remoteAddress();
48+
String host = remoteAddress.getHostName();
49+
int port = remoteAddress.getPort();
50+
51+
TwilioProxyClient twilioProxyClient = new TwilioProxyClient(accountSid, authToken, host, port);
52+
Twilio.setRestClient(twilioProxyClient.getHttpClient());
53+
54+
twilioApiPath = String.format("/2010-04-01/Accounts/%s/Messages.json", accountSid);
55+
}
56+
57+
@Test
58+
void whenNewArticleNotificationDispatched_thenTwilioApiCalledWithCorrectParameters() {
59+
// Set up test data
60+
String contentSid = twilioConfigurationProperties.getNewArticleNotification().getContentSid();
61+
String messagingSid = twilioConfigurationProperties.getMessagingSid();
62+
String contactNumber = "+911001001000";
63+
64+
// Configure mock server expectations
65+
mockServerClient
66+
.when(request()
67+
.withMethod("POST")
68+
.withPath(twilioApiPath)
69+
.withBody(new ParameterBody(
70+
param("To", String.format("whatsapp:%s", contactNumber)),
71+
param("ContentSid", contentSid),
72+
param("MessagingServiceSid", messagingSid)
73+
))
74+
)
75+
.respond(response()
76+
.withStatusCode(200)
77+
.withBody(EMPTY_JSON));
78+
79+
// Invoke method under test
80+
whatsappMessageDispatcher.dispatchNewArticleNotification(contactNumber, RandomString.make());
81+
82+
// Verify the expected request was made
83+
mockServerClient.verify(request()
84+
.withMethod("POST")
85+
.withPath(twilioApiPath)
86+
.withBody(new ParameterBody(
87+
param("To", String.format("whatsapp:%s", contactNumber)),
88+
param("ContentSid", contentSid),
89+
param("MessagingServiceSid", messagingSid)
90+
)),
91+
VerificationTimes.once()
92+
);
93+
}
94+
95+
@Test
96+
void whenReplyMessageDispatched_thenTwilioApiCalledWithCorrectParameters() {
97+
// Set up test data
98+
String username = RandomString.make();
99+
String messageBody = String.format("Hey %s, our team will get back to you shortly.", username);
100+
String messagingSid = twilioConfigurationProperties.getMessagingSid();
101+
String contactNumber = "+911001001000";
102+
103+
// Configure mock server expectations
104+
mockServerClient
105+
.when(request()
106+
.withMethod("POST")
107+
.withPath(twilioApiPath)
108+
.withBody(new ParameterBody(
109+
param("To", String.format("whatsapp:%s", contactNumber)),
110+
param("MessagingServiceSid", messagingSid),
111+
param("Body", messageBody)
112+
))
113+
)
114+
.respond(response()
115+
.withStatusCode(200)
116+
.withBody(EMPTY_JSON));
117+
118+
// Invoke method under test
119+
whatsappMessageDispatcher.dispatchReplyMessage(contactNumber, username);
120+
121+
// Verify the expected request was made
122+
mockServerClient.verify(request()
123+
.withMethod("POST")
124+
.withPath(twilioApiPath)
125+
.withBody(new ParameterBody(
126+
param("To", String.format("whatsapp:%s", contactNumber)),
127+
param("MessagingServiceSid", messagingSid),
128+
param("Body", messageBody)
129+
)),
130+
VerificationTimes.once()
131+
);
132+
}
133+
134+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
com:
2+
baeldung:
3+
twilio:
4+
account-sid: AC123abc123abc123abc123abc123abc12
5+
auth-token: test-auth-token
6+
messaging-sid: MG123abc123abc123abc123abc123abc12
7+
new-article-notification:
8+
content-sid: HX123abc123abc123abc123abc123abc12

0 commit comments

Comments
 (0)