package org.bookdash.android.presentation.search;
import org.bookdash.android.data.book.BookService;
import org.bookdash.android.data.tracking.Analytics;
import org.bookdash.android.domain.model.firebase.FireBookDetails;
import org.bookdash.android.domain.model.firebase.FireLanguage;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import rx.Observable;
import rx.schedulers.Schedulers;
import static org.mockito.Matchers.anyListOf;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/**
* @author rebeccafranks
* @since 2016/12/11
*/
public class SearchPresenterTest {
@Mock
SearchContract.View view;
@Mock
BookService bookRepository;
@Mock
Analytics analytics;
private SearchContract.Presenter presenter;
private FireLanguage ENGLISH_LANGUAGE = new FireLanguage("English", "EN", true, "2");
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
presenter = new SearchPresenter(bookRepository, analytics, Schedulers.immediate(), Schedulers.immediate());
presenter.attachView(view);
}
@Test
public void search_ValidSearchTerm_ReturnsValidResults() {
when(bookRepository.searchBooks(anyString())).thenReturn(Observable.just(getFakeBooks()));
String searchTerm = "hug";
presenter.search(searchTerm);
verify(analytics).trackSearchBooks(searchTerm);
verify(view).showSearchResults(anyListOf(FireBookDetails.class));
verify(bookRepository).searchBooks(searchTerm);
verify(analytics).trackSearchBooksSuccess(searchTerm, getFakeBooks().size());
verify(view, never()).showErrorMessage(anyString());
}
private List<FireBookDetails> getFakeBooks() {
List<FireBookDetails> books = new ArrayList<>();
books.add(new FireBookDetails("Test title", "url", "cover_url", true, "description", ENGLISH_LANGUAGE,
System.currentTimeMillis()));
return books;
}
@Test
public void search_NoInternet_ShowsNoInternetMsg() {
when(bookRepository.searchBooks(anyString()))
.thenReturn(Observable.<List<FireBookDetails>>error(new IOException("No Internet")));
String searchTerm = "hug";
presenter.search(searchTerm);
verify(view).showLoading();
verify(analytics).trackSearchBooks(searchTerm);
verify(view, never()).showSearchResults(anyListOf(FireBookDetails.class));
verify(bookRepository).searchBooks(searchTerm);
verify(view).showNoInternetMessage();
verify(view).hideLoading();
}
@Test
public void search_NoValidMatches_ShowsNoResultsMsg() {
when(bookRepository.searchBooks(anyString()))
.thenReturn(Observable.<List<FireBookDetails>>just(new ArrayList<FireBookDetails>()));
String searchTerm = "hug";
presenter.search(searchTerm);
verify(view).showLoading();
verify(view, never()).showSearchResults(anyListOf(FireBookDetails.class));
verify(bookRepository).searchBooks(searchTerm);
verify(analytics).trackSearchBooks(searchTerm);
verify(analytics).trackSearchBooksNoResults(searchTerm);
verify(view).showNoResultsMessage();
verify(view).hideLoading();
}
@Test
public void search_NoSearchTerm_ThrowsError() {
final String errorMessage = "This is awkward.";
when(bookRepository.searchBooks(anyString()))
.thenReturn(Observable.<List<FireBookDetails>>error(new Exception(errorMessage)));
String searchTerm = "hug";
presenter.search(searchTerm);
verify(view).showLoading();
verify(view, never()).showSearchResults(anyListOf(FireBookDetails.class));
verify(bookRepository).searchBooks(searchTerm);
verify(analytics).trackSearchBooks(searchTerm);
verify(analytics).trackSearchError(searchTerm, errorMessage);
verify(view).showErrorMessage(errorMessage);
verify(view).hideLoading();
}
}