package org.bookdash.android.presentation.downloads;
import org.bookdash.android.data.book.BookService;
import org.bookdash.android.data.book.DownloadService;
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.After;
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 rx.Observable;
import rx.schedulers.Schedulers;
import static org.mockito.Matchers.anyList;
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 DownloadsPresenterTest {
@Mock
private BookService bookService;
@Mock
private DownloadService downloadService;
@Mock
private Analytics analytics;
private DownloadsPresenter downloadsPresenter;
@Mock
private DownloadsContract.View downloadsView;
private FireLanguage language;
private List<FireBookDetails> BOOKS = new ArrayList<>();
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
downloadsPresenter = new DownloadsPresenter(bookService, downloadService, analytics, Schedulers.immediate(),
Schedulers.immediate(), Schedulers.immediate());
language = new FireLanguage("English", "EN", true, "123");
}
@After
public void tearDown() throws Exception {
}
@Test
public void loadListDownloads_NoDownloads_ShowsNoDownloadsMessage() {
downloadsPresenter.attachView(downloadsView);
when(bookService.getDownloadedBooks()).thenReturn(Observable.just(BOOKS));
downloadsPresenter.loadListDownloads();
verify(downloadsView).showLoading(true);
verify(downloadsView).showLoading(false);
verify(downloadsView).showNoBooksDownloadedMessage();
verify(downloadsView, never()).showDownloadedBooks(anyList());
}
@Test
public void loadListDownloads_DownloadsAvailable_ShowsListDownloads() {
downloadsPresenter.attachView(downloadsView);
FireBookDetails sampleBook = new FireBookDetails("Test Book", "test_url", "cover_url_test", true, "description",
language, System.currentTimeMillis());
BOOKS.add(sampleBook);
when(bookService.getDownloadedBooks()).thenReturn(Observable.just(BOOKS));
downloadsPresenter.loadListDownloads();
verify(downloadsView).showLoading(true);
verify(downloadsView).showLoading(false);
verify(downloadsView).showDownloadedBooks(BOOKS);
verify(downloadsView, never()).showNoBooksDownloadedMessage();
}
@Test
public void loadListDownloads_DownloadException_ShowsErrorMessage() {
downloadsPresenter.attachView(downloadsView);
when(bookService.getDownloadedBooks())
.thenReturn(Observable.<List<FireBookDetails>>error(new Exception("Book Exception")));
downloadsPresenter.loadListDownloads();
verify(downloadsView).showLoading(true);
verify(downloadsView).showLoading(false);
verify(downloadsView, never()).showDownloadedBooks(BOOKS);
verify(downloadsView, never()).showNoBooksDownloadedMessage();
verify(downloadsView).showErrorScreen(true, "Book Exception", true);
}
@Test
public void deleteDownload_RemovesDownloadFromList() {
downloadsPresenter.attachView(downloadsView);
FireBookDetails sampleBook = new FireBookDetails("Test Book", "test_url", "cover_url_test", true, "description",
language, System.currentTimeMillis());
FireBookDetails sampleBook2 = new FireBookDetails("Test Book2", "test_url2", "cover_url_test2", true,
"description2", language, System.currentTimeMillis());
BOOKS.add(sampleBook2);
when(downloadService.deleteDownload(sampleBook)).thenReturn(Observable.just(true));
when(bookService.getDownloadedBooks()).thenReturn(Observable.just(BOOKS));
downloadsPresenter.deleteDownload(sampleBook);
verify(downloadsView, times(2)).showLoading(true);
verify(downloadsView).showLoading(false);
verify(downloadsView).showDownloadedBooks(BOOKS);
verify(downloadService).deleteDownload(sampleBook);
verify(analytics).trackDeleteBook(sampleBook);
}
@Test
public void deleteDownload_ThrowsError_NotifiesUserOfError() {
downloadsPresenter.attachView(downloadsView);
FireBookDetails sampleBook = new FireBookDetails("Test Book", "test_url", "cover_url_test", true, "description",
language, System.currentTimeMillis());
String errorMessage = "Failed to delete";
when(downloadService.deleteDownload(sampleBook))
.thenReturn(Observable.<Boolean>error(new Exception(errorMessage)));
downloadsPresenter.deleteDownload(sampleBook);
verify(downloadsView).showLoading(true);
verify(downloadsView).showLoading(false);
verify(downloadsView, never()).showDownloadedBooks(BOOKS);
verify(downloadService).deleteDownload(sampleBook);
verify(downloadsView).showSnackBarError(errorMessage);
verify(analytics).trackDeleteBookFailed(sampleBook, errorMessage);
}
}