package com.zedeff.twittererer.test.presenters; import com.zedeff.twittererer.R; import com.zedeff.twittererer.models.TimelineItem; import com.zedeff.twittererer.models.User; import com.zedeff.twittererer.presenters.TimelinePresenter; import com.zedeff.twittererer.services.TwitterService; import com.zedeff.twittererer.views.TimelineView; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.ArrayList; import java.util.List; import rx.Observable; import rx.schedulers.Schedulers; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class TimelinePresenterTest { @Mock TwitterService twitterService; @Mock TimelineView mockView; @Captor ArgumentCaptor<List<TimelineItem>> timelineItemsCaptor; private TimelinePresenter presenter; private User user; private List<TimelineItem> timelineItems; @Before public void setUp() { MockitoAnnotations.initMocks(this); presenter = new TimelinePresenter(twitterService, Schedulers.immediate()); user = new User("Bob", "bob", ""); timelineItems = new ArrayList<>(); timelineItems.add(new TimelineItem("", "", user)); when(twitterService.getTimelineItems()).thenReturn(Observable.just(timelineItems)); when(twitterService.getMyDetails()).thenReturn(Observable.just(user)); } @Test public void initialiseGetsMyDetails() { presenter.initialise(mockView); verify(twitterService).setCurrentUser(user); } @Test public void initialiseLoadsTimelineData() { presenter.initialise(mockView); verify(mockView).showTimeline(timelineItems); } @Test public void initialiseShowNoTweets() { timelineItems.clear(); presenter.initialise(mockView); verify(mockView).showNoTweets(); } @Test public void tweetAddsToTimeline() { when(twitterService.sendTweet("hello")).thenReturn(Observable.just(true)); presenter.initialise(mockView); presenter.tweet("hello"); verify(mockView, times(2)).showTimeline(timelineItemsCaptor.capture()); assertThat(timelineItemsCaptor.getValue(), is(notNullValue())); assertThat(timelineItemsCaptor.getValue().get(0).getText(), is(equalTo("hello"))); } @Test public void whenTweetSuccessfulThenShowSuccessMessage() { when(twitterService.sendTweet("hello")).thenReturn(Observable.just(true)); presenter.initialise(mockView); presenter.tweet("hello"); verify(mockView).showMessage(R.string.alert_tweet_successful); } @Test public void whenTweetFailsThenShowErrorMessage() { when(twitterService.sendTweet("hello")).thenReturn(Observable.error(new Exception())); presenter.initialise(mockView); presenter.tweet("hello"); verify(mockView).showMessage(R.string.alert_tweet_failed); } }