package com.quran.labs.androidquran.model.bookmark;
import android.support.v4.util.Pair;
import com.quran.labs.androidquran.dao.Bookmark;
import com.quran.labs.androidquran.dao.Tag;
import com.quran.labs.androidquran.database.BookmarksDBAdapter;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import io.reactivex.observers.TestObserver;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyLong;
import static org.mockito.Matchers.anySetOf;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class BookmarkModelTest {
@Mock BookmarksDBAdapter bookmarksAdapter;
@Mock RecentPageModel recentPageModel;
private BookmarkModel model;
@Before
public void setup() {
MockitoAnnotations.initMocks(BookmarkModelTest.this);
model = new BookmarkModel(bookmarksAdapter, recentPageModel);
}
@Test
public void testUpdateTag() {
when(bookmarksAdapter.updateTag(anyLong(), anyString())).thenReturn(true);
Tag tag = new Tag(1, "First Tag");
TestObserver<Void> testObserver = new TestObserver<>();
model.updateTag(tag)
.subscribe(testObserver);
testObserver.awaitTerminalEvent();
testObserver.assertNoErrors();
testObserver.assertComplete();
verify(bookmarksAdapter, times(1)).updateTag(tag.id, tag.name);
}
@Test
public void testUpdateBookmarkTags() {
when(bookmarksAdapter.tagBookmarks(
any(long[].class), anySetOf(long.class), anyBoolean())).thenReturn(true);
TestObserver<Boolean> testObserver = new TestObserver<>();
model.updateBookmarkTags(new long[] { }, new HashSet<Long>(), false)
.subscribe(testObserver);
testObserver.awaitTerminalEvent();
testObserver.assertNoErrors();
testObserver.assertComplete();
}
@Test
public void testBookmarkedAyahsOnPage() {
List<Bookmark> bookmarks = new ArrayList<>(2);
bookmarks.add(
new Bookmark(42, 46, 1, 502, System.currentTimeMillis(), Collections.singletonList(2L)));
bookmarks.add(new Bookmark(2, 2, 4, 2, System.currentTimeMillis() - 60000));
when(bookmarksAdapter.getBookmarkedAyahsOnPage(anyInt())).thenReturn(bookmarks);
Integer[][] inputs = new Integer[][] { new Integer[] { 42 }, new Integer[] { 42, 43 } };
int total = 0;
for (Integer[] input : inputs) {
TestObserver<List<Bookmark>> testObserver = new TestObserver<>();
model.getBookmarkedAyahsOnPageObservable(input)
.subscribe(testObserver);
testObserver.awaitTerminalEvent();
testObserver.assertNoErrors();
testObserver.assertValueCount(input.length);
verify(bookmarksAdapter, times(input.length + total)).getBookmarkedAyahsOnPage(anyInt());
total += input.length;
}
}
@Test
public void testIsPageBookmarked() {
when(bookmarksAdapter.getBookmarkId(null, null, 42)).thenReturn(1L);
when(bookmarksAdapter.getBookmarkId(null, null, 43)).thenReturn(-1L);
TestObserver<Pair<Integer, Boolean>> testObserver = new TestObserver<>();
model.getIsBookmarkedObservable(42, 43)
.subscribe(testObserver);
testObserver.awaitTerminalEvent();
testObserver.assertNoErrors();
testObserver.assertValueCount(2);
List<Pair<Integer, Boolean>> results = testObserver.values();
for (int i = 0; i < results.size(); i++) {
Pair<Integer, Boolean> result = results.get(i);
assertThat(result.first).isAnyOf(42, 43);
if (result.first == 42) {
assertThat(result.second).isTrue();
} else if (result.first == 43) {
assertThat(result.second).isFalse();
}
}
}
}