package com.quran.labs.androidquran.presenter; import android.content.ContentResolver; import android.content.Context; import android.net.Uri; import android.os.ParcelFileDescriptor; import com.quran.labs.androidquran.model.bookmark.BookmarkImportExportModel; import com.quran.labs.androidquran.model.bookmark.BookmarkModel; import org.junit.Before; import org.junit.Test; import java.io.ByteArrayInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.util.List; import io.reactivex.observers.TestObserver; import okio.BufferedSource; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class QuranImportPresenterTest { private Context appContext; private QuranImportPresenter presenter; @Before public void setup() { appContext = mock(Context.class); BookmarkImportExportModel model = mock(BookmarkImportExportModel.class); presenter = new QuranImportPresenter(appContext, model, mock(BookmarkModel.class)); } @Test public void testParseExternalFile() throws FileNotFoundException { InputStream is = new ByteArrayInputStream(new byte[32]); ContentResolver resolver = mock(ContentResolver.class); when(resolver.openInputStream(any(Uri.class))).thenReturn(is); when(appContext.getContentResolver()).thenReturn(resolver); TestObserver<BufferedSource> observer = new TestObserver<>(); presenter.parseExternalFile(Uri.EMPTY) .subscribe(observer); observer.awaitTerminalEvent(); observer.assertValueCount(1); observer.assertNoErrors(); observer.assertComplete(); List<BufferedSource> events = observer.values(); assertThat(events).hasSize(1); assertThat(events.get(0)).isNotNull(); } @Test public void testParseExternalFileNullIs() throws FileNotFoundException { ContentResolver resolver = mock(ContentResolver.class); when(resolver.openInputStream(any(Uri.class))).thenReturn(null); when(appContext.getContentResolver()).thenReturn(resolver); TestObserver<BufferedSource> observer = new TestObserver<>(); presenter.parseExternalFile(Uri.EMPTY) .subscribe(observer); observer.awaitTerminalEvent(); observer.assertValueCount(0); observer.assertNoErrors(); observer.assertComplete(); } @Test public void testParseUriNullFd() throws FileNotFoundException { ContentResolver resolver = mock(ContentResolver.class); when(resolver.openFileDescriptor(any(Uri.class), anyString())).thenReturn(null); when(appContext.getContentResolver()).thenReturn(resolver); TestObserver<BufferedSource> observer = new TestObserver<>(); presenter.parseUri(Uri.EMPTY) .subscribe(observer); observer.awaitTerminalEvent(); observer.assertComplete(); observer.assertValueCount(0); observer.assertNoErrors(); } @Test public void testParseUriWithException() throws FileNotFoundException { ParcelFileDescriptor pfd = mock(ParcelFileDescriptor.class); when(pfd.getFd()).thenReturn(-1); ContentResolver resolver = mock(ContentResolver.class); when(resolver.openFileDescriptor(any(Uri.class), anyString())).thenReturn(pfd); when(appContext.getContentResolver()).thenReturn(resolver); TestObserver<BufferedSource> observer = new TestObserver<>(); presenter.parseUri(Uri.EMPTY) .subscribe(observer); observer.awaitTerminalEvent(); observer.assertError(NullPointerException.class); observer.assertValueCount(0); } }