package com.alorma.github.ui.tags;
import com.alorma.github.di.DaggerTestComponent;
import com.alorma.github.di.TestComponent;
import com.alorma.github.di.TestModule;
import com.alorma.github.di.tags.TagsTestModule;
import com.alorma.github.injector.named.IOScheduler;
import com.alorma.github.injector.named.MainScheduler;
import com.alorma.github.presenter.View;
import com.alorma.github.presenter.repos.releases.tags.RepositoryTagsPresenter;
import com.alorma.github.presenter.repos.releases.tags.TagsCacheDataSource;
import com.alorma.github.sdk.bean.info.RepoInfo;
import com.alorma.github.utils.BeanUtils;
import com.alorma.gitskarios.core.client.TokenProvider;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import core.datasource.SdkItem;
import core.repositories.releases.tags.Tag;
import core.repositories.releases.tags.TagsCloudDataSource;
import core.repository.GenericRepository;
import rx.Observable;
import rx.Scheduler;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNull;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class RepositoryTagsPresenterTest {
@Mock View<List<Tag>> view;
@Inject TagsCacheDataSource tagsCacheDataSource;
@Inject TagsCloudDataSource tagsCloudDataSource;
@Inject @MainScheduler Scheduler mainScheduler;
@Inject @IOScheduler Scheduler ioScheduler;
RepositoryTagsPresenter repositoryTagsPresenter;
RepoInfo testRepoInfo;
SdkItem<RepoInfo> sdkItem;
SdkItem<List<Tag>> sdkItemObsWithPage;
List<Tag> listOfTags;
Observable<SdkItem<List<Tag>>> sdkItemObs;
Observable<SdkItem<List<Tag>>> sdkItemWithPageObs;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
TokenProvider.setTokenProviderInstance(() -> "test_token");
// dagger 2
TestComponent testComponent = DaggerTestComponent.builder().testModule(new TestModule()).build();
testComponent.plus(new TagsTestModule()).inject(this);
repositoryTagsPresenter = new RepositoryTagsPresenter(
mainScheduler, ioScheduler,
new GenericRepository<>(tagsCacheDataSource, tagsCloudDataSource));
repositoryTagsPresenter.attachView(view);
testRepoInfo = BeanUtils.createRepoInfo1();
sdkItem = new SdkItem<>(testRepoInfo);
listOfTags = new ArrayList<>();
listOfTags.add(BeanUtils.createTag1());
listOfTags.add(BeanUtils.createTag2());
sdkItemObs = Observable.just(new SdkItem<>(listOfTags));
sdkItemObsWithPage = new SdkItem<>(BeanUtils.TEST_PAGE, listOfTags);
sdkItemWithPageObs = Observable.just(sdkItemObsWithPage);
}
@Test
public void load_haveOnlyRepositoryInfo_successfullyLoadsTagsFromCloud() {
// Given
when(tagsCacheDataSource.getData(anyObject())).thenReturn(Observable.empty());
when(tagsCloudDataSource.execute(anyObject())).thenReturn(sdkItemObs);
// When
repositoryTagsPresenter.execute(testRepoInfo);
// Then
verify(view).showLoading();
verify(view).onDataReceived(eq(listOfTags), eq(false));
verify(view).hideLoading();
// Result
assertNull(repositoryTagsPresenter.getPage());
}
@Test
public void load_haveOnlyRepositoryInfo_successfullyLoadsTagsFromCache() {
// Given
when(tagsCacheDataSource.getData(anyObject())).thenReturn(sdkItemObs);
when(tagsCloudDataSource.execute(anyObject())).thenReturn(Observable.empty());
// When
repositoryTagsPresenter.execute(testRepoInfo);
// Then
verify(view).showLoading();
verify(view).onDataReceived(eq(listOfTags), eq(false));
verify(view).hideLoading();
// Result
assertNull(repositoryTagsPresenter.getPage());
}
@Test
public void load_noRepositoryInfo_failedInLoadingTags() {
// Given
when(tagsCacheDataSource.getData(anyObject())).thenReturn(Observable.empty());
when(tagsCloudDataSource.execute(anyObject())).thenReturn(Observable.empty());
// When
repositoryTagsPresenter.execute(null);
// Then
verify(view).showLoading();
verify(view).showError(any());
verify(view).hideLoading();
verify(view, never()).onDataReceived(eq(listOfTags), eq(false));
// Result
assertNull(repositoryTagsPresenter.getPage());
}
@Test
public void loadMore_noPageInfo_noRequestsAndResponses() {
// Given - Should never be called !!!
when(tagsCacheDataSource.getData(anyObject())).thenThrow(new RuntimeException());
when(tagsCloudDataSource.execute(anyObject())).thenThrow(new RuntimeException());
// When
boolean thrown = false;
try {
repositoryTagsPresenter.executePaginated(testRepoInfo);
} catch (RuntimeException e) {
thrown = true;
}
// Then
assertFalse(thrown);
verify(view, never()).showLoading();
verify(view, never()).onDataReceived(eq(listOfTags), eq(true));
verify(view, never()).hideLoading();
verify(view, never()).showError(any());
// Result
assertNull(repositoryTagsPresenter.getPage());
}
@Test
public void loadMore_repositoryInfoAndHasPage_successfullyLoadsTagsFromCloud() {
// Given
when(tagsCacheDataSource.getData(anyObject())).thenReturn(Observable.empty());
when(tagsCloudDataSource.execute(anyObject())).thenReturn(sdkItemWithPageObs);
// When
repositoryTagsPresenter.execute(testRepoInfo);
// Then
verify(view, times(1)).showLoading();
verify(view, times(1)).onDataReceived(eq(listOfTags), eq(false));
verify(view, times(1)).hideLoading();
verify(view, never()).showError(any());
// Result
assertNotNull(repositoryTagsPresenter.getPage());
assertEquals(BeanUtils.TEST_PAGE, (int) repositoryTagsPresenter.getPage());
// When LOAD MORE ITEMS
repositoryTagsPresenter.executePaginated(testRepoInfo);
verify(view, times(2)).showLoading();
verify(view, times(1)).onDataReceived(eq(listOfTags), eq(true));
verify(view, times(2)).hideLoading();
verify(view, never()).showError(any());
// Result
assertNotNull(repositoryTagsPresenter.getPage());
assertEquals(BeanUtils.TEST_PAGE, (int) repositoryTagsPresenter.getPage());
}
@Test
public void loadMore_repositoryInfoAndHasPage_successfullyLoadsTagsFromCache() {
// Given
when(tagsCacheDataSource.getData(anyObject())).thenReturn(sdkItemWithPageObs);
when(tagsCloudDataSource.execute(anyObject())).thenReturn(Observable.empty());
// When
repositoryTagsPresenter.execute(testRepoInfo);
// Then
verify(view, times(1)).showLoading();
verify(view, times(1)).onDataReceived(eq(listOfTags), eq(false));
verify(view, times(1)).hideLoading();
verify(view, never()).showError(any());
// Result
assertNotNull(repositoryTagsPresenter.getPage());
assertEquals(BeanUtils.TEST_PAGE, (int) repositoryTagsPresenter.getPage());
// When LOAD MORE ITEMS
repositoryTagsPresenter.executePaginated(testRepoInfo);
verify(view, times(2)).showLoading();
verify(view, times(1)).onDataReceived(eq(listOfTags), eq(true));
verify(view, times(2)).hideLoading();
verify(view, never()).showError(any());
// Result
assertNotNull(repositoryTagsPresenter.getPage());
assertEquals(BeanUtils.TEST_PAGE, (int) repositoryTagsPresenter.getPage());
}
}