package com.hitherejoe.mvvm_hackernews; import com.hitherejoe.mvvm_hackernews.data.DataManager; import com.hitherejoe.mvvm_hackernews.model.Post; import com.hitherejoe.mvvm_hackernews.model.User; import com.hitherejoe.mvvm_hackernews.data.remote.HackerNewsService; import com.hitherejoe.mvvm_hackernews.util.DefaultConfig; import com.hitherejoe.mvvm_hackernews.util.MockModelsUtil; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; import java.util.ArrayList; import java.util.List; import rx.Observable; import rx.observers.TestSubscriber; import rx.schedulers.Schedulers; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @RunWith(RobolectricTestRunner.class) @Config(constants = BuildConfig.class, sdk = DefaultConfig.EMULATE_SDK) public class DataManagerTest { private DataManager mDataManager; private HackerNewsService mMockHackerNewsService; @Before public void setUp() { mMockHackerNewsService = mock(HackerNewsService.class); mDataManager = new DataManager(mMockHackerNewsService, Schedulers.immediate()); } @Test public void shouldGetTopStories() throws Exception { User mockUser = MockModelsUtil.createMockUser(); Post mockStoryOne = MockModelsUtil.createMockStoryWithId(mockUser.submitted.get(0)); Post mockStoryTwo = MockModelsUtil.createMockStoryWithId(mockUser.submitted.get(1)); Post mockStoryThree = MockModelsUtil.createMockStoryWithId(mockUser.submitted.get(2)); Post mockStoryFour = MockModelsUtil.createMockStoryWithId(mockUser.submitted.get(3)); when(mMockHackerNewsService.getStoryItem(String.valueOf(mockUser.submitted.get(0)))) .thenReturn(Observable.just(mockStoryOne)); when(mMockHackerNewsService.getStoryItem(String.valueOf(mockUser.submitted.get(1)))) .thenReturn(Observable.just(mockStoryTwo)); when(mMockHackerNewsService.getStoryItem(String.valueOf(mockUser.submitted.get(2)))) .thenReturn(Observable.just(mockStoryThree)); when(mMockHackerNewsService.getStoryItem(String.valueOf(mockUser.submitted.get(3)))) .thenReturn(Observable.just(mockStoryFour)); final List<Long> storyIds = new ArrayList<>(); storyIds.add(mockUser.submitted.get(0)); storyIds.add(mockUser.submitted.get(1)); storyIds.add(mockUser.submitted.get(2)); storyIds.add(mockUser.submitted.get(3)); List<Post> topStories = new ArrayList<>(); topStories.add(mockStoryOne); topStories.add(mockStoryTwo); topStories.add(mockStoryThree); topStories.add(mockStoryFour); TestSubscriber<Post> result = new TestSubscriber<>(); mDataManager.getPostsFromIds(storyIds).subscribe(result); result.assertNoErrors(); result.assertReceivedOnNext(topStories); } @Test public void shouldGetUserStories() throws Exception { User mockUser = MockModelsUtil.createMockUser(); when(mMockHackerNewsService.getUser(any(String.class))) .thenReturn(Observable.just(mockUser)); Post mockStoryOne = MockModelsUtil.createMockStoryWithId(mockUser.submitted.get(0)); Post mockStoryTwo = MockModelsUtil.createMockStoryWithId(mockUser.submitted.get(1)); Post mockStoryThree = MockModelsUtil.createMockStoryWithId(mockUser.submitted.get(2)); Post mockStoryFour = MockModelsUtil.createMockStoryWithId(mockUser.submitted.get(3)); when(mMockHackerNewsService.getStoryItem(String.valueOf(mockUser.submitted.get(0)))) .thenReturn(Observable.just(mockStoryOne)); when(mMockHackerNewsService.getStoryItem(String.valueOf(mockUser.submitted.get(1)))) .thenReturn(Observable.just(mockStoryTwo)); when(mMockHackerNewsService.getStoryItem(String.valueOf(mockUser.submitted.get(2)))) .thenReturn(Observable.just(mockStoryThree)); when(mMockHackerNewsService.getStoryItem(String.valueOf(mockUser.submitted.get(3)))) .thenReturn(Observable.just(mockStoryFour)); List<Post> userStories = new ArrayList<>(); userStories.add(mockStoryOne); userStories.add(mockStoryTwo); userStories.add(mockStoryThree); userStories.add(mockStoryFour); TestSubscriber<Post> result = new TestSubscriber<>(); mDataManager.getUserPosts(mockUser.id).subscribe(result); result.assertNoErrors(); result.assertReceivedOnNext(userStories); } }