package uk.ivanc.archimvp; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricGradleTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import java.util.Collections; import java.util.List; import okhttp3.ResponseBody; import retrofit2.Response; import retrofit2.adapter.rxjava.HttpException; import rx.Observable; import rx.schedulers.Schedulers; import uk.ivanc.archimvp.model.GithubService; import uk.ivanc.archimvp.model.Repository; import uk.ivanc.archimvp.presenter.MainPresenter; import uk.ivanc.archimvp.util.MockModelFabric; import uk.ivanc.archimvp.view.MainMvpView; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(RobolectricGradleTestRunner.class) @Config(constants = BuildConfig.class, sdk = 21) public class MainPresenterTest { MainPresenter mainPresenter; MainMvpView mainMvpView; GithubService githubService; @Before public void setUp() { ArchiApplication application = (ArchiApplication) RuntimeEnvironment.application; githubService = mock(GithubService.class); // Mock the retrofit service so we don't call the API directly application.setGithubService(githubService); // Change the default subscribe schedulers so all observables // will now run on the same thread application.setDefaultSubscribeScheduler(Schedulers.immediate()); mainPresenter = new MainPresenter(); mainMvpView = mock(MainMvpView.class); when(mainMvpView.getContext()).thenReturn(application); mainPresenter.attachView(mainMvpView); } @After public void tearDown() { mainPresenter.detachView(); } @Test public void loadRepositoriesCallsShowRepositories() { String username = "ivacf"; List<Repository> repositories = MockModelFabric.newListOfRepositories(10); when(githubService.publicRepositories(username)) .thenReturn(Observable.just(repositories)); mainPresenter.loadRepositories(username); verify(mainMvpView).showProgressIndicator(); verify(mainMvpView).showRepositories(repositories); } @Test public void loadRepositoriesCallsShowMessage_withEmptyReposString() { String username = "ivacf"; when(githubService.publicRepositories(username)) .thenReturn(Observable.just(Collections.<Repository>emptyList())); mainPresenter.loadRepositories(username); verify(mainMvpView).showProgressIndicator(); verify(mainMvpView).showMessage(R.string.text_empty_repos); } @Test public void loadRepositoriesCallsShowMessage_withDefaultErrorString() { String username = "ivacf"; when(githubService.publicRepositories(username)) .thenReturn(Observable.<List<Repository>>error(new RuntimeException("error"))); mainPresenter.loadRepositories(username); verify(mainMvpView).showProgressIndicator(); verify(mainMvpView).showMessage(R.string.error_loading_repos); } @Test public void loadRepositoriesCallsShowMessage_withUsernameNotFoundString() { String username = "ivacf"; HttpException mockHttpException = new HttpException(Response.error(404, mock(ResponseBody.class))); when(githubService.publicRepositories(username)) .thenReturn(Observable.<List<Repository>>error(mockHttpException)); mainPresenter.loadRepositories(username); verify(mainMvpView).showProgressIndicator(); verify(mainMvpView).showMessage(R.string.error_username_not_found); } }