package com.example.features.dashboard.presenter; import android.support.test.espresso.idling.CountingIdlingResource; import com.example.features.dashboard.analytics.FetchShotsEvent; import com.example.features.dashboard.analytics.ShotFetchingFailureEvent; import com.example.features.dashboard.model.ShotMapper; import com.example.features.dashboard.view.MainView; import com.example.model.Shot; import com.example.model.api.ImagesData; import com.example.model.api.ShotResponse; import com.example.networking.RestService; import com.example.tools.analytics.AnalyticsHelper; import com.example.util.PreconfiguredRobolectricTestRunner; import com.example.util.dummy.DummyDataProvider; import com.example.util.rx.RxSchedulers; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import rx.Single; import rx.schedulers.Schedulers; import java.util.ArrayList; import java.util.List; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; @RunWith(PreconfiguredRobolectricTestRunner.class) public class MainPresenterTest { @Mock private RestService mockRestService; @Mock private AnalyticsHelper mockAnalyticsHelper; @Mock private MainView mockMainView; private final DummyDataProvider dummyDataProvider = new DummyDataProvider(); private MainPresenter mainPresenter; @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); RxSchedulers rxSchedulers = new RxSchedulers(Schedulers.immediate(), Schedulers.immediate(), Schedulers.immediate(), Schedulers.immediate()); mainPresenter = new MainPresenter(mockRestService, rxSchedulers, mockAnalyticsHelper, new ShotMapper(), new CountingIdlingResource("test")); mainPresenter.attachView(mockMainView); } @Test public void load_shots() { // Arrange when(mockRestService.getShots()).thenReturn(Single.just(dummyDataProvider.shots().getShotResponsesList(3))); // Act mainPresenter.fetchShots(); // Assert verify(mockMainView).showLoadingBar(); verify(mockMainView).displayShotsList(dummyDataProvider.shots().getShotList(3)); verifyNoMoreInteractions(mockMainView); } @Test public void fail_to_load_shots_updates_view() { // Arrange when(mockRestService.getShots()).thenReturn(Single.error(new RuntimeException("error"))); // Act mainPresenter.fetchShots(); // Assert verify(mockMainView).showLoadingBar(); verify(mockMainView).showLoadingFailureError(); verifyNoMoreInteractions(mockMainView); } @Test public void null_shots_are_filtered_before_returned() { // Arrange List<ShotResponse> shotResponseList = new ArrayList<>(); shotResponseList.add(null); shotResponseList.add(new ShotResponse(null, new ImagesData("teaser url"))); shotResponseList.add(new ShotResponse("title", null)); shotResponseList.add(new ShotResponse("title", new ImagesData(null))); when(mockRestService.getShots()).thenReturn(Single.just(shotResponseList)); // Act mainPresenter.fetchShots(); // Assert List<Shot> expectedShotList = new ArrayList<>(); expectedShotList.add(Shot.builder().setTitle(null).setUrl("teaser url").build()); verify(mockMainView).showLoadingBar(); verify(mockMainView).displayShotsList(expectedShotList); verifyNoMoreInteractions(mockMainView); } @Test public void analytics_events_triggered_when_failure_occurs() { // Arrange when(mockRestService.getShots()).thenReturn(Single.error(new RuntimeException("error"))); // Act mainPresenter.fetchShots(); // Assert verify(mockAnalyticsHelper).logEvent(any(FetchShotsEvent.class)); verify(mockAnalyticsHelper).logEvent(any(ShotFetchingFailureEvent.class)); verifyNoMoreInteractions(mockAnalyticsHelper); } @Test public void analytics_events_triggered_when_fetching_shots() { // Arrange when(mockRestService.getShots()).thenReturn(Single.just(dummyDataProvider.shots().getShotResponsesList(3))); // Act mainPresenter.fetchShots(); // Assert verify(mockAnalyticsHelper).logEvent(any(FetchShotsEvent.class)); verifyNoMoreInteractions(mockAnalyticsHelper); } }