diff --git a/src/main/java/jenkins/plugins/slack/StandardSlackService.java b/src/main/java/jenkins/plugins/slack/StandardSlackService.java index 714b787f..a1401bbc 100755 --- a/src/main/java/jenkins/plugins/slack/StandardSlackService.java +++ b/src/main/java/jenkins/plugins/slack/StandardSlackService.java @@ -36,6 +36,7 @@ public boolean publish(String message) { } public boolean publish(String message, String color) { + boolean result = true; for (String roomId : roomIds) { String url = "https://" + teamDomain + "." + host + "/services/hooks/jenkins-ci?token=" + token; logger.info("Posting: to " + roomId + " on " + teamDomain + " using " + url +": " + message + " " + color); @@ -67,21 +68,20 @@ public boolean publish(String message, String color) { String response = post.getResponseBodyAsString(); if(responseCode != HttpStatus.SC_OK) { logger.log(Level.WARNING, "Slack post may have failed. Response: " + response); - return false; + result = false; } - return true; } catch (Exception e) { logger.log(Level.WARNING, "Error posting to Slack", e); - return false; + result = false; } finally { logger.info("Posting succeeded"); post.releaseConnection(); } } - return false; + return result; } - private HttpClient getHttpClient() { + protected HttpClient getHttpClient() { HttpClient client = new HttpClient(); if (Jenkins.getInstance() != null) { ProxyConfiguration proxy = Jenkins.getInstance().proxy; diff --git a/src/test/java/jenkins/plugins/slack/HttpClientStub.java b/src/test/java/jenkins/plugins/slack/HttpClientStub.java new file mode 100644 index 00000000..f6de0935 --- /dev/null +++ b/src/test/java/jenkins/plugins/slack/HttpClientStub.java @@ -0,0 +1,34 @@ +package jenkins.plugins.slack; + +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpMethod; +import org.apache.commons.httpclient.HttpStatus; + +public class HttpClientStub extends HttpClient { + + private int numberOfCallsToExecuteMethod; + private int httpStatus; + private boolean failAlternateResponses = false; + + @Override + public int executeMethod(HttpMethod httpMethod) { + numberOfCallsToExecuteMethod++; + if (failAlternateResponses && (numberOfCallsToExecuteMethod % 2 == 0)) { + return HttpStatus.SC_NOT_FOUND; + } else { + return httpStatus; + } + } + + public int getNumberOfCallsToExecuteMethod() { + return numberOfCallsToExecuteMethod; + } + + public void setHttpStatus(int httpStatus) { + this.httpStatus = httpStatus; + } + + public void setFailAlternateResponses(boolean failAlternateResponses) { + this.failAlternateResponses = failAlternateResponses; + } +} diff --git a/src/test/java/jenkins/plugins/slack/StandardSlackServiceStub.java b/src/test/java/jenkins/plugins/slack/StandardSlackServiceStub.java new file mode 100644 index 00000000..86b6294b --- /dev/null +++ b/src/test/java/jenkins/plugins/slack/StandardSlackServiceStub.java @@ -0,0 +1,19 @@ +package jenkins.plugins.slack; + +public class StandardSlackServiceStub extends StandardSlackService { + + private HttpClientStub httpClientStub; + + public StandardSlackServiceStub(String teamDomain, String token, String roomId) { + super(teamDomain, token, roomId); + } + + @Override + public HttpClientStub getHttpClient() { + return httpClientStub; + } + + public void setHttpClient(HttpClientStub httpClientStub) { + this.httpClientStub = httpClientStub; + } +} diff --git a/src/test/java/jenkins/plugins/slack/StandardSlackServiceTest.java b/src/test/java/jenkins/plugins/slack/StandardSlackServiceTest.java index d11dccbc..9cd5c049 100755 --- a/src/test/java/jenkins/plugins/slack/StandardSlackServiceTest.java +++ b/src/test/java/jenkins/plugins/slack/StandardSlackServiceTest.java @@ -1,9 +1,12 @@ package jenkins.plugins.slack; -import jenkins.plugins.slack.StandardSlackService; -import org.junit.Before; +import org.apache.http.HttpStatus; import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + public class StandardSlackServiceTest { /** @@ -33,4 +36,68 @@ public void invalidTokenShouldFail() { StandardSlackService service = new StandardSlackService("tinyspeck", "token", "#general"); service.publish("message"); } + + @Test + public void publishToASingleRoomSendsASingleMessage() { + StandardSlackServiceStub service = new StandardSlackServiceStub("domain", "token", "#room1"); + HttpClientStub httpClientStub = new HttpClientStub(); + service.setHttpClient(httpClientStub); + service.publish("message"); + assertEquals(1, service.getHttpClient().getNumberOfCallsToExecuteMethod()); + } + + @Test + public void publishToMultipleRoomsSendsAMessageToEveryRoom() { + StandardSlackServiceStub service = new StandardSlackServiceStub("domain", "token", "#room1,#room2,#room3"); + HttpClientStub httpClientStub = new HttpClientStub(); + service.setHttpClient(httpClientStub); + service.publish("message"); + assertEquals(3, service.getHttpClient().getNumberOfCallsToExecuteMethod()); + } + + @Test + public void successfulPublishToASingleRoomReturnsTrue() { + StandardSlackServiceStub service = new StandardSlackServiceStub("domain", "token", "#room1"); + HttpClientStub httpClientStub = new HttpClientStub(); + httpClientStub.setHttpStatus(HttpStatus.SC_OK); + service.setHttpClient(httpClientStub); + assertTrue(service.publish("message")); + } + + @Test + public void successfulPublishToMultipleRoomsReturnsTrue() { + StandardSlackServiceStub service = new StandardSlackServiceStub("domain", "token", "#room1,#room2,#room3"); + HttpClientStub httpClientStub = new HttpClientStub(); + httpClientStub.setHttpStatus(HttpStatus.SC_OK); + service.setHttpClient(httpClientStub); + assertTrue(service.publish("message")); + } + + @Test + public void failedPublishToASingleRoomReturnsFalse() { + StandardSlackServiceStub service = new StandardSlackServiceStub("domain", "token", "#room1"); + HttpClientStub httpClientStub = new HttpClientStub(); + httpClientStub.setHttpStatus(HttpStatus.SC_NOT_FOUND); + service.setHttpClient(httpClientStub); + assertFalse(service.publish("message")); + } + + @Test + public void singleFailedPublishToMultipleRoomsReturnsFalse() { + StandardSlackServiceStub service = new StandardSlackServiceStub("domain", "token", "#room1,#room2,#room3"); + HttpClientStub httpClientStub = new HttpClientStub(); + httpClientStub.setFailAlternateResponses(true); + httpClientStub.setHttpStatus(HttpStatus.SC_OK); + service.setHttpClient(httpClientStub); + assertFalse(service.publish("message")); + } + + @Test + public void publishToEmptyRoomReturnsTrue() { + StandardSlackServiceStub service = new StandardSlackServiceStub("domain", "token", ""); + HttpClientStub httpClientStub = new HttpClientStub(); + httpClientStub.setHttpStatus(HttpStatus.SC_OK); + service.setHttpClient(httpClientStub); + assertTrue(service.publish("message")); + } }