Implement UI tests for import/export and help

pull/77/merge
Alinson S. Xavier 10 years ago
parent 790beb185a
commit 62df660079

@ -1,6 +1,28 @@
/*
* Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
*
* This file is part of Loop Habit Tracker.
*
* Loop Habit Tracker is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* Loop Habit Tracker is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.isoron.uhabits.ui; package org.isoron.uhabits.ui;
import android.app.Activity;
import android.app.Instrumentation;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.support.test.InstrumentationRegistry; import android.support.test.InstrumentationRegistry;
import android.support.test.espresso.NoMatchingViewException; import android.support.test.espresso.NoMatchingViewException;
import android.support.test.espresso.intent.rule.IntentsTestRule; import android.support.test.espresso.intent.rule.IntentsTestRule;
@ -9,6 +31,7 @@ import android.test.suitebuilder.annotation.LargeTest;
import org.isoron.uhabits.MainActivity; import org.isoron.uhabits.MainActivity;
import org.isoron.uhabits.R; import org.isoron.uhabits.R;
import org.isoron.uhabits.helpers.DateHelper;
import org.isoron.uhabits.models.Habit; import org.isoron.uhabits.models.Habit;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
@ -31,15 +54,22 @@ import static android.support.test.espresso.action.ViewActions.swipeLeft;
import static android.support.test.espresso.action.ViewActions.swipeRight; import static android.support.test.espresso.action.ViewActions.swipeRight;
import static android.support.test.espresso.action.ViewActions.swipeUp; import static android.support.test.espresso.action.ViewActions.swipeUp;
import static android.support.test.espresso.assertion.ViewAssertions.matches; import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.intent.Intents.intended;
import static android.support.test.espresso.intent.Intents.intending;
import static android.support.test.espresso.intent.matcher.IntentMatchers.hasAction;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.isRoot; import static android.support.test.espresso.matcher.ViewMatchers.isRoot;
import static android.support.test.espresso.matcher.ViewMatchers.withClassName; import static android.support.test.espresso.matcher.ViewMatchers.withClassName;
import static android.support.test.espresso.matcher.ViewMatchers.withId; import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText; import static android.support.test.espresso.matcher.ViewMatchers.withText;
import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.endsWith; import static org.hamcrest.Matchers.endsWith;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.instanceOf;
import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.startsWith;
import static org.hamcrest.core.AnyOf.anyOf;
import static org.isoron.uhabits.ui.HabitMatchers.withName; import static org.isoron.uhabits.ui.HabitMatchers.withName;
import static org.isoron.uhabits.ui.HabitViewActions.clickAtRandomLocations; import static org.isoron.uhabits.ui.HabitViewActions.clickAtRandomLocations;
import static org.isoron.uhabits.ui.HabitViewActions.toggleAllCheckmarks; import static org.isoron.uhabits.ui.HabitViewActions.toggleAllCheckmarks;
@ -65,6 +95,8 @@ public class MainTest
public IntentsTestRule<MainActivity> activityRule = new IntentsTestRule<>( public IntentsTestRule<MainActivity> activityRule = new IntentsTestRule<>(
MainActivity.class); MainActivity.class);
private Context targetContext;
@Before @Before
public void setup() public void setup()
{ {
@ -74,6 +106,14 @@ public class MainTest
sys.acquireWakeLock(); sys.acquireWakeLock();
sys.unlockScreen(); sys.unlockScreen();
targetContext = InstrumentationRegistry.getTargetContext();
Instrumentation.ActivityResult okResult = new Instrumentation.ActivityResult(
Activity.RESULT_OK, new Intent());
intending(hasAction(equalTo(Intent.ACTION_SEND))).respondWith(okResult);
intending(hasAction(equalTo(Intent.ACTION_VIEW))).respondWith(okResult);
skipTutorial(); skipTutorial();
} }
@ -97,11 +137,14 @@ public class MainTest
} }
} }
/**
* User opens the app, creates some habits, selects them, archives them, select 'show archived'
* on the menu, selects the previously archived habits and then deletes them.
*/
@Test @Test
public void testArchiveHabits() public void testArchiveHabits()
{ {
List<String> names = new LinkedList<>(); List<String> names = new LinkedList<>();
Context context = InstrumentationRegistry.getTargetContext();
for(int i = 0; i < 3; i++) for(int i = 0; i < 3; i++)
names.add(addHabit()); names.add(addHabit());
@ -111,7 +154,7 @@ public class MainTest
clickActionModeMenuItem(R.string.archive); clickActionModeMenuItem(R.string.archive);
assertHabitsDontExist(names); assertHabitsDontExist(names);
openActionBarOverflowOrOptionsMenu(context); openActionBarOverflowOrOptionsMenu(targetContext);
onView(withText(R.string.show_archived)) onView(withText(R.string.show_archived))
.perform(click()); .perform(click());
@ -119,7 +162,7 @@ public class MainTest
selectHabits(names); selectHabits(names);
clickActionModeMenuItem(R.string.unarchive); clickActionModeMenuItem(R.string.unarchive);
openActionBarOverflowOrOptionsMenu(context); openActionBarOverflowOrOptionsMenu(targetContext);
onView(withText(R.string.show_archived)) onView(withText(R.string.show_archived))
.perform(click()); .perform(click());
@ -127,6 +170,10 @@ public class MainTest
deleteHabits(names); deleteHabits(names);
} }
/**
* User opens the app, clicks the add button, types some bogus information, tries to save,
* dialog displays an error.
*/
@Test @Test
public void testAddInvalidHabit() public void testAddInvalidHabit()
{ {
@ -139,6 +186,10 @@ public class MainTest
onView(withId(R.id.input_name)).check(matches(isDisplayed())); onView(withId(R.id.input_name)).check(matches(isDisplayed()));
} }
/**
* User creates a habit, toggles a bunch of checkmarks, clicks the habit to open the statistics
* screen, scrolls down to some views, then scrolls the views backwards and forwards in time.
*/
@Test @Test
public void testAddHabitAndViewStats() throws InterruptedException public void testAddHabitAndViewStats() throws InterruptedException
{ {
@ -161,6 +212,11 @@ public class MainTest
.perform(scrollTo(), swipeRight()); .perform(scrollTo(), swipeRight());
} }
/**
* User creates a habit, selects the habit, clicks edit button, changes some information about
* the habit, click save button, sees changes on the main window, selects habit again,
* changes color, then deletes the habit.
*/
@Test @Test
public void testEditHabit() public void testEditHabit()
{ {
@ -187,6 +243,10 @@ public class MainTest
deleteHabit(modifiedName); deleteHabit(modifiedName);
} }
/**
* User creates a habit, opens statistics page, clicks button to edit history, adds some
* checkmarks, closes dialog, sees the modified history calendar.
*/
@Test @Test
public void testEditHistory() public void testEditHistory()
{ {
@ -205,20 +265,82 @@ public class MainTest
.perform(scrollTo(), swipeRight(), swipeLeft()); .perform(scrollTo(), swipeRight(), swipeLeft());
} }
/**
* User opens menu, clicks settings, sees settings screen.
*/
@Test @Test
public void testSettings() public void testSettings()
{ {
Context context = InstrumentationRegistry.getContext(); openActionBarOverflowOrOptionsMenu(targetContext);
openActionBarOverflowOrOptionsMenu(context);
onView(withText(R.string.settings)).perform(click()); onView(withText(R.string.settings)).perform(click());
} }
/**
* User opens menu, clicks about, sees about screen.
*/
@Test @Test
public void testAbout() public void testAbout()
{ {
Context context = InstrumentationRegistry.getContext(); openActionBarOverflowOrOptionsMenu(targetContext);
openActionBarOverflowOrOptionsMenu(context);
onView(withText(R.string.about)).perform(click()); onView(withText(R.string.about)).perform(click());
onView(isRoot()).perform(swipeUp()); onView(isRoot()).perform(swipeUp());
} }
/**
* User opens menu, clicks Help, sees website.
*/
@Test
public void testHelp()
{
openActionBarOverflowOrOptionsMenu(targetContext);
onView(withText(R.string.help)).perform(click());
intended(hasAction(Intent.ACTION_VIEW));
}
/**
* User creates a habit, exports full backup, deletes the habit, restores backup, sees that the
* previously created habit has appeared back.
*/
@Test
public void testExportImportDB()
{
String name = addHabit();
openActionBarOverflowOrOptionsMenu(targetContext);
onView(withText(R.string.settings)).perform(click());
String date = DateHelper.getBackupDateFormat().format(DateHelper.getLocalTime());
date = date.substring(0, date.length() - 2);
onView(withText(R.string.export_full_backup)).perform(click());
intended(hasAction(Intent.ACTION_SEND));
deleteHabit(name);
openActionBarOverflowOrOptionsMenu(targetContext);
onView(withText(R.string.settings)).perform(click());
onView(withText(R.string.import_data)).perform(click());
onData(allOf(is(instanceOf(String.class)), startsWith("Backups")))
.perform(click());
onData(allOf(is(instanceOf(String.class)), containsString(date)))
.perform(click());
selectHabit(name);
}
/**
* User creates a habit, opens settings, clicks export as CSV, is asked what activity should
* handle the file.
*/
@Test
public void testExportCSV()
{
addHabit();
openActionBarOverflowOrOptionsMenu(targetContext);
onView(withText(R.string.settings)).perform(click());
onView(withText(R.string.export_to_csv)).perform(click());
intended(hasAction(Intent.ACTION_SEND));
}
} }

@ -142,6 +142,15 @@ public class MainActivity extends ReplayableActivity
return true; return true;
} }
case R.id.action_faq:
{
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(getString(R.string.helpURL)));
startActivity(intent);
return true;
}
default: default:
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }

@ -230,15 +230,6 @@ public class ListHabitsFragment extends Fragment
return true; return true;
} }
case R.id.action_faq:
{
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(getString(R.string.helpURL)));
startActivity(intent);
return true;
}
default: default:
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }

Loading…
Cancel
Save