Skip to content
This repository was archived by the owner on Aug 2, 2022. It is now read-only.

Commit cf82f1b

Browse files
authored
Allow empty notification responses (#272)
This change allows notification responses to be empty. Added unit tests to SlackDestinationTest, ChimeDestinationTest, and CustomWebhookMessageTest that cover null, empty, and non-empty response entities. Fixes #133.
1 parent 8cd9c99 commit cf82f1b

File tree

4 files changed

+267
-15
lines changed

4 files changed

+267
-15
lines changed

notification/src/main/java/com/amazon/opendistroforelasticsearch/alerting/destination/response/DestinationResponse.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515

1616
package com.amazon.opendistroforelasticsearch.alerting.destination.response;
1717

18-
import org.elasticsearch.common.Strings;
19-
2018
/**
2119
* This class is a place holder for destination response metadata
2220
*/
@@ -26,7 +24,7 @@ public class DestinationResponse extends BaseResponse {
2624

2725
private DestinationResponse(final String responseString, final int statusCode) {
2826
super(statusCode);
29-
if (Strings.isNullOrEmpty(responseString)) {
27+
if (responseString == null) {
3028
throw new IllegalArgumentException("Response is missing");
3129
}
3230
this.responseContent = responseString;

notification/src/test/java/com/amazon/opendistroforelasticsearch/alerting/destination/ChimeDestinationTest.java

Lines changed: 83 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.amazon.opendistroforelasticsearch.alerting.destination.response.DestinationResponse;
2525
import org.apache.http.client.methods.CloseableHttpResponse;
2626
import org.apache.http.client.methods.HttpPost;
27+
import org.apache.http.entity.StringEntity;
2728
import org.apache.http.impl.client.CloseableHttpClient;
2829
import org.apache.http.message.BasicStatusLine;
2930
import org.easymock.EasyMock;
@@ -35,11 +36,14 @@
3536
public class ChimeDestinationTest {
3637

3738
@Test
38-
public void testChimeMessage() throws Exception {
39+
public void testChimeMessage_NullEntityResponse() throws Exception {
3940
CloseableHttpClient mockHttpClient = EasyMock.createMock(CloseableHttpClient.class);
4041

41-
DestinationResponse expectedChimeResponse = new DestinationResponse.Builder().withResponseContent("{}")
42-
.withStatusCode(RestStatus.OK.getStatus()).build();
42+
// The DestinationHttpClient replaces a null entity with "{}".
43+
DestinationResponse expectedChimeResponse = new DestinationResponse.Builder()
44+
.withResponseContent("{}")
45+
.withStatusCode(RestStatus.OK.getStatus())
46+
.build();
4347
CloseableHttpResponse httpResponse = EasyMock.createMock(CloseableHttpResponse.class);
4448
EasyMock.expect(mockHttpClient.execute(EasyMock.anyObject(HttpPost.class))).andReturn(httpResponse);
4549

@@ -70,6 +74,82 @@ public void testChimeMessage() throws Exception {
7074
assertEquals(expectedChimeResponse.getStatusCode(), actualChimeResponse.getStatusCode());
7175
}
7276

77+
@Test
78+
public void testChimeMessage_EmptyEntityResponse() throws Exception {
79+
CloseableHttpClient mockHttpClient = EasyMock.createMock(CloseableHttpClient.class);
80+
81+
DestinationResponse expectedChimeResponse = new DestinationResponse.Builder()
82+
.withResponseContent("")
83+
.withStatusCode(RestStatus.OK.getStatus())
84+
.build();
85+
CloseableHttpResponse httpResponse = EasyMock.createMock(CloseableHttpResponse.class);
86+
EasyMock.expect(mockHttpClient.execute(EasyMock.anyObject(HttpPost.class))).andReturn(httpResponse);
87+
88+
BasicStatusLine mockStatusLine = EasyMock.createMock(BasicStatusLine.class);
89+
90+
EasyMock.expect(httpResponse.getStatusLine()).andReturn(mockStatusLine);
91+
EasyMock.expect(httpResponse.getEntity()).andReturn(new StringEntity("")).anyTimes();
92+
EasyMock.expect(mockStatusLine.getStatusCode()).andReturn(RestStatus.OK.getStatus());
93+
EasyMock.replay(mockHttpClient);
94+
EasyMock.replay(httpResponse);
95+
EasyMock.replay(mockStatusLine);
96+
97+
DestinationHttpClient httpClient = new DestinationHttpClient();
98+
httpClient.setHttpClient(mockHttpClient);
99+
ChimeDestinationFactory chimeDestinationFactory = new ChimeDestinationFactory();
100+
chimeDestinationFactory.setClient(httpClient);
101+
102+
DestinationFactoryProvider.setFactory(DestinationType.CHIME, chimeDestinationFactory);
103+
104+
String message = "{\"Content\":\"Message gughjhjlkh Body emoji test: :) :+1: " +
105+
"link test: http://sample.com email test: [email protected] All member callout: " +
106+
"@All All Present member callout: @Present\"}";
107+
BaseMessage bm = new ChimeMessage.Builder("abc").withMessage(message).
108+
withUrl("https://abc/com").build();
109+
DestinationResponse actualChimeResponse = (DestinationResponse) Notification.publish(bm);
110+
111+
assertEquals(expectedChimeResponse.getResponseContent(), actualChimeResponse.getResponseContent());
112+
assertEquals(expectedChimeResponse.getStatusCode(), actualChimeResponse.getStatusCode());
113+
}
114+
115+
@Test
116+
public void testChimeMessage_NonemptyEntityResponse() throws Exception {
117+
String responseContent = "It worked!";
118+
119+
CloseableHttpClient mockHttpClient = EasyMock.createMock(CloseableHttpClient.class);
120+
121+
DestinationResponse expectedChimeResponse = new DestinationResponse.Builder().withResponseContent(responseContent)
122+
.withStatusCode(RestStatus.OK.getStatus()).build();
123+
CloseableHttpResponse httpResponse = EasyMock.createMock(CloseableHttpResponse.class);
124+
EasyMock.expect(mockHttpClient.execute(EasyMock.anyObject(HttpPost.class))).andReturn(httpResponse);
125+
126+
BasicStatusLine mockStatusLine = EasyMock.createMock(BasicStatusLine.class);
127+
128+
EasyMock.expect(httpResponse.getStatusLine()).andReturn(mockStatusLine);
129+
EasyMock.expect(httpResponse.getEntity()).andReturn(new StringEntity(responseContent)).anyTimes();
130+
EasyMock.expect(mockStatusLine.getStatusCode()).andReturn(RestStatus.OK.getStatus());
131+
EasyMock.replay(mockHttpClient);
132+
EasyMock.replay(httpResponse);
133+
EasyMock.replay(mockStatusLine);
134+
135+
DestinationHttpClient httpClient = new DestinationHttpClient();
136+
httpClient.setHttpClient(mockHttpClient);
137+
ChimeDestinationFactory chimeDestinationFactory = new ChimeDestinationFactory();
138+
chimeDestinationFactory.setClient(httpClient);
139+
140+
DestinationFactoryProvider.setFactory(DestinationType.CHIME, chimeDestinationFactory);
141+
142+
String message = "{\"Content\":\"Message gughjhjlkh Body emoji test: :) :+1: " +
143+
"link test: http://sample.com email test: [email protected] All member callout: " +
144+
"@All All Present member callout: @Present\"}";
145+
BaseMessage bm = new ChimeMessage.Builder("abc").withMessage(message).
146+
withUrl("https://abc/com").build();
147+
DestinationResponse actualChimeResponse = (DestinationResponse) Notification.publish(bm);
148+
149+
assertEquals(expectedChimeResponse.getResponseContent(), actualChimeResponse.getResponseContent());
150+
assertEquals(expectedChimeResponse.getStatusCode(), actualChimeResponse.getStatusCode());
151+
}
152+
73153
@Test(expected = IllegalArgumentException.class)
74154
public void testUrlMissingMessage() {
75155
try {

notification/src/test/java/com/amazon/opendistroforelasticsearch/alerting/destination/CustomWebhookMessageTest.java

Lines changed: 95 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.amazon.opendistroforelasticsearch.alerting.destination.response.DestinationResponse;
2525
import org.apache.http.client.methods.CloseableHttpResponse;
2626
import org.apache.http.client.methods.HttpPost;
27+
import org.apache.http.entity.StringEntity;
2728
import org.apache.http.impl.client.CloseableHttpClient;
2829
import org.apache.http.message.BasicStatusLine;
2930
import org.easymock.EasyMock;
@@ -38,12 +39,14 @@
3839
public class CustomWebhookMessageTest {
3940

4041
@Test
41-
public void testCustomWebhookMessage() throws Exception {
42-
42+
public void testCustomWebhookMessage_NullEntityResponse() throws Exception {
4343
CloseableHttpClient mockHttpClient = EasyMock.createMock(CloseableHttpClient.class);
4444

45-
DestinationResponse expectedCustomWebhookResponse = new DestinationResponse.Builder().withResponseContent("{}")
46-
.withStatusCode(RestStatus.OK.getStatus()).build();
45+
// The DestinationHttpClient replaces a null entity with "{}".
46+
DestinationResponse expectedCustomWebhookResponse = new DestinationResponse.Builder()
47+
.withResponseContent("{}")
48+
.withStatusCode(RestStatus.OK.getStatus())
49+
.build();
4750
CloseableHttpResponse httpResponse = EasyMock.createMock(CloseableHttpResponse.class);
4851
EasyMock.expect(mockHttpClient.execute(EasyMock.anyObject(HttpPost.class))).andReturn(httpResponse);
4952

@@ -79,6 +82,94 @@ public void testCustomWebhookMessage() throws Exception {
7982
assertEquals(expectedCustomWebhookResponse.getStatusCode(), actualCustomResponse.getStatusCode());
8083
}
8184

85+
@Test
86+
public void testCustomWebhookMessage_EmptyEntityResponse() throws Exception {
87+
CloseableHttpClient mockHttpClient = EasyMock.createMock(CloseableHttpClient.class);
88+
89+
DestinationResponse expectedCustomWebhookResponse = new DestinationResponse.Builder()
90+
.withResponseContent("")
91+
.withStatusCode(RestStatus.OK.getStatus())
92+
.build();
93+
CloseableHttpResponse httpResponse = EasyMock.createMock(CloseableHttpResponse.class);
94+
EasyMock.expect(mockHttpClient.execute(EasyMock.anyObject(HttpPost.class))).andReturn(httpResponse);
95+
96+
BasicStatusLine mockStatusLine = EasyMock.createMock(BasicStatusLine.class);
97+
98+
EasyMock.expect(httpResponse.getStatusLine()).andReturn(mockStatusLine);
99+
EasyMock.expect(httpResponse.getEntity()).andReturn(new StringEntity("")).anyTimes();
100+
EasyMock.expect(mockStatusLine.getStatusCode()).andReturn(RestStatus.OK.getStatus());
101+
EasyMock.replay(mockHttpClient);
102+
EasyMock.replay(httpResponse);
103+
EasyMock.replay(mockStatusLine);
104+
105+
DestinationHttpClient httpClient = new DestinationHttpClient();
106+
httpClient.setHttpClient(mockHttpClient);
107+
CustomWebhookDestinationFactory customDestinationFactory = new CustomWebhookDestinationFactory();
108+
customDestinationFactory.setClient(httpClient);
109+
110+
DestinationFactoryProvider.setFactory(DestinationType.CUSTOMWEBHOOK, customDestinationFactory);
111+
112+
Map<String, String> queryParams = new HashMap<String, String>();
113+
queryParams.put("token", "R2x1UlN4ZHF8MXxxVFJpelJNVDgzdGNwMnVRenJwRFBHUkR0NlhROWhXOVVTZXpiTWx2azVr");
114+
115+
String message = "{\"Content\":\"Message gughjhjlkh Body emoji test: :) :+1: " +
116+
"link test: http://sample.com email test: [email protected] " +
117+
"All member callout: @All All Present member callout: @Present\"}";
118+
BaseMessage bm = new CustomWebhookMessage.Builder("abc").withHost("hooks.chime.aws").
119+
withPath("incomingwebhooks/383c0e2b-d028-44f4-8d38-696754bc4574").
120+
withMessage(message).
121+
withQueryParams(queryParams).build();
122+
DestinationResponse actualCustomResponse = (DestinationResponse) Notification.publish(bm);
123+
124+
assertEquals(expectedCustomWebhookResponse.getResponseContent(), actualCustomResponse.getResponseContent());
125+
assertEquals(expectedCustomWebhookResponse.getStatusCode(), actualCustomResponse.getStatusCode());
126+
}
127+
128+
@Test
129+
public void testCustomWebhookMessage_NonemptyEntityResponse() throws Exception {
130+
String responseContent = "It worked!";
131+
132+
CloseableHttpClient mockHttpClient = EasyMock.createMock(CloseableHttpClient.class);
133+
134+
DestinationResponse expectedCustomWebhookResponse = new DestinationResponse.Builder()
135+
.withResponseContent(responseContent)
136+
.withStatusCode(RestStatus.OK.getStatus())
137+
.build();
138+
CloseableHttpResponse httpResponse = EasyMock.createMock(CloseableHttpResponse.class);
139+
EasyMock.expect(mockHttpClient.execute(EasyMock.anyObject(HttpPost.class))).andReturn(httpResponse);
140+
141+
BasicStatusLine mockStatusLine = EasyMock.createMock(BasicStatusLine.class);
142+
143+
EasyMock.expect(httpResponse.getStatusLine()).andReturn(mockStatusLine);
144+
EasyMock.expect(httpResponse.getEntity()).andReturn(new StringEntity(responseContent)).anyTimes();
145+
EasyMock.expect(mockStatusLine.getStatusCode()).andReturn(RestStatus.OK.getStatus());
146+
EasyMock.replay(mockHttpClient);
147+
EasyMock.replay(httpResponse);
148+
EasyMock.replay(mockStatusLine);
149+
150+
DestinationHttpClient httpClient = new DestinationHttpClient();
151+
httpClient.setHttpClient(mockHttpClient);
152+
CustomWebhookDestinationFactory customDestinationFactory = new CustomWebhookDestinationFactory();
153+
customDestinationFactory.setClient(httpClient);
154+
155+
DestinationFactoryProvider.setFactory(DestinationType.CUSTOMWEBHOOK, customDestinationFactory);
156+
157+
Map<String, String> queryParams = new HashMap<String, String>();
158+
queryParams.put("token", "R2x1UlN4ZHF8MXxxVFJpelJNVDgzdGNwMnVRenJwRFBHUkR0NlhROWhXOVVTZXpiTWx2azVr");
159+
160+
String message = "{\"Content\":\"Message gughjhjlkh Body emoji test: :) :+1: " +
161+
"link test: http://sample.com email test: [email protected] " +
162+
"All member callout: @All All Present member callout: @Present\"}";
163+
BaseMessage bm = new CustomWebhookMessage.Builder("abc").withHost("hooks.chime.aws").
164+
withPath("incomingwebhooks/383c0e2b-d028-44f4-8d38-696754bc4574").
165+
withMessage(message).
166+
withQueryParams(queryParams).build();
167+
DestinationResponse actualCustomResponse = (DestinationResponse) Notification.publish(bm);
168+
169+
assertEquals(expectedCustomWebhookResponse.getResponseContent(), actualCustomResponse.getResponseContent());
170+
assertEquals(expectedCustomWebhookResponse.getStatusCode(), actualCustomResponse.getStatusCode());
171+
}
172+
82173
@Test(expected = IllegalArgumentException.class)
83174
public void testUrlMissingMessage() {
84175
try {

notification/src/test/java/com/amazon/opendistroforelasticsearch/alerting/destination/SlackDestinationTest.java

Lines changed: 88 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.amazon.opendistroforelasticsearch.alerting.destination.response.DestinationResponse;
2525
import org.apache.http.client.methods.CloseableHttpResponse;
2626
import org.apache.http.client.methods.HttpPost;
27+
import org.apache.http.entity.StringEntity;
2728
import org.apache.http.impl.client.CloseableHttpClient;
2829
import org.apache.http.message.BasicStatusLine;
2930
import org.easymock.EasyMock;
@@ -36,12 +37,14 @@
3637
public class SlackDestinationTest {
3738

3839
@Test
39-
public void testSlackMessage() throws Exception {
40-
40+
public void testSlackMessage_NullEntityResponse() throws Exception {
4141
CloseableHttpClient mockHttpClient = EasyMock.createMock(CloseableHttpClient.class);
4242

43-
DestinationResponse expectedSlackResponse = new DestinationResponse.Builder().withResponseContent("{}")
44-
.withStatusCode(RestStatus.OK.getStatus()).build();
43+
// The DestinationHttpClient replaces a null entity with "{}".
44+
DestinationResponse expectedSlackResponse = new DestinationResponse.Builder()
45+
.withResponseContent("{}")
46+
.withStatusCode(RestStatus.OK.getStatus())
47+
.build();
4548
CloseableHttpResponse httpResponse = EasyMock.createMock(CloseableHttpResponse.class);
4649
EasyMock.expect(mockHttpClient.execute(EasyMock.anyObject(HttpPost.class))).andReturn(httpResponse);
4750

@@ -73,6 +76,86 @@ public void testSlackMessage() throws Exception {
7376
assertEquals(expectedSlackResponse.getStatusCode(), actualSlackResponse.getStatusCode());
7477
}
7578

79+
@Test
80+
public void testSlackMessage_EmptyEntityResponse() throws Exception {
81+
CloseableHttpClient mockHttpClient = EasyMock.createMock(CloseableHttpClient.class);
82+
83+
DestinationResponse expectedSlackResponse = new DestinationResponse.Builder()
84+
.withResponseContent("")
85+
.withStatusCode(RestStatus.OK.getStatus())
86+
.build();
87+
CloseableHttpResponse httpResponse = EasyMock.createMock(CloseableHttpResponse.class);
88+
EasyMock.expect(mockHttpClient.execute(EasyMock.anyObject(HttpPost.class))).andReturn(httpResponse);
89+
90+
BasicStatusLine mockStatusLine = EasyMock.createMock(BasicStatusLine.class);
91+
92+
EasyMock.expect(httpResponse.getStatusLine()).andReturn(mockStatusLine);
93+
EasyMock.expect(httpResponse.getEntity()).andReturn(new StringEntity("")).anyTimes();
94+
EasyMock.expect(mockStatusLine.getStatusCode()).andReturn(RestStatus.OK.getStatus());
95+
EasyMock.replay(mockHttpClient);
96+
EasyMock.replay(httpResponse);
97+
EasyMock.replay(mockStatusLine);
98+
99+
DestinationHttpClient httpClient = new DestinationHttpClient();
100+
httpClient.setHttpClient(mockHttpClient);
101+
SlackDestinationFactory slackDestinationFactory = new SlackDestinationFactory();
102+
slackDestinationFactory.setClient(httpClient);
103+
104+
DestinationFactoryProvider.setFactory(DestinationType.SLACK, slackDestinationFactory);
105+
106+
String message = "{\"text\":\"Vamshi Message gughjhjlkh Body emoji test: :) :+1: " +
107+
"link test: http://sample.com email test: [email protected] All member callout: " +
108+
"@All All Present member callout: @Present\"}";
109+
BaseMessage bm = new SlackMessage.Builder("abc").withMessage(message).
110+
withUrl("https://hooks.slack.com/services/xxxx/xxxxxx/xxxxxxxxx").build();
111+
112+
DestinationResponse actualSlackResponse = (DestinationResponse) Notification.publish(bm);
113+
114+
assertEquals(expectedSlackResponse.getResponseContent(), actualSlackResponse.getResponseContent());
115+
assertEquals(expectedSlackResponse.getStatusCode(), actualSlackResponse.getStatusCode());
116+
}
117+
118+
@Test
119+
public void testSlackMessage_NonemptyEntityResponse() throws Exception {
120+
String responseContent = "It worked!";
121+
122+
CloseableHttpClient mockHttpClient = EasyMock.createMock(CloseableHttpClient.class);
123+
124+
DestinationResponse expectedSlackResponse = new DestinationResponse.Builder()
125+
.withResponseContent(responseContent)
126+
.withStatusCode(RestStatus.OK.getStatus())
127+
.build();
128+
CloseableHttpResponse httpResponse = EasyMock.createMock(CloseableHttpResponse.class);
129+
EasyMock.expect(mockHttpClient.execute(EasyMock.anyObject(HttpPost.class))).andReturn(httpResponse);
130+
131+
BasicStatusLine mockStatusLine = EasyMock.createMock(BasicStatusLine.class);
132+
133+
EasyMock.expect(httpResponse.getStatusLine()).andReturn(mockStatusLine);
134+
EasyMock.expect(httpResponse.getEntity()).andReturn(new StringEntity(responseContent)).anyTimes();
135+
EasyMock.expect(mockStatusLine.getStatusCode()).andReturn(RestStatus.OK.getStatus());
136+
EasyMock.replay(mockHttpClient);
137+
EasyMock.replay(httpResponse);
138+
EasyMock.replay(mockStatusLine);
139+
140+
DestinationHttpClient httpClient = new DestinationHttpClient();
141+
httpClient.setHttpClient(mockHttpClient);
142+
SlackDestinationFactory slackDestinationFactory = new SlackDestinationFactory();
143+
slackDestinationFactory.setClient(httpClient);
144+
145+
DestinationFactoryProvider.setFactory(DestinationType.SLACK, slackDestinationFactory);
146+
147+
String message = "{\"text\":\"Vamshi Message gughjhjlkh Body emoji test: :) :+1: " +
148+
"link test: http://sample.com email test: [email protected] All member callout: " +
149+
"@All All Present member callout: @Present\"}";
150+
BaseMessage bm = new SlackMessage.Builder("abc").withMessage(message).
151+
withUrl("https://hooks.slack.com/services/xxxx/xxxxxx/xxxxxxxxx").build();
152+
153+
DestinationResponse actualSlackResponse = (DestinationResponse) Notification.publish(bm);
154+
155+
assertEquals(expectedSlackResponse.getResponseContent(), actualSlackResponse.getResponseContent());
156+
assertEquals(expectedSlackResponse.getStatusCode(), actualSlackResponse.getStatusCode());
157+
}
158+
76159
@Test(expected = IllegalArgumentException.class)
77160
public void testUrlMissingMessage() {
78161
try {
@@ -94,4 +177,4 @@ public void testContentMissingMessage() {
94177
throw ex;
95178
}
96179
}
97-
}
180+
}

0 commit comments

Comments
 (0)