package slacknotifications;
import org.apache.http.ProtocolVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.message.BasicHttpResponse;
import org.apache.http.message.BasicStatusLine;
import org.junit.Ignore;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import slacknotifications.teamcity.BuildStateEnum;
import slacknotifications.teamcity.SlackNotificationFactory;
import slacknotifications.teamcity.SlackNotificationFactoryImpl;
import slacknotifications.teamcity.payload.content.Commit;
import slacknotifications.teamcity.payload.content.PostMessageResponse;
import slacknotifications.teamcity.payload.content.SlackNotificationPayloadContent;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.ConnectException;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class SlackNotificationTest {
public String proxy = "127.0.0.1";
public Integer proxyPort = 58002;
String proxyPortString = "58002";
public Integer webserverPort = 58001;
public Integer proxyserverPort = 58002;
public String webserverHost = "127.0.0.1";
String url = "http://127.0.0.1:58001";
public String proxyUsername = "foo";
public String proxyPassword = "bar";
SlackNotificationFactory factory = new SlackNotificationFactoryImpl();
@Test
public void test_BuildStates(){
assertTrue(BuildStateEnum.BUILD_STARTED.getShortName().equals("buildStarted"));
assertTrue(BuildStateEnum.BUILD_FINISHED.getShortName().equals("buildFinished"));
assertTrue(BuildStateEnum.BEFORE_BUILD_FINISHED.getShortName().equals("beforeBuildFinish"));
assertTrue(BuildStateEnum.RESPONSIBILITY_CHANGED.getShortName().equals("responsibilityChanged"));
assertTrue(BuildStateEnum.BUILD_INTERRUPTED.getShortName().equals("buildInterrupted"));
}
@Test
public void test_ProxyPort() {
SlackNotification W = factory.getSlackNotification(url, proxy, proxyPort);
assertTrue(W.getProxyPort() == proxyPort);
}
@Test
public void test_ProxyHost() {
SlackNotification W = factory.getSlackNotification(url, proxy, proxyPort);
assertTrue(W.getProxyHost() == proxy);
}
@Test
public void test_URL() {
SlackNotification W = factory.getSlackNotification(url, proxy, proxyPort);
assertTrue(W.getChannel() == url);
}
@Ignore // Not a valid test anymore?
@Test(expected=java.io.FileNotFoundException.class)
public void test_FileNotFoundExeption() throws FileNotFoundException, IOException{
System.out.print("Testing for FileNotFound exception");
SlackNotification w = factory.getSlackNotification(url, proxy, proxyPort);
w.setFilename("SlackNotifications/src/test/resources/fileWithDoesNotExist.txt");
w.setEnabled(true);
w.post();
System.out.print(".. done");
}
@Ignore
@Test(expected=java.net.ConnectException.class)
public void test_ConnectionRefused() throws ConnectException, IOException{
SlackNotification w = factory.getSlackNotification(url);
w.setEnabled(true);
w.post();
}
@Ignore // Is this still relevant?
@Test(expected=java.io.IOException.class)
public void test_IOExeption() throws IOException{
System.out.println("Testing for IO exception");
SlackNotification w = factory.getSlackNotification(url, "localhost", proxyPort);
w.setEnabled(true);
w.post();
System.out.print(".. done");
}
@Test
public void post_whenResponseIsOk_doesNotThrow() throws IOException {
ArgumentCaptor<HttpPost> requestCaptor = ArgumentCaptor.forClass(HttpPost.class);
HttpClient httpClient = mock(HttpClient.class);
BasicHttpResponse response = new BasicHttpResponse(new BasicStatusLine(new ProtocolVersion("http", 1, 1), 200, ""));
PostMessageResponse successfulResponse = new PostMessageResponse();
successfulResponse.setOk(true);
successfulResponse.setError("channel_not_found");
response.setEntity(new StringEntity(successfulResponse.toJson()));
when(httpClient.execute(requestCaptor.capture())).thenReturn(response);
SlackNotification w = factory.getSlackNotification(httpClient, "#test-channel");
SlackNotificationPayloadContent content = new SlackNotificationPayloadContent();
content.setBuildDescriptionWithLinkSyntax("http://foo");
content.setCommits(new ArrayList<Commit>());
w.setPayload(content);
w.setEnabled(true);
w.post();
List<HttpPost> capturedRequests = requestCaptor.getAllValues();
HttpPost request = capturedRequests.get(0);
assertNotNull(w.getResponse());
assertTrue(w.getResponse().getOk());
}
@Test
public void post_whenResponseIsFailure_logsException() throws IOException {
ArgumentCaptor<HttpPost> requestCaptor = ArgumentCaptor.forClass(HttpPost.class);
HttpClient httpClient = mock(HttpClient.class);
BasicHttpResponse response = new BasicHttpResponse(new BasicStatusLine(new ProtocolVersion("http", 1, 1), 200, ""));
PostMessageResponse failedResponse = new PostMessageResponse();
failedResponse.setOk(false);
failedResponse.setError("channel_not_found");
response.setEntity(new StringEntity(failedResponse.toJson()));
when(httpClient.execute(requestCaptor.capture())).thenReturn(response);
SlackNotification w = factory.getSlackNotification(httpClient, "#test-channel");
SlackNotificationPayloadContent content = new SlackNotificationPayloadContent();
content.setBuildDescriptionWithLinkSyntax("http://foo");
content.setCommits(new ArrayList<Commit>());
w.setPayload(content);
w.setEnabled(true);
w.post();
assertNotNull(w.getResponse());
assertFalse(w.getResponse().getOk());
}
@Test
@Ignore
public void actualTest() throws IOException {
SlackNotificationImpl impl = new SlackNotificationImpl("#sdfdfgdfg");
impl.setToken("xoxp-sdfgdfg-2602518dfghdgfh312-dfghd-f93dc2");
impl.setBotName("foo");
impl.setTeamName("mmbottest");
impl.setEnabled(true);
SlackNotificationPayloadContent content = new SlackNotificationPayloadContent();
content.setBuildResult("sdfd");
content.setColor("#ff0000");
content.setAgentName("fsdf");
content.setCommits(new ArrayList<Commit>());
content.setBuildDescriptionWithLinkSyntax("asdf");
impl.setPayload(content);
impl.post();
assertNotNull(impl.getResponse());
assertFalse(impl.getResponse().getOk());
assertEquals(impl.getResponse().getError(), "invalid_auth");
}
@Test
public void isApiToken_whenApiTokenIsSupplied_returnsTrue(){
SlackNotificationImpl impl = new SlackNotificationImpl();
impl.setToken("xoxp-sdsdfs-3453efgeg-35tefb");
assertTrue(impl.getIsApiToken());
}
@Test
public void isApiToken_whenOAuthAppTokenIsSupplied_returnsTrue(){
SlackNotificationImpl impl = new SlackNotificationImpl();
impl.setToken("34tsrfdgdrtyrysdfg");
assertFalse(impl.getIsApiToken());
}
/*
@Test
public void test_200() throws FileNotFoundException, IOException, Exception {
String expectedBody = "";
HttpClient httpClient = mock(HttpClient.class) ;
HttpResponse response = null;
when(httpClient.executeMethod(any(HttpUriRequest.class)))
.thenReturn(response);
when(httpClient.execute(any(PostMethod.class))).thenReturn(200);
when(response.getStatusCode()).thenReturn(200);
when(response.getBody()).thenReturn("{id:1, name:\"Diego\", surname:\"Castorina\"}"):
SlackNotification w = factory.getSlackNotification(httpClient, "#test-channel");
w.setEnabled(true);
w.post();
System.out.println(w.getContent());
assertTrue(w.getStatus() == HttpStatus.SC_OK);
}
@Ignore
@Test
public void test_NotEnabled() throws FileNotFoundException, IOException, InterruptedException {
SlackNotificationTestServer s = startWebServer();
SlackNotification w = factory.getSlackNotification(url + "/200", proxy, proxyPort);
w.post();
stopWebServer(s);
assertTrue(w.getStatus() == null);
}
@Ignore
@Test
public void test_200WithProxy() throws FileNotFoundException, IOException, InterruptedException {
SlackNotificationTestServer s = startWebServer();
SlackNotificationTestProxyServer p = startProxyServer();
SlackNotification w = factory.getSlackNotification(url + "/200", proxy, proxyPort);
w.setEnabled(true);
w.post();
stopWebServer(s);
stopProxyServer(p);
assertTrue(w.getStatus() == HttpStatus.SC_OK);
}
@Ignore
@Test
public void test_200WithProxyFailAuth() throws FileNotFoundException, IOException, InterruptedException {
SlackNotificationTestServer s = startWebServer();
SlackNotificationTestProxyServer p = startProxyServerAuth(proxyUsername, proxyPassword);
SlackNotification w = factory.getSlackNotification(url + "/200", proxy, proxyPort);
w.setEnabled(true);
w.post();
stopWebServer(s);
stopProxyServer(p);
assertTrue(w.getStatus() == HttpServletResponse.SC_PROXY_AUTHENTICATION_REQUIRED);
}
@Ignore
@Test
public void test_200WithProxyAuth() throws FileNotFoundException, IOException, InterruptedException {
SlackNotificationTestServer s = startWebServer();
SlackNotificationTestProxyServer p = startProxyServerAuth(proxyUsername, proxyPassword);
SlackNotification w = factory.getSlackNotification(url + "/200", proxy, proxyPort);
w.setEnabled(true);
w.setProxyUserAndPass(proxyUsername, proxyPassword);
w.post();
stopWebServer(s);
stopProxyServer(p);
assertTrue(w.getStatus() == HttpStatus.SC_OK);
}
@Ignore
@Test
public void test_200WithFilename() throws FileNotFoundException, IOException, Exception {
SlackNotificationTestServer s = startWebServer();
SlackNotification w = factory.getSlackNotification(url + "/200");
w.setFilename("src/test/resources/FileThatDoesExist.txt");
w.setEnabled(true);
w.post();
stopWebServer(s);
assertTrue(w.getStatus() == HttpStatus.SC_OK);
}
@Ignore
@Test
public void test_200WithFilenameWithProxy() throws FileNotFoundException, IOException, Exception {
SlackNotificationTestServer s = startWebServer();
SlackNotificationTestProxyServer p = startProxyServer();
SlackNotification w = factory.getSlackNotification(url + "/200", proxy, proxyPort);
w.setFilename("src/test/resources/FileThatDoesExist.txt");
w.setEnabled(true);
w.post();
stopWebServer(s);
stopProxyServer(p);
assertTrue(w.getStatus() == HttpStatus.SC_OK);
}
@Ignore
@Test
public void test_302() throws FileNotFoundException, IOException, Exception {
SlackNotificationTestServer s = startWebServer();
SlackNotification w = factory.getSlackNotification(url + "/302");
w.setEnabled(true);
w.post();
stopWebServer(s);
assertTrue(w.getStatus() == HttpStatus.SC_MOVED_TEMPORARILY);
}
@Ignore
@Test
public void test_302WithProxy() throws FileNotFoundException, IOException, InterruptedException {
SlackNotificationTestServer s = startWebServer();
SlackNotificationTestProxyServer p = startProxyServer();
SlackNotification w = factory.getSlackNotification(url + "/302", proxy, proxyPort);
w.setEnabled(true);
w.post();
stopWebServer(s);
stopProxyServer(p);
assertTrue(w.getStatus() == HttpStatus.SC_MOVED_TEMPORARILY);
}
@Ignore
@Test
public void test_404WithProxyStringPort() throws FileNotFoundException, IOException, InterruptedException {
SlackNotificationTestServer s = startWebServer();
SlackNotificationTestProxyServer p = startProxyServer();
SlackNotification w = factory.getSlackNotification(url + "/404", proxy, proxyPortString);
w.setEnabled(true);
w.post();
stopWebServer(s);
stopProxyServer(p);
assertTrue(w.getStatus() == HttpStatus.SC_NOT_FOUND);
}
@Ignore
@Test
public void test_404WithProxyConfig() throws FileNotFoundException, IOException, InterruptedException {
SlackNotificationTestServer s = startWebServer();
SlackNotificationTestProxyServer p = startProxyServer();
SlackNotificationProxyConfig pc = new SlackNotificationProxyConfig(proxy, Integer.parseInt(proxyPortString));
SlackNotification w = factory.getSlackNotification(url + "/404", pc);
w.setEnabled(true);
w.post();
stopWebServer(s);
stopProxyServer(p);
assertTrue(w.getStatus() == HttpStatus.SC_NOT_FOUND);
}
@Ignore
@Test
public void test_302WithFilename() throws FileNotFoundException, IOException, Exception {
SlackNotificationTestServer s = startWebServer();
SlackNotification w = factory.getSlackNotification(url + "/302");
w.setFilename("src/test/resources/FileThatDoesExist.txt");
w.setEnabled(true);
w.post();
stopWebServer(s);
assertTrue(w.getStatus() == HttpStatus.SC_MOVED_TEMPORARILY);
}
@Ignore
@Test
public void test_302WithFilenameWithProxy() throws FileNotFoundException, IOException, Exception {
SlackNotificationTestServer s = startWebServer();
SlackNotificationTestProxyServer p = startProxyServer();
SlackNotification w = factory.getSlackNotification(url + "/302", proxy, proxyPort);
w.setFilename("src/test/resources/FileThatDoesExist.txt");
w.setEnabled(true);
w.post();
stopWebServer(s);
stopProxyServer(p);
assertTrue(w.getStatus() == HttpStatus.SC_MOVED_TEMPORARILY);
}
@Ignore
public void test_SlackNotificationCollection() throws SlackNotificationParameterReferenceException {
Map <String, String> params = new HashMap<String, String>();
params.put("system.slacknotifications.1.url", url);
params.put("system.slacknotifications.1.enabled", "true");
params.put("system.slacknotifications.1.parameter.1.name","fod");
params.put("system.slacknotifications.1.parameter.1.value","baa");
params.put("system.slacknotifications.1.parameter.2.name","slash");
params.put("system.slacknotifications.1.parameter.2.value","dot");
params.put("system.slacknotifications.2.url", url + "/something");
params.put("system.slacknotifications.2.enabled", "false");
params.put("system.slacknotifications.2.parameter.1.name","foo");
params.put("system.slacknotifications.2.parameter.1.value","bar");
SlackNotificationCollection whc = new SlackNotificationCollection(params);
System.out.println("Test 1" + whc.getSlackNotifications().get(1).getParameterisedUrl());
System.out.println("Test 2" + whc.getSlackNotifications().get(2).getParameterisedUrl());
assertTrue(whc.getSlackNotifications().get(1).getChannel().equals(url));
assertTrue((whc.getSlackNotifications().get(1).getParameterisedUrl().equals(url + "?fod=baa&slash=dot"))
|| (whc.getSlackNotifications().get(1).getParameterisedUrl().equals(url + "?slash=dot&fod=baa")));
assertTrue(whc.getSlackNotifications().get(2).getParameterisedUrl().equals(url + "/something?foo=bar"));
assertFalse(whc.getSlackNotifications().get(1).isErrored());
}
@Ignore
public void test_SlackNotificationCollectionWithRecursiveParameterReference() throws SlackNotificationParameterReferenceException {
Map <String, String> params = new HashMap<String, String>();
params.put("system.test.recursive1", "%system.test.recursive2%");
params.put("system.test.recursive2", "blahblah");
params.put("system.slacknotifications.1.url", url);
params.put("system.slacknotifications.1.enabled", "true");
params.put("system.slacknotifications.1.parameter.1.name","foo");
params.put("system.slacknotifications.1.parameter.1.value","bar");
params.put("system.slacknotifications.1.parameter.2.name","slash");
params.put("system.slacknotifications.1.parameter.2.value","%system.test.recursive1%");
SlackNotificationCollection whc = new SlackNotificationCollection(params);
System.out.println("Test 1" + whc.getSlackNotifications().get(1).getParameterisedUrl());
assertTrue(whc.getSlackNotifications().get(1).getChannel().equals(url));
assertTrue((whc.getSlackNotifications().get(1).getParameterisedUrl().equals(url + "?foo=bar&slash=blahblah"))
|| (whc.getSlackNotifications().get(1).getParameterisedUrl().equals(url + "?slash=blahblah&foo=bar")));
assertFalse(whc.getSlackNotifications().get(1).isErrored());
}
@Ignore
public void test_SlackNotificationCollectionWithNonExistantRecursiveParameterReference(){
Map <String, String> params = new HashMap<String, String>();
params.put("system.test.recursive1", "%system.test.recursive3%");
params.put("system.test.recursive2", "blahblah");
params.put("system.slacknotifications.1.url", url);
params.put("system.slacknotifications.1.enabled", "true");
params.put("system.slacknotifications.1.parameter.1.name","foo");
params.put("system.slacknotifications.1.parameter.1.value","bar");
params.put("system.slacknotifications.1.parameter.2.name","slash");
params.put("system.slacknotifications.1.parameter.2.value","%system.test.recursive1%");
SlackNotificationCollection whc = new SlackNotificationCollection(params);
System.out.println("Test 1" + whc.getSlackNotifications().get(1).getParameterisedUrl());
assertTrue(whc.getSlackNotifications().get(1).getChannel().equals(url));
assertTrue(whc.getSlackNotifications().get(1).getParameterisedUrl().equals(url + "?foo=bar"));
assertTrue(whc.getSlackNotifications().get(1).isErrored());
System.out.println(whc.getSlackNotifications().get(1).getErrorReason());
}
public void test_SlackNotificationCollectionWithPost() throws SlackNotificationParameterReferenceException, InterruptedException {
Map <String, String> params = new HashMap<String, String>();
//params.put("system.slacknotifications.1.url", url + "/200");
params.put("system.slacknotifications.1.url", "http://localhost/slacknotifications/" );
params.put("system.slacknotifications.1.enabled", "true");
params.put("system.slacknotifications.1.parameter.1.name","fod");
params.put("system.slacknotifications.1.parameter.1.value","baa");
params.put("system.slacknotifications.1.parameter.2.name","slash");
params.put("system.slacknotifications.1.parameter.2.value","dot");
params.put("system.slacknotifications.2.url", "http://localhost/slacknotifications/test/" );
params.put("system.slacknotifications.2.enabled", "true");
SlackNotificationCollection whc = new SlackNotificationCollection(params);
SlackNotificationTestServer s = startWebServer();
for (Iterator<SlackNotification> i = whc.getSlackNotificationsAsCollection().iterator(); i.hasNext();){
SlackNotification wh = i.next();
try {
wh.post();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
//Loggers.SERVER.error(e.toString());
} catch (IOException e) {
// TODO Auto-generated catch block
//Loggers.SERVER.error(e.toString());
}
}
stopWebServer(s);
assertTrue(whc.getSlackNotifications().get(1).getStatus() == HttpStatus.SC_OK);
assertTrue(whc.getSlackNotifications().get(2).getStatus() == HttpStatus.SC_NOT_FOUND);
}
*/
public SlackNotificationTestServer startWebServer(){
try {
SlackNotificationTestServer s = new SlackNotificationTestServer(webserverHost, webserverPort);
s.server.start();
return s;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public void stopWebServer(SlackNotificationTestServer s) throws InterruptedException {
try {
s.server.stop();
// Sleep to let the server shutdown cleanly.
} catch (Exception e) {
e.printStackTrace();
} finally {
Thread.sleep(1000);
}
}
public SlackNotificationTestProxyServer startProxyServer(){
try {
SlackNotificationTestProxyServer p = new SlackNotificationTestProxyServer(webserverHost, proxyserverPort);
p.server.start();
return p;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public SlackNotificationTestProxyServer startProxyServerAuth(String username, String password){
try {
SlackNotificationTestProxyServer p = new SlackNotificationTestProxyServer(webserverHost, proxyserverPort,
username, password);
p.server.start();
return p;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public void stopProxyServer(SlackNotificationTestProxyServer p) {
try {
p.server.stop();
// Sleep to let the server shutdown cleanly.
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}