diff --git a/MinimalBible/src/main/java/org/bspeice/minimalbible/MinimalBible.java b/MinimalBible/src/main/java/org/bspeice/minimalbible/MinimalBible.java index 1f62f14..42a5d65 100644 --- a/MinimalBible/src/main/java/org/bspeice/minimalbible/MinimalBible.java +++ b/MinimalBible/src/main/java/org/bspeice/minimalbible/MinimalBible.java @@ -76,6 +76,10 @@ public class MinimalBible extends Application { return graph; } + public void plusObjGraph(Object... modules) { + graph = graph.plus(modules); + } + /** * Notify jSword that it needs to store files in the Android internal directory * NOTE: Android will uninstall these files if you uninstall MinimalBible. diff --git a/MinimalBible/src/main/java/org/bspeice/minimalbible/activities/downloader/BookListFragment.java b/MinimalBible/src/main/java/org/bspeice/minimalbible/activities/downloader/BookListFragment.java index 90c875e..f980af0 100644 --- a/MinimalBible/src/main/java/org/bspeice/minimalbible/activities/downloader/BookListFragment.java +++ b/MinimalBible/src/main/java/org/bspeice/minimalbible/activities/downloader/BookListFragment.java @@ -40,7 +40,7 @@ public class BookListFragment extends BaseFragment { * The fragment argument representing the section number for this fragment. * Not a candidate for Dart (yet) because I would have to write a Parcelable around it. */ - private static final String ARG_BOOK_CATEGORY = "book_category"; + protected static final String ARG_BOOK_CATEGORY = "book_category"; private final String TAG = "BookListFragment"; @@ -48,9 +48,9 @@ public class BookListFragment extends BaseFragment { ListView downloadsAvailable; @Inject RefreshManager refreshManager; - @Inject DownloadPrefs downloadPrefs; + @Inject protected DownloadPrefs downloadPrefs; - private ProgressDialog refreshDialog; + protected ProgressDialog refreshDialog; private LayoutInflater inflater; /** @@ -93,7 +93,7 @@ public class BookListFragment extends BaseFragment { * Trigger the functionality to display a list of modules. Prompts user if downloading * from the internet is allowable. */ - private void displayModules() { + protected void displayModules() { boolean dialogDisplayed = downloadPrefs.hasShownDownloadDialog(); if (!dialogDisplayed) { diff --git a/MinimalBible/src/test/java/org/bspeice/minimalbible/test/DownloadActivityTest.java b/MinimalBible/src/test/java/org/bspeice/minimalbible/test/DownloadActivityTest.java deleted file mode 100644 index 864b637..0000000 --- a/MinimalBible/src/test/java/org/bspeice/minimalbible/test/DownloadActivityTest.java +++ /dev/null @@ -1,104 +0,0 @@ -package org.bspeice.minimalbible.test; - -import android.test.InstrumentationTestCase; -import android.util.Log; - -import org.bspeice.minimalbible.MinimalBible; -import org.bspeice.minimalbible.MinimalBibleModules; -import org.bspeice.minimalbible.activities.downloader.manager.BookDownloadManager; -import org.bspeice.minimalbible.activities.downloader.manager.DLProgressEvent; -import org.bspeice.minimalbible.activities.downloader.manager.DownloadManager; -import org.bspeice.minimalbible.activities.downloader.manager.InstalledManager; -import org.bspeice.minimalbible.activities.downloader.manager.RefreshManager; -import org.crosswire.jsword.book.Book; -import org.crosswire.jsword.book.BookException; -import org.crosswire.jsword.book.Books; -import org.crosswire.jsword.book.install.InstallException; -import org.crosswire.jsword.book.install.Installer; -import org.crosswire.jsword.passage.NoSuchKeyException; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.Callable; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicBoolean; - -import javax.inject.Inject; - -import dagger.Module; -import dagger.ObjectGraph; -import rx.Observable; - -import static com.jayway.awaitility.Awaitility.await; - -/** - * Tests for the Download activity - */ -public class DownloadActivityTest extends InstrumentationTestCase { - - @Module(addsTo = MinimalBibleModules.class, - injects = DownloadActivityTest.class) - public static class DownloadActivityTestModule {} - - @Inject DownloadManager dm; - @Inject InstalledManager im; - @Inject RefreshManager rm; - @Inject BookDownloadManager bdm; - - public void setUp() { - MinimalBible application = MinimalBible.getApplication(); - ObjectGraph graph = application.getObjGraph(); - ObjectGraph plusGraph = graph.plus(DownloadActivityTestModule.class); - plusGraph.inject(this); - } - - public void testBasicAssertion() { - assertEquals(true, true); - } - - /** - * Test that we can successfully download and remove a book - */ - /* Testing disabled for right now, I'm having lots of issues with the jSword API being - inconsistent on Android. These will be enabled again once I can take some time to figure that - out, or mock out the sections I need. For now in the phase of heavy development, I'll do without - - public void testInstallAndRemoveBook() { - // Install a book - Installer i = (Installer) dm.getInstallers().values().toArray()[0]; - final Book testBook = i.getBooks().get(0); - bdm.installBook(testBook); - await().atMost(30, TimeUnit.SECONDS) - .until(new Callable() { - @Override - public Boolean call() throws Exception { - return Books.installed().getBooks().contains(testBook); - } - }); - - // Validate that we can actually do something with the book - // TODO: Validate that the book exists on the filesystem too - try { - assertNotNull(testBook.getRawText(testBook.getKey("Gen 1:1"))); - } catch (BookException e) { - fail(e.getMessage()); - } catch (NoSuchKeyException e) { - fail(e.getMessage()); - } - - // Remove the book and make sure it's gone - // TODO: Validate that the book is off the filesystem - im.removeBook(testBook); - await().atMost(10, TimeUnit.SECONDS) - .until(new Callable() { - @Override - public Boolean call() throws Exception { - return !Books.installed().getBooks().contains(testBook); - } - }); - } - */ - -} diff --git a/MinimalBible/src/test/java/org/bspeice/minimalbible/test/MinimalBibleTest.java b/MinimalBible/src/test/java/org/bspeice/minimalbible/test/MinimalBibleTest.java new file mode 100644 index 0000000..d99c253 --- /dev/null +++ b/MinimalBible/src/test/java/org/bspeice/minimalbible/test/MinimalBibleTest.java @@ -0,0 +1,42 @@ +package org.bspeice.minimalbible.test; + +import android.test.InstrumentationTestCase; + +import org.bspeice.minimalbible.MinimalBible; +import org.bspeice.minimalbible.MinimalBibleModules; +import org.bspeice.minimalbible.activities.downloader.manager.BookDownloadManager; +import org.bspeice.minimalbible.activities.downloader.manager.DownloadManager; +import org.bspeice.minimalbible.activities.downloader.manager.InstalledManager; +import org.bspeice.minimalbible.activities.downloader.manager.RefreshManager; + +import javax.inject.Inject; + +import dagger.Module; +import dagger.ObjectGraph; + +import static com.jayway.awaitility.Awaitility.await; + +/** + * Tests for the Download activity + */ +public class MinimalBibleTest extends InstrumentationTestCase { + + @Module(addsTo = MinimalBibleModules.class, + injects = MinimalBibleTest.class) + public static class DownloadActivityTestModule {} + + public void setUp() { + MinimalBible application = MinimalBible.getApplication(); + ObjectGraph graph = application.getObjGraph(); + ObjectGraph plusGraph = graph.plus(DownloadActivityTestModule.class); + plusGraph.inject(this); + } + + /** + * If we've made it to the actual test, injection seems to be working correctly. + */ + public void testBasicInjection() { + assertEquals(true, true); + } + +} diff --git a/MinimalBible/src/test/java/org/bspeice/minimalbible/test/activities/downloader/BookListFragmentTest.java b/MinimalBible/src/test/java/org/bspeice/minimalbible/test/activities/downloader/BookListFragmentTest.java new file mode 100644 index 0000000..d9e7813 --- /dev/null +++ b/MinimalBible/src/test/java/org/bspeice/minimalbible/test/activities/downloader/BookListFragmentTest.java @@ -0,0 +1,123 @@ +package org.bspeice.minimalbible.test.activities.downloader; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentActivity; +import android.support.v4.app.FragmentManager; +import android.test.ActivityInstrumentationTestCase2; +import android.test.ActivityUnitTestCase; +import android.test.InstrumentationTestCase; +import android.view.ContextThemeWrapper; + +import org.bspeice.minimalbible.MinimalBible; +import org.bspeice.minimalbible.MinimalBibleModules; +import org.bspeice.minimalbible.R; +import org.bspeice.minimalbible.activities.downloader.ActivityDownloaderModule; +import org.bspeice.minimalbible.activities.downloader.BookListFragment; +import org.bspeice.minimalbible.activities.downloader.DownloadActivity; +import org.bspeice.minimalbible.activities.downloader.DownloadPrefs; +import org.crosswire.jsword.book.BookCategory; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; + +import javax.inject.Inject; + +import dagger.Module; +import dagger.ObjectGraph; +import dagger.Provides; +import de.devland.esperandro.Esperandro; + +import static com.jayway.awaitility.Awaitility.await; + +/** + * Created by bspeice on 6/23/14. + */ +public class BookListFragmentTest extends ActivityInstrumentationTestCase2 { + + @Module(injects = TestDialogDisplayedIfFirstTimeFragment.class, + addsTo = ActivityDownloaderModule.class + ) + protected static class BookListFragmentTestModule{} + + public BookListFragmentTest() { + super(DownloadActivity.class); + } + + FragmentManager mFragmentManager; + + public void setUp() throws Exception { + super.setUp(); + + mFragmentManager = getActivity().getSupportFragmentManager(); + assertNotNull(mFragmentManager); + } + + + public F startFragment(F fragment) { + try { + mFragmentManager.beginTransaction() + .replace(android.R.id.content, fragment) + .commit(); + } catch (Exception e) { + e.printStackTrace(); + } + final CountDownLatch signal = new CountDownLatch(1); + + new Handler(Looper.getMainLooper()).post(new Runnable() { + @Override + public void run() { + mFragmentManager.executePendingTransactions(); + signal.countDown(); + } + }); + try { + signal.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + return (F)(mFragmentManager.findFragmentById(android.R.id.content)); + } + + + protected class TestDialogDisplayedIfFirstTimeFragment extends BookListFragment { + /** + * If the refresh dialog is blank after calling display, it must be showing the warning + * @return Whether the warning dialog is showing + */ + public boolean callDisplayModules(DownloadPrefs prefs) { + // Inject the new preferences... + this.downloadPrefs = prefs; + displayModules(); + return (refreshDialog == null); + } + + public void setArgs(BookCategory c) { + Bundle args = new Bundle(); + args.putString(ARG_BOOK_CATEGORY, c.toString()); + this.setArguments(args); + } + } + + public void testDialogDisplayedIfFirstTime() { + /* + SharedPreferences prefs = getActivity() + .getSharedPreferences("DownloadPrefs", Context.MODE_PRIVATE); + prefs.edit().putBoolean("hasShownDownloadDialog", false); + */ + ((MinimalBible)getActivity().getApplication()).plusObjGraph(BookListFragmentTestModule.class); + TestDialogDisplayedIfFirstTimeFragment f = new TestDialogDisplayedIfFirstTimeFragment(); + f.setArgs(BookCategory.BIBLE); + startFragment(f); + + assertNotNull(f); + assertTrue(f.callDisplayModules(Esperandro.getPreferences(DownloadPrefs.class, getActivity()))); + } +}