package fr.mmarie.core.jira;
import com.github.tomakehurst.wiremock.http.Fault;
import com.github.tomakehurst.wiremock.junit.WireMockRule;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
import fr.mmarie.api.jira.Comment;
import fr.mmarie.api.jira.input.TransitionInput;
import org.assertj.core.data.MapEntry;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import retrofit.Response;
import java.util.List;
import java.util.Map;
import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
import static com.github.tomakehurst.wiremock.client.WireMock.equalToJson;
import static com.github.tomakehurst.wiremock.client.WireMock.get;
import static com.github.tomakehurst.wiremock.client.WireMock.getRequestedFor;
import static com.github.tomakehurst.wiremock.client.WireMock.matching;
import static com.github.tomakehurst.wiremock.client.WireMock.post;
import static com.github.tomakehurst.wiremock.client.WireMock.postRequestedFor;
import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
import static fr.mmarie.Assertions.assertThat;
import static io.dropwizard.testing.FixtureHelpers.fixture;
import static org.assertj.core.api.Assertions.assertThat;
public class JiraServiceTestIT {
public static final int PORT = 1520;
@Rule
public WireMockRule wireMockRule = new WireMockRule(PORT);
public JiraConfiguration jiraConfiguration = new JiraConfiguration("username",
"password",
String.format("http://localhost:%d", PORT),
ImmutableList.of(new TransitionConfiguration("Close", ImmutableList.of("close", "fix"))));
public JiraService jiraService;
@Before
public void setUp() throws Exception {
jiraService = new JiraService(jiraConfiguration);
}
@Test
public void testGetIssue() throws Exception {
String issue = "TEST-1";
wireMockRule.stubFor(get(urlEqualTo("/rest/api/2/issue/" + issue))
.withHeader("Authorization", matching("Basic .*"))
.willReturn(aResponse()
.withStatus(200)
.withBody("{}")));
Response<Object> response = jiraService.getIssue(issue);
assertThat(response.code())
.isEqualTo(200);
wireMockRule.verify(getRequestedFor(urlEqualTo("/rest/api/2/issue/" + issue))
.withHeader("Authorization", matching("Basic .*")));
}
@Test
public void testCommentIssue() throws Exception {
String issue = "TEST-1";
String body = "This is a comment";
Comment comment = new Comment(body);
String mockedComment = fixture("fixtures/jira/comment.json");
wireMockRule.stubFor(post(urlEqualTo("/rest/api/2/issue/" + issue + "/comment"))
.withHeader("Authorization", matching("Basic .*"))
.withRequestBody(equalToJson(mockedComment))
.willReturn(aResponse()
.withStatus(200)
.withBody(mockedComment)));
Response<Comment> response = jiraService.commentIssue(issue, comment);
assertThat(response.code())
.isEqualTo(200);
assertThat(response.body())
.hasBody(body);
wireMockRule.verify(postRequestedFor(urlEqualTo("/rest/api/2/issue/" + issue + "/comment"))
.withHeader("Authorization", matching("Basic .*"))
.withRequestBody(equalToJson(mockedComment)));
}
@Test
public void testServerInfo() throws Exception {
wireMockRule.stubFor(get(urlEqualTo("/rest/api/2/serverInfo"))
.withHeader("Authorization", matching("Basic .*"))
.willReturn(aResponse()
.withStatus(200)
.withBody("{}")));
Response<Map<String, Object>> response = jiraService.serverInfo();
assertThat(response.code())
.isEqualTo(200);
wireMockRule.verify(getRequestedFor(urlEqualTo("/rest/api/2/serverInfo"))
.withHeader("Authorization", matching("Basic .*")));
}
@Test
public void isExistingIssueWithAGoodOne() throws Exception {
String issue = "TEST-1";
wireMockRule.stubFor(get(urlEqualTo("/rest/api/2/issue/" + issue))
.withHeader("Authorization", matching("Basic .*"))
.willReturn(aResponse()
.withStatus(200)
.withBody("{}")));
assertThat(jiraService.isExistingIssue(issue)).isTrue();
wireMockRule.verify(getRequestedFor(urlEqualTo("/rest/api/2/issue/" + issue))
.withHeader("Authorization", matching("Basic .*")));
}
@Test
public void isExistingIssueWithABadOne() throws Exception {
String issue = "TEST-1";
wireMockRule.stubFor(get(urlEqualTo("/rest/api/2/issue/" + issue))
.withHeader("Authorization", matching("Basic .*"))
.willReturn(aResponse()
.withStatus(404)
.withBody("{}")));
assertThat(jiraService.isExistingIssue(issue)).isFalse();
wireMockRule.verify(getRequestedFor(urlEqualTo("/rest/api/2/issue/" + issue))
.withHeader("Authorization", matching("Basic .*")));
}
@Test
public void isExistingIssueWithAServerError() throws Exception {
String issue = "TEST-1";
wireMockRule.stubFor(get(urlEqualTo("/rest/api/2/issue/" + issue))
.withHeader("Authorization", matching("Basic .*"))
.willReturn(aResponse()
.withFault(Fault.EMPTY_RESPONSE)));
assertThat(jiraService.isExistingIssue(issue)).isFalse();
wireMockRule.verify(getRequestedFor(urlEqualTo("/rest/api/2/issue/" + issue))
.withHeader("Authorization", matching("Basic .*")));
}
@Test
public void isIssueAlreadyCommentedWithAServerError() throws Exception {
String issue = "TEST-1";
wireMockRule.stubFor(get(urlEqualTo("/rest/api/2/issue/" + issue + "/comment"))
.withHeader("Authorization", matching("Basic .*"))
.willReturn(aResponse()
.withFault(Fault.EMPTY_RESPONSE)));
assertThat(jiraService.isIssueAlreadyCommented(issue, "commitId")).isTrue();
wireMockRule.verify(getRequestedFor(urlEqualTo("/rest/api/2/issue/" + issue + "/comment"))
.withHeader("Authorization", matching("Basic .*")));
}
@Test
public void alreadyCommentedIssueShouldReturnTrue() throws Exception {
String issue = "TEST-1";
wireMockRule.stubFor(get(urlEqualTo("/rest/api/2/issue/" + issue + "/comment"))
.withHeader("Authorization", matching("Basic .*"))
.willReturn(aResponse()
.withStatus(200)
.withBody("{ \"comments\" : [{\"body\":\"commit is : commitId\"}] }")));
assertThat(jiraService.isIssueAlreadyCommented(issue, "commitId")).isTrue();
wireMockRule.verify(getRequestedFor(urlEqualTo("/rest/api/2/issue/" + issue + "/comment"))
.withHeader("Authorization", matching("Basic .*")));
}
@Test
public void notCommentedIssueShouldReturnFalse() throws Exception {
String issue = "TEST-1";
wireMockRule.stubFor(get(urlEqualTo("/rest/api/2/issue/" + issue + "/comment"))
.withHeader("Authorization", matching("Basic .*"))
.willReturn(aResponse()
.withStatus(200)
.withBody("{ \"comments\" : [{\"body\":\"commitId\"}, {\"body\":\"commitId2\"}] }")));
assertThat(jiraService.isIssueAlreadyCommented(issue, "newOne")).isFalse();
wireMockRule.verify(getRequestedFor(urlEqualTo("/rest/api/2/issue/" + issue + "/comment"))
.withHeader("Authorization", matching("Basic .*")));
}
@Test
public void isExistingTransitionWithNonExistingTransaction() {
String issue = "TEST-1";
wireMockRule.stubFor(get(urlEqualTo("/rest/api/2/issue/" + issue + "/transitions"))
.withHeader("Authorization", matching("Basic .*"))
.willReturn(aResponse()
.withStatus(200)
.withBody("{ \"transitions\" : [{\"id\":\"15\", \"name\":\"Close\"}] }")));
assertThat(jiraService.isExistingTransition(issue, "test")).isFalse();
wireMockRule.verify(getRequestedFor(urlEqualTo("/rest/api/2/issue/" + issue + "/transitions"))
.withHeader("Authorization", matching("Basic .*")));
}
@Test
public void isExistingTransitionWithExistingTransaction() {
String issue = "TEST-1";
wireMockRule.stubFor(get(urlEqualTo("/rest/api/2/issue/" + issue + "/transitions"))
.withHeader("Authorization", matching("Basic .*"))
.willReturn(aResponse()
.withStatus(200)
.withBody("{ \"transitions\" : [{\"id\":\"15\", \"name\":\"Close\"}, {\"id\":\"16\", \"name\":\"Open\"}] }")));
assertThat(jiraService.isExistingTransition(issue, "close")).isTrue();
wireMockRule.verify(getRequestedFor(urlEqualTo("/rest/api/2/issue/" + issue + "/transitions"))
.withHeader("Authorization", matching("Basic .*")));
}
@Test
public void transitionOnIssueWithBadResponseStatus() throws Exception {
String issue = "TEST-1";
wireMockRule.stubFor(post(urlEqualTo("/rest/api/2/issue/" + issue + "/transitions"))
.withHeader("Authorization", matching("Basic .*"))
.willReturn(aResponse()
.withStatus(400)
.withBody("Bad request !")));
jiraService.transitionOnIssue(issue, new TransitionInput());
}
}