diff options
Diffstat (limited to 'app/src/androidTest/java/de/test/antennapod/EspressoTestUtils.java')
-rw-r--r-- | app/src/androidTest/java/de/test/antennapod/EspressoTestUtils.java | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/app/src/androidTest/java/de/test/antennapod/EspressoTestUtils.java b/app/src/androidTest/java/de/test/antennapod/EspressoTestUtils.java new file mode 100644 index 000000000..50109c71a --- /dev/null +++ b/app/src/androidTest/java/de/test/antennapod/EspressoTestUtils.java @@ -0,0 +1,102 @@ +package de.test.antennapod; + +import android.content.Context; +import android.support.annotation.StringRes; +import android.support.test.InstrumentationRegistry; +import android.support.test.espresso.PerformException; +import android.support.test.espresso.UiController; +import android.support.test.espresso.ViewAction; +import android.support.test.espresso.contrib.DrawerActions; +import android.support.test.espresso.contrib.RecyclerViewActions; +import android.support.test.espresso.util.HumanReadables; +import android.support.test.espresso.util.TreeIterables; +import android.view.View; +import de.danoeh.antennapod.R; +import org.hamcrest.Matcher; + +import java.io.File; +import java.util.concurrent.TimeoutException; + +import static android.support.test.espresso.Espresso.onView; +import static android.support.test.espresso.action.ViewActions.click; +import static android.support.test.espresso.matcher.ViewMatchers.hasDescendant; +import static android.support.test.espresso.matcher.ViewMatchers.isRoot; +import static android.support.test.espresso.matcher.ViewMatchers.withId; +import static android.support.test.espresso.matcher.ViewMatchers.withText; + +public class EspressoTestUtils { + /** + * Perform action of waiting for a specific view id. + * https://stackoverflow.com/a/49814995/ + * @param viewMatcher The view to wait for. + * @param millis The timeout of until when to wait for. + */ + public static ViewAction waitForView(final Matcher<View> viewMatcher, final long millis) { + return new ViewAction() { + @Override + public Matcher<View> getConstraints() { + return isRoot(); + } + + @Override + public String getDescription() { + return "wait for a specific view for" + millis + " millis."; + } + + @Override + public void perform(final UiController uiController, final View view) { + uiController.loopMainThreadUntilIdle(); + final long startTime = System.currentTimeMillis(); + final long endTime = startTime + millis; + + do { + for (View child : TreeIterables.breadthFirstViewTraversal(view)) { + // found view with required ID + if (viewMatcher.matches(child)) { + return; + } + } + + uiController.loopMainThreadForAtLeast(50); + } + while (System.currentTimeMillis() < endTime); + + // timeout happens + throw new PerformException.Builder() + .withActionDescription(this.getDescription()) + .withViewDescription(HumanReadables.describe(view)) + .withCause(new TimeoutException()) + .build(); + } + }; + } + + /** + * Clear all app databases + */ + public static void clearAppData() { + File root = InstrumentationRegistry.getTargetContext().getFilesDir().getParentFile(); + String[] sharedPreferencesFileNames = new File(root, "shared_prefs").list(); + for (String fileName : sharedPreferencesFileNames) { + System.out.println("Cleared database: " + fileName); + InstrumentationRegistry.getTargetContext(). + getSharedPreferences(fileName.replace(".xml", ""), Context.MODE_PRIVATE).edit().clear().commit(); + } + } + + public static void clickPreference(@StringRes int title) { + onView(withId(R.id.list)).perform( + RecyclerViewActions.actionOnItem(hasDescendant(withText(title)), + click())); + } + + public static void openNavDrawer() { + onView(isRoot()).perform(waitForView(withId(R.id.drawer_layout), 1000)); + onView(withId(R.id.drawer_layout)).perform(DrawerActions.open()); + } + + public static void closeNavDrawer() { + onView(isRoot()).perform(waitForView(withId(R.id.drawer_layout), 1000)); + onView(withId(R.id.drawer_layout)).perform(DrawerActions.close()); + } +} |