package com.khmelenko.lab.varis.presenter;
import com.khmelenko.lab.varis.BuildConfig;
import com.khmelenko.lab.varis.dagger.DaggerTestComponent;
import com.khmelenko.lab.varis.dagger.TestComponent;
import com.khmelenko.lab.varis.network.response.Branch;
import com.khmelenko.lab.varis.network.response.Branches;
import com.khmelenko.lab.varis.network.response.Build;
import com.khmelenko.lab.varis.network.response.BuildHistory;
import com.khmelenko.lab.varis.network.response.Commit;
import com.khmelenko.lab.varis.network.response.RequestData;
import com.khmelenko.lab.varis.network.response.Requests;
import com.khmelenko.lab.varis.network.retrofit.travis.TravisRestClient;
import com.khmelenko.lab.varis.task.TaskError;
import com.khmelenko.lab.varis.task.TaskException;
import com.khmelenko.lab.varis.task.TaskManager;
import com.khmelenko.lab.varis.view.RepoDetailsView;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricGradleTestRunner;
import org.robolectric.annotation.Config;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import de.greenrobot.event.EventBus;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/**
* Testing {@link RepoDetailsPresenter}
*
* @author Dmytro Khmelenko (d.khmelenko@gmail.com)
*/
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
public class TestRepoDetailsPresenter {
@Inject
TaskManager mTaskManager;
@Inject
EventBus mEventBus;
@Inject
TravisRestClient mTravisRestClient;
private RepoDetailsPresenter mRepoDetailsPresenter;
private RepoDetailsView mRepoDetailsView;
@Before
public void setup() {
TestComponent component = DaggerTestComponent.builder().build();
component.inject(this);
mRepoDetailsPresenter = spy(new RepoDetailsPresenter(mTaskManager, mEventBus));
mRepoDetailsView = mock(RepoDetailsView.class);
mRepoDetailsPresenter.attach(mRepoDetailsView);
}
@Test
public void testLoadBuildsHistory() {
final String slug = "test";
final List<Build> builds = new ArrayList<>();
final List<Commit> commits = new ArrayList<>();
final BuildHistory buildHistory = new BuildHistory();
buildHistory.setBuilds(builds);
buildHistory.setCommits(commits);
when(mTravisRestClient.getApiService().getBuilds(slug)).thenReturn(buildHistory);
mRepoDetailsPresenter.setRepoSlug(slug);
mRepoDetailsPresenter.loadBuildsHistory();
verify(mTaskManager).getBuildHistory(slug);
verify(mRepoDetailsView).updateBuildHistory(buildHistory);
}
@Test
public void testLoadBuildsHistoryFailed() {
final String slug = "test";
final int errorCode = 401;
final String errorMsg = "error";
TaskError error = spy(new TaskError(errorCode, errorMsg));
TaskException exception = spy(new TaskException(error));
when(mTravisRestClient.getApiService().getBuilds(slug)).thenThrow(exception);
mRepoDetailsPresenter.setRepoSlug(slug);
mRepoDetailsPresenter.loadBuildsHistory();
verify(mTaskManager).getBuildHistory(slug);
verify(mRepoDetailsView).showBuildHistoryLoadingError(error.getMessage());
}
@Test
public void testLoadBranches() {
final String slug = "test";
final List<Branch> branch = new ArrayList<>();
final List<Commit> commits = new ArrayList<>();
final Branches branches = new Branches();
branches.setBranches(branch);
branches.setCommits(commits);
when(mTravisRestClient.getApiService().getBranches(slug)).thenReturn(branches);
mRepoDetailsPresenter.setRepoSlug(slug);
mRepoDetailsPresenter.loadBranches();
verify(mTaskManager).getBranches(slug);
verify(mRepoDetailsView).updateBranches(branches);
}
@Test
public void testLoadBranchesFailed() {
final String slug = "test";
final int errorCode = 401;
final String errorMsg = "error";
TaskError error = spy(new TaskError(errorCode, errorMsg));
TaskException exception = spy(new TaskException(error));
when(mTravisRestClient.getApiService().getBranches(slug)).thenThrow(exception);
mRepoDetailsPresenter.setRepoSlug(slug);
mRepoDetailsPresenter.loadBranches();
verify(mTaskManager).getBranches(slug);
verify(mRepoDetailsView).showBranchesLoadingError(error.getMessage());
}
@Test
public void testLoadRequests() {
final String slug = "test";
final List<Build> builds = new ArrayList<>();
final List<Commit> commits = new ArrayList<>();
final List<RequestData> requestData = new ArrayList<>();
final Requests requests = new Requests();
requests.setCommits(commits);
requests.setRequests(requestData);
final BuildHistory buildHistory = new BuildHistory();
buildHistory.setBuilds(builds);
buildHistory.setCommits(commits);
when(mTravisRestClient.getApiService().getRequests(slug)).thenReturn(requests);
when(mTravisRestClient.getApiService().getPullRequestBuilds(slug)).thenReturn(buildHistory);
mRepoDetailsPresenter.setRepoSlug(slug);
mRepoDetailsPresenter.loadRequests();
verify(mTaskManager).getRequests(slug);
verify(mRepoDetailsView).updatePullRequests(requests);
}
@Test
public void testLoadRequestsFailed() {
final String slug = "test";
final int errorCode = 401;
final String errorMsg = "error";
TaskError error = spy(new TaskError(errorCode, errorMsg));
TaskException exception = spy(new TaskException(error));
when(mTravisRestClient.getApiService().getRequests(slug)).thenThrow(exception);
mRepoDetailsPresenter.setRepoSlug(slug);
mRepoDetailsPresenter.loadRequests();
verify(mTaskManager).getRequests(slug);
verify(mRepoDetailsView).showPullRequestsLoadingError(error.getMessage());
}
@Test
public void testSetRepoSlug() {
final String slug = "test";
mRepoDetailsPresenter.setRepoSlug(slug);
assertEquals(slug, mRepoDetailsPresenter.getRepoSlug());
}
@Test
public void testLoadData() {
final String slug = "test";
final List<Build> builds = new ArrayList<>();
final List<Commit> commits = new ArrayList<>();
final List<RequestData> requestData = new ArrayList<>();
final Requests requests = new Requests();
requests.setCommits(commits);
requests.setRequests(requestData);
final BuildHistory buildHistory = new BuildHistory();
buildHistory.setBuilds(builds);
buildHistory.setCommits(commits);
final List<Branch> branch = new ArrayList<>();
final Branches branches = new Branches();
branches.setBranches(branch);
branches.setCommits(commits);
when(mTravisRestClient.getApiService().getBuilds(slug)).thenReturn(buildHistory);
when(mTravisRestClient.getApiService().getBranches(slug)).thenReturn(branches);
when(mTravisRestClient.getApiService().getRequests(slug)).thenReturn(requests);
when(mTravisRestClient.getApiService().getPullRequestBuilds(slug)).thenReturn(buildHistory);
mRepoDetailsPresenter.setRepoSlug(slug);
mRepoDetailsPresenter.loadData();
verify(mRepoDetailsPresenter).loadBuildsHistory();
verify(mRepoDetailsPresenter).loadBranches();
verify(mRepoDetailsPresenter).loadRequests();
}
}