com.microsoft.alm.plugin.idea.git.ui.pullrequest.PullRequestHelperTest.java Source code

Java tutorial

Introduction

Here is the source code for com.microsoft.alm.plugin.idea.git.ui.pullrequest.PullRequestHelperTest.java

Source

// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See License.txt in the project root.

package com.microsoft.alm.plugin.idea.git.ui.pullrequest;

import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.vfs.VirtualFile;
import com.microsoft.alm.plugin.context.ServerContext;
import com.microsoft.alm.plugin.idea.IdeaAbstractTest;
import com.microsoft.alm.plugin.idea.git.ui.pullrequest.PullRequestHelper.PRCreateStatus;
import com.microsoft.alm.sourcecontrol.webapi.GitHttpClient;
import com.microsoft.alm.sourcecontrol.webapi.model.GitPullRequest;
import com.microsoft.alm.sourcecontrol.webapi.model.GitPullRequestSearchCriteria;
import com.microsoft.alm.sourcecontrol.webapi.model.GitRepository;
import git4idea.GitCommit;
import git4idea.GitRemoteBranch;
import org.apache.commons.lang.StringUtils;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.UUID;

import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.when;

public class PullRequestHelperTest extends IdeaAbstractTest {

    PullRequestHelper underTest;

    Project projectMock;
    GitRepository gitRepositoryMock;
    VirtualFile fileMock;

    @Before
    public void setUp() throws Exception {
        underTest = new PullRequestHelper();
        fileMock = Mockito.mock(VirtualFile.class);
        projectMock = Mockito.mock(Project.class);
        gitRepositoryMock = Mockito.mock(GitRepository.class);

    }

    @Test
    public void noCommitsShouldReturnEmptyTitle() throws Exception {
        final List<GitCommit> commits = new ArrayList<GitCommit>();
        final String title = underTest.createDefaultTitle(commits, "source", "target");

        assertEquals(StringUtils.EMPTY, title);

        final String title2 = underTest.createDefaultTitle(null, "source", "target");
        assertEquals(StringUtils.EMPTY, title2);
    }

    @Test
    public void oneCommitTitleShouldBeCommitSubject() throws Exception {
        final List<GitCommit> commits = new ArrayList<GitCommit>();
        commits.add(PRGitObjectMockHelper.getCommit(projectMock, fileMock, "my subject", "my message"));

        final String title = underTest.createDefaultTitle(commits, "source", "target");
        assertEquals("my subject", title);
    }

    @Test
    public void multipleCommitsTitleShouldBeMergingFromTo() throws Exception {
        final List<GitCommit> commits = new ArrayList<GitCommit>();
        commits.add(PRGitObjectMockHelper.getCommit(projectMock, fileMock, "subject 1", "message 1"));
        commits.add(PRGitObjectMockHelper.getCommit(projectMock, fileMock, "subject 2", "message 2"));

        final String title = underTest.createDefaultTitle(commits, "source", "target");
        assertEquals("Merge source to target", title);
    }

    @Test
    public void noCommitsShouldReturnEmptyDescription() throws Exception {
        final List<GitCommit> commits = new ArrayList<GitCommit>();
        String desc = underTest.createDefaultDescription(commits);

        assertEquals(StringUtils.EMPTY, desc);

        desc = underTest.createDefaultDescription(null);
        assertEquals(StringUtils.EMPTY, desc);
    }

    @Test
    public void oneCommitDescShouldBeCommitMessage() throws Exception {
        final List<GitCommit> commits = new ArrayList<GitCommit>();
        commits.add(PRGitObjectMockHelper.getCommit(projectMock, fileMock, "my subject", "my message"));

        final String desc = underTest.createDefaultDescription(commits);
        assertEquals("my message", desc);
    }

    @Test
    public void multipleCommitsDescShouldBeListOfSubjects() throws Exception {
        final List<GitCommit> commits = new ArrayList<GitCommit>();
        commits.add(PRGitObjectMockHelper.getCommit(projectMock, fileMock, "subject 1", "message 1"));
        commits.add(PRGitObjectMockHelper.getCommit(projectMock, fileMock, "subject 2", "message 2"));

        final String desc = underTest.createDefaultDescription(commits);
        final String lineSeparator = System.getProperty("line.separator");
        assertEquals(String.format("-subject 1%s-subject 2%s", lineSeparator, lineSeparator), desc);
    }

    @Test
    public void parseNullErrorReturnsEmpty() {
        final Pair<PRCreateStatus, String> parsed = underTest.parseException(null, "source", null, null, null);
        assertEquals(PRCreateStatus.UNKNOWN, parsed.getFirst());
        assertEquals(StringUtils.EMPTY, parsed.getSecond());
    }

    @Test
    public void nonPRExistErrorWillReturnError() {
        final String error = "This exception doesn't Git Pull request Exists string description";
        final RuntimeException exception = new RuntimeException(error);
        final Pair<PRCreateStatus, String> parsed = underTest.parseException(exception, "source", null, null, null);
        assertEquals(PRCreateStatus.FAILED, parsed.getFirst());
        assertEquals(error, parsed.getSecond());
    }

    @Test
    public void parseGitExistExceptionShouldReturnLinkToExistingPR_Code() {
        parseExceptionForError("This exception contains " + PullRequestHelper.PR_EXISTS_EXCEPTION_CODE);
    }

    @Test
    public void parseGitExistExceptionShouldReturnLinkToExistingPR_Exception() {
        parseExceptionForError("This exception contains " + PullRequestHelper.PR_EXISTS_EXCEPTION_NAME);
    }

    public void parseExceptionForError(final String error) {
        final RuntimeException exception = new RuntimeException(error);

        final ServerContext context = Mockito.mock(ServerContext.class);
        when(context.getGitRepository()).thenReturn(gitRepositoryMock);

        final UUID repoId = UUID.randomUUID();
        when(gitRepositoryMock.getId()).thenReturn(repoId);

        final GitRemoteBranch targetBranch = PRGitObjectMockHelper.createRemoteBranch("target", null);
        final GitHttpClient gitClient = Mockito.mock(GitHttpClient.class);
        final GitPullRequest pr = new GitPullRequest();
        pr.setPullRequestId(100);
        final List<GitPullRequest> pullRequests = Collections.singletonList(pr);

        when(gitClient.getPullRequests(eq(repoId), any(GitPullRequestSearchCriteria.class), anyInt(), eq(0), eq(1)))
                .thenReturn(pullRequests);

        final Pair<PRCreateStatus, String> parsed = underTest.parseException(exception, "source", targetBranch,
                context, gitClient);

        assertEquals(PRCreateStatus.DUPLICATE, parsed.getFirst());
    }

}