package com.khmelenko.lab.varis; import com.khmelenko.lab.varis.dagger.DaggerTestComponent; import com.khmelenko.lab.varis.dagger.TestComponent; import com.khmelenko.lab.varis.network.request.AccessTokenRequest; import com.khmelenko.lab.varis.network.request.AuthorizationRequest; import com.khmelenko.lab.varis.network.response.AccessToken; import com.khmelenko.lab.varis.network.response.BuildHistory; import com.khmelenko.lab.varis.network.response.Repo; import com.khmelenko.lab.varis.network.response.Requests; import com.khmelenko.lab.varis.network.retrofit.EmptyOutput; import com.khmelenko.lab.varis.network.retrofit.github.GitHubRestClient; import com.khmelenko.lab.varis.network.retrofit.raw.RawClient; import com.khmelenko.lab.varis.network.retrofit.travis.TravisRestClient; import com.khmelenko.lab.varis.task.LoaderAsyncTask; import com.khmelenko.lab.varis.task.Task; import com.khmelenko.lab.varis.task.TaskError; import com.khmelenko.lab.varis.task.TaskException; import com.khmelenko.lab.varis.task.TaskHelper; import com.khmelenko.lab.varis.task.TaskManager; import com.khmelenko.lab.varis.task.github.CreateAuthorizationTask; import com.khmelenko.lab.varis.task.github.DeleteAuthorizationTask; import com.khmelenko.lab.varis.task.travis.AuthTask; import com.khmelenko.lab.varis.task.travis.BranchesTask; import com.khmelenko.lab.varis.task.travis.BuildDetailsTask; import com.khmelenko.lab.varis.task.travis.BuildHistoryTask; import com.khmelenko.lab.varis.task.travis.CancelBuildTask; import com.khmelenko.lab.varis.task.travis.FindRepoTask; import com.khmelenko.lab.varis.task.travis.LogTask; import com.khmelenko.lab.varis.task.travis.RepoTask; import com.khmelenko.lab.varis.task.travis.RequestsTask; import com.khmelenko.lab.varis.task.travis.RestartBuildTask; import com.khmelenko.lab.varis.task.travis.UserReposTask; import com.khmelenko.lab.varis.task.travis.UserTask; import com.squareup.okhttp.Protocol; import com.squareup.okhttp.Request; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.robolectric.RobolectricGradleTestRunner; import org.robolectric.annotation.Config; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.inject.Inject; import retrofit.client.Header; import retrofit.client.Response; import static junit.framework.TestCase.assertEquals; import static org.mockito.Mockito.anyLong; import static org.mockito.Mockito.anyString; import static org.mockito.Mockito.eq; 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 TaskManager class * * @author Dmytro Khmelenko (d.khmelenko@gmail.com) */ @RunWith(RobolectricGradleTestRunner.class) @Config(constants = BuildConfig.class, sdk = 21) public class TestTaskManager { @Inject TaskManager mTaskManager; @Inject TravisRestClient mTravisRestClient; @Inject GitHubRestClient mGitHubRestClient; @Inject RawClient mRawClient; @Inject TaskHelper mTaskHelper; @Before public void setupMock() { TestComponent component = DaggerTestComponent.builder().build(); component.inject(this); } @Test public void testTaskExecution() { final String request = "test"; FindRepoTask task = spy(new FindRepoTask(request)); List<Repo> result = spy(new ArrayList<Repo>()); when(mTravisRestClient.getApiService().getRepos(request)).thenReturn(result); LoaderAsyncTask.executeTask(task, mTaskHelper); verify(task).execute(); verify(task).onSuccess(result); } private void testTaskFailed(Task task) { final int errorCode = 401; final String errorMsg = "error"; task.setHelper(mTaskHelper); List<Header> headers = new ArrayList<>(); Response response = new Response("url", errorCode, errorMsg, headers, null); TaskError error = spy(new TaskError(errorCode, errorMsg)); TaskException exception = spy(new TaskException(error)); when(task.execute()).thenThrow(exception); when(error.getResponse()).thenReturn(response); ArgumentCaptor<TaskError> argument = ArgumentCaptor.forClass(TaskError.class); LoaderAsyncTask.executeTask(task, mTaskHelper); verify(task).onFail(argument.capture()); assertEquals(errorCode, argument.getValue().getCode()); assertEquals(errorMsg, argument.getValue().getMessage()); } @Test public void testRestartBuildTask() { mTaskManager.restartBuild(anyLong()); verify(mTravisRestClient.getApiService()).restartBuild(anyLong(), eq(EmptyOutput.INSTANCE)); final int buildId = 0; RestartBuildTask task = spy(new RestartBuildTask(buildId)); testTaskFailed(task); } @Test public void testCancelBuildTask() { mTaskManager.cancelBuild(anyLong()); verify(mTravisRestClient.getApiService()).cancelBuild(anyLong(), eq(EmptyOutput.INSTANCE)); final int buildId = 0; CancelBuildTask task = spy(new CancelBuildTask(buildId)); testTaskFailed(task); } @Test public void testSearchRepo() { mTaskManager.findRepos("test"); verify(mTravisRestClient.getApiService()).getRepos("test"); mTaskManager.findRepos(eq("")); verify(mTravisRestClient.getApiService()).getRepos(); final String testRepo = "testRepo"; FindRepoTask task = spy(new FindRepoTask(testRepo)); testTaskFailed(task); } @Test public void testGetRepo() { final String testRepo = "testRepo"; mTaskManager.getRepo(testRepo); verify(mTravisRestClient.getApiService()).getRepo(testRepo); RepoTask task = spy(new RepoTask(testRepo)); testTaskFailed(task); } @Test public void testGetUserRepos() { mTaskManager.userRepos(anyString()); verify(mTravisRestClient.getApiService()).getUserRepos(anyString()); final String testRepo = "testRepo"; UserReposTask task = spy(new UserReposTask(testRepo)); testTaskFailed(task); } @Test public void testGetBuildHistory() { mTaskManager.getBuildHistory("test"); verify(mTravisRestClient.getApiService()).getBuilds("test"); final String testRepo = "testRepo"; BuildHistoryTask task = spy(new BuildHistoryTask(testRepo)); testTaskFailed(task); } @Test public void testGetBranches() { mTaskManager.getBranches("test"); verify(mTravisRestClient.getApiService()).getBranches("test"); final String testRepo = "testRepo"; BranchesTask task = spy(new BranchesTask(testRepo)); testTaskFailed(task); } @Test public void testGetRequests() { when(mTravisRestClient.getApiService().getRequests(anyString())).thenReturn(spy(new Requests())); when(mTravisRestClient.getApiService().getPullRequestBuilds(anyString())).thenReturn(mock(BuildHistory.class)); mTaskManager.getRequests("test"); verify(mTravisRestClient.getApiService()).getRequests("test"); verify(mTravisRestClient.getApiService()).getPullRequestBuilds("test"); final String testRepo = "testRepo"; RequestsTask task = spy(new RequestsTask(testRepo)); testTaskFailed(task); } @Test public void testGetBuildDetails() { final String testRepo = "testRepo"; final int buildId = 0; mTaskManager.getBuildDetails(testRepo, buildId); verify(mTravisRestClient.getApiService()).getBuild(testRepo, buildId); BuildDetailsTask task = spy(new BuildDetailsTask(testRepo, buildId)); testTaskFailed(task); } @Test public void testUser() { mTaskManager.getUser(); verify(mTravisRestClient.getApiService()).getUser(); UserTask task = spy(new UserTask()); testTaskFailed(task); } @Test public void testAuth() { final String auth = "test"; AccessTokenRequest request = new AccessTokenRequest(); request.setGithubToken(auth); AccessToken token = mock(AccessToken.class); when(token.getAccessToken()).thenReturn(auth); when(mTravisRestClient.getApiService().auth(request)).thenReturn(token); mTaskManager.startAuth(auth); verify(mTravisRestClient.getApiService()).auth(request); final String accessToken = "token"; AuthTask task = spy(new AuthTask(accessToken)); testTaskFailed(task); } @Test public void testGetLogs() { final String auth = "test"; final long jobId = 0; Response response = new Response("url", 200, "", Collections.<Header>emptyList(), null); when(mRawClient.getApiService().getLog(anyString())).thenReturn(response); when(mRawClient.getApiService().getLog(anyString(), anyString())).thenReturn(response); mTaskManager.getLogUrl(anyLong()); verify(mRawClient.getApiService()).getLog(anyString()); mTaskManager.getLogUrl(auth, jobId); verify(mRawClient.getApiService()).getLog(anyString(), anyString()); LogTask task = spy(new LogTask(auth, jobId)); testTaskFailed(task); } @Test public void testGithubCreateNewAuth() { String authToken = "test"; AuthorizationRequest request = mock(AuthorizationRequest.class); mTaskManager.createNewAuthorization(authToken, request); verify(mGitHubRestClient.getApiService()).createNewAuthorization(authToken, request); mTaskManager.createNewAuthorization(authToken, request, authToken); verify(mGitHubRestClient.getApiService()).createNewAuthorization(authToken, authToken, request); List<String> scopes = new ArrayList<>(); AuthorizationRequest authRequest = spy(new AuthorizationRequest(scopes, "")); CreateAuthorizationTask task = spy(new CreateAuthorizationTask(authToken, authRequest)); testTaskFailed(task); } @Test public void testGithubDeleteAuth() { String auth = "test"; mTaskManager.deleteAuthorization(auth, auth); verify(mGitHubRestClient.getApiService()).deleteAuthorization(auth, auth); mTaskManager.deleteAuthorization(auth, auth, auth); verify(mGitHubRestClient.getApiService()).deleteAuthorization(auth, auth, auth); DeleteAuthorizationTask task = spy(new DeleteAuthorizationTask(auth, auth)); testTaskFailed(task); } @Test public void testSingleRequest() throws IOException { String anyUrl = "https://google.com.ua"; Request request = new Request.Builder() .url(anyUrl) .build(); com.squareup.okhttp.Response response = new com.squareup.okhttp.Response.Builder() .request(request) .protocol(Protocol.HTTP_1_1) .code(200) .build(); when(mRawClient.singleRequest(anyUrl)).thenReturn(response); mTaskManager.intentUrl(anyUrl); verify(mRawClient).singleRequest(anyUrl); } }