From 77907b1dd531d3425db94604e2f4298ad42759f3 Mon Sep 17 00:00:00 2001 From: Joaquim Ley Date: Sun, 8 Apr 2018 18:30:54 +0200 Subject: [PATCH] Create tests related to the Favorite creation - AlertDialog shown on Fab pressed - AlertDialog is dismissed when Discard pressed - AlertDialog shows error when user doesn't input the required BusStop code - AlertDialog hides error when user starts typing BusStop code No styling on the views, just basic UI implementation. For #29 --- .../home/FavoritesFragmentTest.kt | 38 +++++++++++++--- .../home/favorite/FavoritesFragment.kt | 43 +++++++++++++------ .../res/layout/dialog_create_favorite.xml | 3 +- .../main/res/layout/fragment_favourites.xml | 1 + 4 files changed, 66 insertions(+), 19 deletions(-) diff --git a/transport-eta-android/mobile-ui/src/androidTest/java/com/joaquimley/transporteta/home/FavoritesFragmentTest.kt b/transport-eta-android/mobile-ui/src/androidTest/java/com/joaquimley/transporteta/home/FavoritesFragmentTest.kt index db7c3db..404d211 100644 --- a/transport-eta-android/mobile-ui/src/androidTest/java/com/joaquimley/transporteta/home/FavoritesFragmentTest.kt +++ b/transport-eta-android/mobile-ui/src/androidTest/java/com/joaquimley/transporteta/home/FavoritesFragmentTest.kt @@ -1,15 +1,17 @@ package com.joaquimley.transporteta.home import android.support.test.espresso.Espresso.onView -import android.support.test.espresso.action.ViewActions.clearText -import android.support.test.espresso.action.ViewActions.click +import android.support.test.espresso.action.ViewActions.* +import android.support.test.espresso.assertion.ViewAssertions.doesNotExist import android.support.test.espresso.assertion.ViewAssertions.matches import android.support.test.espresso.matcher.ViewMatchers.* import android.support.test.filters.MediumTest import android.support.test.rule.ActivityTestRule import android.support.test.runner.AndroidJUnit4 import com.joaquimley.transporteta.R +import com.joaquimley.transporteta.home.favorite.FavoritesFragment import org.hamcrest.CoreMatchers.not +import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -20,6 +22,12 @@ import org.junit.runner.RunWith class FavoritesFragmentTest { @get:Rule val activityRule = ActivityTestRule(HomeActivity::class.java) + lateinit var favoritesFragment: FavoritesFragment + + @Before + fun setup() { + favoritesFragment = activityRule.activity.supportFragmentManager.fragments[0] as FavoritesFragment + } @Test fun fabIsShown() { @@ -28,7 +36,10 @@ class FavoritesFragmentTest { @Test fun whenFabIsClickedCreateFavoriteScreenIsShown() { + // When onView(withId(R.id.fab)).perform(click()) + + // Check dialog is showing onView(withText("Create favorite")).check(matches(isDisplayed())) onView(withId(R.id.favorite_code_edit_text)).check(matches(isDisplayed())) onView(withId(R.id.favorite_title_edit_text)).check(matches(isDisplayed())) @@ -38,19 +49,36 @@ class FavoritesFragmentTest { @Test fun inCreateFavoriteDialogWhenUserClicksDiscardDialogIsDismissed() { - onView(withId(R.id.fab)).perform(click()) onView(withText("Discard")).perform(click()) - onView(withText("Create favorite")).check(matches(not(isDisplayed()))) + onView(withText("Create favorite")).check(doesNotExist()) } @Test fun inCreateFavoriteDialogWhenUserClicksCreateWithNoCodeErrorMessageIsShown() { - onView(withId(R.id.fab)).perform(click()) + onView(withId(R.id.favorite_code_edit_text)).perform(clearText()) onView(withText("Create")).perform(click()) + // Dialog is not dismissed + onView(withText("Create favorite")).check(matches(isDisplayed())) + + // Error message is shown onView(withText("Please input bus stop code")).check(matches(isDisplayed())) } + @Test + fun inCreateFavoriteDialogWhenUserStarsTypingCodeErrorMessageShouldHide() { + // Show error message + onView(withId(R.id.fab)).perform(click()) + onView(withId(R.id.favorite_code_edit_text)).perform(clearText()) + onView(withText("Create")).perform(click()) + + // Start typing + onView(withId(R.id.favorite_code_edit_text)).perform(typeText("1337")) + + // Error message is hidden + onView(withText("Please input bus stop code")).check(doesNotExist()) + } + } \ No newline at end of file diff --git a/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/home/favorite/FavoritesFragment.kt b/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/home/favorite/FavoritesFragment.kt index ab0788f..916a281 100644 --- a/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/home/favorite/FavoritesFragment.kt +++ b/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/home/favorite/FavoritesFragment.kt @@ -13,7 +13,9 @@ import android.support.v7.app.AlertDialog import android.support.v7.app.AppCompatActivity import android.support.v7.widget.LinearLayoutManager import android.support.v7.widget.RecyclerView +import android.text.Editable import android.text.TextUtils +import android.text.TextWatcher import android.util.Log import android.view.LayoutInflater import android.view.View @@ -62,31 +64,48 @@ class FavoritesFragment : Fragment() { } private fun showAddFavoriteDialog() { - val currentContext = context - if (currentContext != null) { - val builder = AlertDialog.Builder(currentContext) + if (activity != null) { + val builder = AlertDialog.Builder(activity!!) builder.setTitle(R.string.create_favorite_title) builder.setView(R.layout.dialog_create_favorite) + builder.setPositiveButton(getString(R.string.action_create), null) + builder.setNegativeButton(getString(R.string.action_discard), null) val dialog = builder.create() + + dialog.show() val busStopCodeInputLayout: TextInputLayout? = dialog.findViewById(R.id.favorite_code_text_input_layout) - val busStopCodeEditText: TextInputEditText? = dialog.findViewById(R.id.favorite_code_edit_text) val busStopTitleEditText: TextInputEditText? = dialog.findViewById(R.id.favorite_title_edit_text) + val busStopCodeEditText: TextInputEditText? = dialog.findViewById(R.id.favorite_code_edit_text) + busStopCodeEditText?.addTextChangedListener(object: TextWatcher{ + override fun afterTextChanged(s: Editable?) { + if(!TextUtils.isEmpty(s)) { + busStopCodeInputLayout?.error = null + } + } + + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { + // TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + // TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + + }) - dialog.setButton(AlertDialog.BUTTON_POSITIVE, getString(R.string.action_create)) { dialog, which -> - if(TextUtils.isEmpty(busStopCodeEditText?.text)) { + dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { + if (TextUtils.isEmpty(busStopCodeEditText?.text)) { busStopCodeInputLayout?.error = "Please input bus stop code" } } - dialog.setButton(AlertDialog.BUTTON_NEGATIVE, getString(R.string.action_discard)) { dialog, which -> - // track discard action + context?.let { ContextCompat.getColor(it, R.color.colorLightGrey) }?.let { dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(it) } + dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener { + dialog.dismiss() } - dialog.show() - dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(ContextCompat.getColor(currentContext, R.color.colorLightGrey)) - - } } diff --git a/transport-eta-android/mobile-ui/src/main/res/layout/dialog_create_favorite.xml b/transport-eta-android/mobile-ui/src/main/res/layout/dialog_create_favorite.xml index 4224a18..2b209fc 100644 --- a/transport-eta-android/mobile-ui/src/main/res/layout/dialog_create_favorite.xml +++ b/transport-eta-android/mobile-ui/src/main/res/layout/dialog_create_favorite.xml @@ -2,7 +2,6 @@ @@ -33,7 +32,7 @@ android:layout_marginStart="8dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/textInputLayout"> + app:layout_constraintTop_toBottomOf="@+id/favorite_code_text_input_layout">