package fr.mmarie.core; import fr.mmarie.api.gitlab.Commit; import fr.mmarie.api.gitlab.Event; import fr.mmarie.api.gitlab.Repository; import fr.mmarie.api.gitlab.User; import fr.mmarie.api.jira.Comment; import fr.mmarie.core.gitlab.GitLabService; import fr.mmarie.core.jira.JiraService; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import retrofit.Response; import java.io.IOException; import java.util.Arrays; import java.util.Collections; import java.util.Date; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class IntegrationServiceTest { @Mock private GitLabService gitLabService; @Mock private JiraService jiraService; private User user = new User(1L, "John Smith", "john.smith@mocked.com"); private Response<User> mockedUserResponse = Response.success(user); private IntegrationService service; @Before public void setUp() throws Exception { service = new IntegrationService(gitLabService, jiraService); } @After public void tearDown() throws Exception { reset(gitLabService, jiraService); } @Test public void commentExistingIssue() throws Exception { String issue = "TESTGITLAB-1"; String repository = "test-repo"; String commitId = "b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327"; ArgumentCaptor<Comment> commentArgumentCaptor = ArgumentCaptor.forClass(Comment.class); when(jiraService.isExistingIssue(issue)).thenReturn(true); when(jiraService.isIssueAlreadyCommented(issue, commitId)).thenReturn(false); service.commentIssue(repository, new User(1L, "John Smith", "john.smith@mocked.com"), Collections.singletonList(Commit.builder().id(commitId).build()), issue); verify(jiraService, times(1)).commentIssue(eq(issue), commentArgumentCaptor.capture()); Comment comment = commentArgumentCaptor.getValue(); assertThat(comment.getBody()) .contains("unknown date of commit"); } @Test public void commentExistingIssueWithoutUsername() throws Exception { String issue = "TESTGITLAB-1"; String repository = "test-repo"; String commitId = "b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327"; ArgumentCaptor<Comment> commentArgumentCaptor = ArgumentCaptor.forClass(Comment.class); when(jiraService.isExistingIssue(issue)).thenReturn(true); when(jiraService.isIssueAlreadyCommented(issue, commitId)).thenReturn(false); String message = "Very nice commit !"; String url = "http://test.gitlab.fr/"; Date date = new Date(); service.commentIssue(repository, new User(1L, null, "john.smith@mocked.com"), Collections.singletonList(Commit.builder() .id(commitId) .message(message) .url(url) .timestamp(date) .build()), issue); verify(jiraService, times(1)).commentIssue(eq(issue), commentArgumentCaptor.capture()); Comment comment = commentArgumentCaptor.getValue(); assertThat(comment.getBody()) .contains("john.smith@mocked.com", repository, message, url, IntegrationService.DATE_FORMAT.format(date), message); } @Test public void commentNonExistingIssue() throws Exception { String issue = "TESTGITLAB-1"; String repository = "test-repo"; String commitId = "b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327"; when(jiraService.isExistingIssue(issue)).thenReturn(false); when(jiraService.isIssueAlreadyCommented(issue, commitId)).thenReturn(false); service.commentIssue(repository, new User(1L, "John Smith", "john.smith@mocked.com"), Collections.singletonList(Commit.builder().id(commitId).build()), issue); verify(jiraService, times(0)).commentIssue(eq(issue), any(Comment.class)); } @Test public void commentExistingIssueWithUnavailableJira() throws Exception { String issue = "TESTGITLAB-1"; String repository = "test-repo"; String commitId = "b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327"; when(jiraService.isExistingIssue(issue)).thenReturn(true); when(jiraService.isIssueAlreadyCommented(issue, commitId)).thenReturn(false); when(jiraService.commentIssue(eq(issue), any(Comment.class))) .thenThrow(new IOException()); service.commentIssue(repository, new User(1L, "John Smith", "john.smith@mocked.com"), Collections.singletonList(Commit.builder().id(commitId).build()), issue); verify(jiraService, times(1)).commentIssue(eq(issue), any(Comment.class)); } @Test public void issueShouldNotBeCommentedWhenItsAlreadyIs() throws IOException { String issue = "TESTGITLAB-1"; String repository = "test-repo"; String commitId = "b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327"; when(jiraService.isExistingIssue(issue)).thenReturn(true); when(jiraService.isIssueAlreadyCommented(issue, commitId)).thenReturn(true); service.commentIssue(repository, new User(1L, "John Smith", "john.smith@mocked.com"), Collections.singletonList(Commit.builder().id(commitId).build()), issue); verify(jiraService, times(0)).commentIssue(eq(issue), any(Comment.class)); } @Test public void performPushEventShouldCheckCommit() throws IOException { service = spy(service); String commitId1 = "b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327qgh"; Commit commit1 = Commit.builder() .message("#GITLAB-1") .id(commitId1) .build(); String commitId2 = "b6iib8db1bc1doqzjbj4d5a946b0b91f9dacd73qzd5"; Commit commit2 = Commit.builder() .message("#GITLAB-1,#GITLAB-2") .id(commitId2) .build(); when(jiraService.extractIssuesFromMessage("#GITLAB-1")).thenReturn(Collections.singletonList("GITLAB-1")); when(jiraService.extractIssuesFromMessage("#GITLAB-1,#GITLAB-2")).thenReturn(Arrays.asList("GITLAB-1", "GITLAB-2")); long userId = 1L; String repositoryName = "test-repo"; Event event = Event.builder() .type(Event.Type.PUSH) .userId(userId) .repository(Repository.builder().name(repositoryName).build()) .commits(Arrays.asList(commit1, commit2)) .build(); service.performPushEvent(event); verify(service, times(1)).commentIssue(eq(repositoryName), any(User.class), eq(Arrays.asList(commit1, commit2)), eq("GITLAB-1")); verify(service, times(1)).commentIssue(eq(repositoryName), any(User.class), eq(Collections.singletonList(commit2)), eq("GITLAB-2")); } @Test public void performPushEventWithoutMentionedIssuesShouldNotCallGetUserMethod() throws IOException { service = spy(service); String repositoryName = "test-repo"; long userId = 1L; Event event = Event.builder() .type(Event.Type.PUSH) .userId(userId) .repository(Repository.builder().name(repositoryName).build()) .commits(Collections.emptyList()) .build(); service.performPushEvent(event); verify(service, times(0)).getUser(event); } @Test public void getUserWhenGitLabServiceIsAvailable() throws Exception { Long userId = 10L; User user = new User(userId, "John Smith", "john.smith@mocked.com"); when(gitLabService.getUser(userId)).thenReturn(Response.success(user)); assertThat(service.getUser(Event.builder().userId(userId).build())).isEqualTo(user); verify(gitLabService, times(1)).getUser(userId); } }