diff --git a/app/build.gradle b/app/build.gradle index a28f9ea..b1ea4b1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,6 +11,7 @@ android { versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } testBuildType 'espresso' diff --git a/app/src/androidTest/assets/user.properties b/app/src/androidTest/assets/user.properties index f87b97d..998aea3 100644 --- a/app/src/androidTest/assets/user.properties +++ b/app/src/androidTest/assets/user.properties @@ -1,3 +1,5 @@ -name=Boris -email=borisqa@bayqa.com -password=bayqa12345 \ No newline at end of file +name=Vitaly +email=a@test.com +password=qwerty1 +accountNumber=1234567890 +bankName=Chase \ No newline at end of file diff --git a/app/src/androidTest/java/io/mattcarroll/androidtesting/BaseTest.java b/app/src/androidTest/java/io/mattcarroll/androidtesting/BaseTest.java index e8be5fb..f4464cd 100644 --- a/app/src/androidTest/java/io/mattcarroll/androidtesting/BaseTest.java +++ b/app/src/androidTest/java/io/mattcarroll/androidtesting/BaseTest.java @@ -1,5 +1,6 @@ package io.mattcarroll.androidtesting; + import android.content.res.AssetManager; import android.support.test.InstrumentationRegistry; @@ -8,9 +9,6 @@ import java.io.IOException; import java.util.Properties; -/** - * Created by borisgurtovyy on 9/7/17. - */ public class BaseTest { private Properties properties; @@ -30,5 +28,4 @@ public void baseSetUp() throws IOException { AssetManager.AssetInputStream assetStream = (AssetManager.AssetInputStream) testAssetManager.open("user.properties"); properties.load(assetStream); } - } diff --git a/app/src/androidTest/java/io/mattcarroll/androidtesting/login/EspressoSignInTest.java b/app/src/androidTest/java/io/mattcarroll/androidtesting/login/EspressoSignInTest.java new file mode 100644 index 0000000..4315b87 --- /dev/null +++ b/app/src/androidTest/java/io/mattcarroll/androidtesting/login/EspressoSignInTest.java @@ -0,0 +1,74 @@ +package io.mattcarroll.androidtesting.login; + + +import android.support.test.espresso.matcher.ViewMatchers; +import android.support.test.rule.ActivityTestRule; + +import org.junit.Rule; +import org.junit.Test; + +import io.mattcarroll.androidtesting.BaseTest; +import io.mattcarroll.androidtesting.R; +import io.mattcarroll.androidtesting.SplashActivity; + +import static android.support.test.espresso.Espresso.onView; +import static android.support.test.espresso.action.ViewActions.click; +import static android.support.test.espresso.action.ViewActions.typeText; +import static android.support.test.espresso.assertion.ViewAssertions.matches; +import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; +import static android.support.test.espresso.matcher.ViewMatchers.withId; + +public class EspressoSignInTest extends BaseTest { + + @Rule + public final ActivityTestRule activityRule = + new ActivityTestRule<>(SplashActivity.class, false, true); + + @Test + public void userSignInVerifyNoLinkedAccounts() { + signIn(); + onView(withId(R.id.textview_no_accounts)) + .check(matches(isDisplayed())); + } + + @Test + public void linkBankAccount() { + signIn(); + //user click + sign + clickAddButton(); + //user click Link Account + linkButtonClik(); + //user types in Bank name, Account Number, and Password + linkNewBankAccount(); + //user clicks Link + linkButtonClik(); + } + + private void clickAddButton() { + onView(withId(R.id.fab_manage_accounts)) + .perform(click()); + } + + private void linkButtonClik() { + onView(withId(R.id.button_link_account)) + .perform(click()); + } + + private void linkNewBankAccount() { + onView(withId(R.id.edittext_bank_name)) + .perform(typeText(getProperties().getProperty("bankName"))); + onView(withId(R.id.edittext_account_number)) + .perform(typeText(getProperties().getProperty("accountNumber"))); + onView(withId(R.id.edittext_password)) + .perform(typeText(getProperties().getProperty("password"))); + } + + private void signIn() { + onView(ViewMatchers.withId(R.id.edittext_email)) + .perform(typeText(getProperties().getProperty("email"))); + onView(withId(R.id.edittext_password)) + .perform(typeText(getProperties().getProperty("password"))); + onView(withId(R.id.button_sign_in)) + .perform(click()); + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/io/mattcarroll/androidtesting/signup/EspressoSignUpTest.java b/app/src/androidTest/java/io/mattcarroll/androidtesting/signup/EspressoSignUpTest.java index b56bf1e..7e9a01e 100644 --- a/app/src/androidTest/java/io/mattcarroll/androidtesting/signup/EspressoSignUpTest.java +++ b/app/src/androidTest/java/io/mattcarroll/androidtesting/signup/EspressoSignUpTest.java @@ -5,21 +5,29 @@ import android.support.test.InstrumentationRegistry; import android.support.test.espresso.NoActivityResumedException; import android.support.test.espresso.action.EspressoKey; +import android.support.test.espresso.action.ViewActions; +import android.support.test.espresso.matcher.ViewMatchers; import android.support.test.rule.ActivityTestRule; + import android.support.test.runner.AndroidJUnit4; + import android.util.Log; import org.junit.Before; import org.junit.Rule; import org.junit.Test; + import org.junit.runner.RunWith; import java.util.Properties; + import java.util.Random; import io.mattcarroll.androidtesting.BaseTest; import io.mattcarroll.androidtesting.R; +import io.mattcarroll.androidtesting.signup.SignUpActivity; + import static android.support.test.espresso.Espresso.closeSoftKeyboard; import static android.support.test.espresso.Espresso.onData; import static android.support.test.espresso.Espresso.onView; @@ -30,13 +38,22 @@ import static android.support.test.espresso.action.ViewActions.typeText; import static android.support.test.espresso.assertion.ViewAssertions.matches; import static android.support.test.espresso.matcher.ViewMatchers.hasErrorText; + import static android.support.test.espresso.matcher.ViewMatchers.isChecked; + import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; import static android.support.test.espresso.matcher.ViewMatchers.isNotChecked; import static android.support.test.espresso.matcher.ViewMatchers.withId; import static android.support.test.espresso.matcher.ViewMatchers.withText; import static android.view.KeyEvent.KEYCODE_MINUS; import static junit.framework.Assert.assertTrue; + +import static org.hamcrest.CoreMatchers.allOf; +import static org.hamcrest.CoreMatchers.instanceOf; +import static org.hamcrest.CoreMatchers.is; + +public class EspressoSignUpTest extends BaseTest { + import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.hasEntry; @@ -59,82 +76,110 @@ public void setup() { } private static void scrollToAndTapNext() { - onView(withId(R.id.button_next)).perform( - scrollTo(), - click() - ); + onView(ViewMatchers.withId(R.id.button_next)).perform(scrollTo(), click()); } private static void tapNext() { - onView(withId(R.id.button_next)).perform( - click() - ); + onView(withId(R.id.button_next)).perform(click()); } - private static void pressBackOnActivity() { - // hide keyboard + private void checkFieldHasError(int fieldId, int errorId) { + onView(withId(fieldId)) + .check(matches(hasErrorText(resources.getString(errorId)))); + } + + public static void pressBackOnActivity() { + // hide key board + closeSoftKeyboard(); // press back button pressBack(); } - private static void scrollToAndFill(int fieldId, String textToType){ + private void selectItemByText(String item) { + onView(withText(item)).perform(click()); + } + + private static void scrollToItem(String item) { + onData(allOf(is(instanceOf(String.class)), is(item))).perform(scrollTo()); + } + + private void fillInPersonalInfo( + String name, String lastName, String address, String city, String state, String zipCode + ) { + scrollToAndFill(R.id.edittext_first_name, name); + scrollToAndFill(R.id.edittext_last_name, lastName); + scrollToAndFill(R.id.edittext_address_line_1, address); + scrollToAndFill(R.id.edittext_address_city, city); + scrollToAndFill(R.id.edittext_address_state, state); + scrollToAndFill(R.id.edittext_address_zip, zipCode); + } + + public void checkIfItemSelected(String item) { + onView(withText(item)).check(matches(isNotChecked())); + } + + public void fillInCredentials(String email, String password) { + scrollToAndFill(R.id.autocompletetextview_email, email); + scrollToAndFill(R.id.edittext_password, password); + } + + public static void clickSignUp() { + onView(withId(R.id.button_next)).perform(click()); + } + + public void checkSuccessfulPopUp() { + onView(withId(R.id.alertTitle)).check(matches(allOf(withText("Signup successful!"), isDisplayed()))); + } + + private static void scrollToAndFill(int fieldId, String textToType) { EspressoKey underscore = new EspressoKey.Builder() .withShiftPressed(true) .withKeyCode(KEYCODE_MINUS) .build(); - onView(withId(fieldId)).perform( - scrollTo(), - pressKey(underscore), - typeText(textToType) - ); + onView(withId(fieldId)) + .perform(scrollTo(), +// pressKey(underscore), + typeText(textToType)); } @Test - public void userSignUpVerifyBackWorksOnEachPage() { - // Fill in personal info - scrollToAndFill(R.id.edittext_first_name, "Boris"); - scrollToAndFill(R.id.edittext_last_name, "Gurtovoy"); - scrollToAndFill(R.id.edittext_address_line_1, "my adress 666"); - scrollToAndFill(R.id.edittext_address_city, "Los Angeles"); - scrollToAndFill(R.id.edittext_address_state, "CA"); - scrollToAndFill(R.id.edittext_address_zip, "90007"); + public void userSignUpVerifyBackButtonWorksOnEachPage() { + // fill in personal info + fillInPersonalInfo( + "TestName", "TestLastName", "TestAddress", "TestCity", "TestState", "12345" + ); scrollToAndTapNext(); - - // Select interest - onView(withText("Chess")) - .perform(click()); + // select interest + onView(withText("Chess")).perform(click()); // tap next button tapNext(); - // first press of back button + // first press back button pressBackOnActivity(); - onView(withText("Basketball")) - .check(matches(isDisplayed())); + onView(withText("Basketball")).check(matches(isDisplayed())); //second press of back button pressBackOnActivity(); - onView(withId(R.id.edittext_first_name)) - .check(matches(isDisplayed())); + onView(withId(R.id.edittext_first_name)).check(matches(isDisplayed())); - boolean activityFinished = false; + boolean activityFinish = false; try { pressBackOnActivity(); - } catch (NoActivityResumedException e){ - activityFinished = true; + } catch (NoActivityResumedException e) { + activityFinish = true; } - assertTrue(activityFinished); + assertTrue(activityFinish); + } @Test public void userSignUpPersonalInfoVerifyRequiredFieldsAreRequired() { - // Verify required fields show errors and non-required fields do not. scrollToAndTapNext(); - checkFieldHasError(R.id.edittext_first_name, R.string.input_error_required); checkFieldHasError(R.id.edittext_last_name, R.string.input_error_required); checkFieldHasError(R.id.edittext_address_line_1, R.string.input_error_required); @@ -143,99 +188,40 @@ public void userSignUpPersonalInfoVerifyRequiredFieldsAreRequired() { checkFieldHasError(R.id.edittext_address_zip, R.string.input_error_required); } - private void checkFieldHasError(int fieldId, int errorId){ - onView(withId(fieldId)) - .check(matches(hasErrorText(resources.getString(errorId)))); - } - - - /*HOMEWORK*/ - - - - private void verifyViewIsChecked(String viewName) { - onView(withText(viewName)) - .check(matches(isChecked())); - } - - - private void verifyViewIsNotChecked(String viewName) { - onView(withText(viewName)) - .check(matches(isNotChecked())); - } - - - private static void clickViewOnTheListView(String viewName) { - onData(hasToString(viewName)) - .perform(click()); - } - - private static void scrollToViewOnTheListView(String viewName) { - onData(hasToString(viewName)) - .perform(scrollTo()); - } - - @Test - public void userChecksAstronomy() { - - // filling - scrollToAndFill(R.id.edittext_first_name, "Boris"); - scrollToAndFill(R.id.edittext_last_name, "Gurtovoy"); - scrollToAndFill(R.id.edittext_address_line_1, "Some adress"); - scrollToAndFill(R.id.edittext_address_city, "Los Angeles"); - scrollToAndFill(R.id.edittext_address_state, "CA"); - scrollToAndFill(R.id.edittext_address_zip, "90007"); - - // scroll and press next + public void userSignUpPositiveTest() { + fillInPersonalInfo( + "Vitaly", "W", "460E 5th Avenue", "New York", "NY", "10012" + ); scrollToAndTapNext(); - - //click Astronomy - clickViewOnTheListView("Astronomy"); - - // check it is checked - verifyViewIsChecked("Astronomy"); - - // click next button without scrolling + scrollToItem("Astronomy"); + selectItemByText("Astronomy"); tapNext(); - - // pressing back button pressBackOnActivity(); - - scrollToViewOnTheListView("Astronomy"); - - // check it is NOT checked - verifyViewIsNotChecked("Astronomy"); - - //click Astronomy - clickViewOnTheListView("Astronomy"); - - // click next button without scrolling + scrollToItem("Astronomy"); + checkIfItemSelected("Astronomy"); + selectItemByText("Astronomy"); tapNext(); - - //fill email - scrollToAndFill(R.id.autocompletetextview_email, getProperties().getProperty("email")); - - //fill pass + //fill in credentials String password = generateRandomPassword(10); - Log.d("info", password); - scrollToAndFill(R.id.edittext_password, getProperties().getProperty("password")); - - //click sign up button - tapNext(); - + Log.d("Info", password); + fillInCredentials(getProperties().getProperty("email"), getProperties().getProperty("password")); + //click sign up + clickSignUp(); + // verify the pop up +// checkSuccessfulPopUp(); } - String generateRandomPassword(int length){ - String base = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; + String generateRandomPassword(int length) { + String base = "ABCDEFG1234567890"; StringBuilder res = new StringBuilder(); Random rand = new Random(); - while(length>0) { + while (length>0) { int index = rand.nextInt(base.length()); res.append(base.charAt(index)); length--; } return res.toString(); } +} -} \ No newline at end of file