From 59c899f94fb1e271c4c19804be5c223e8a34cbd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bernat=20Borr=C3=A1s=20Paronella?= Date: Wed, 10 Mar 2021 09:39:00 +0100 Subject: [PATCH] Add assertNoError method side of assertError methods (#385) * Add NoError asserts * Add failure cases * Update readme * Remove text param * Rename methods * Update readme * Rollback old errors, redirwect to new ones --- README.md | 7 ++- .../assertion/BaristaErrorAssertions.kt | 59 +++++++++++++++++-- .../barista/sample/HintAndErrorTest.java | 49 ++++++++++++--- .../barista/sample/HintAndErrorActivity.java | 6 +- .../res/layout/activity_hintanderrortext.xml | 7 +++ 5 files changed, 110 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 65fced83a..c89738c4f 100644 --- a/README.md +++ b/README.md @@ -273,8 +273,11 @@ assertHint(R.id.edittext, "Hint"); #### Check TextInputLayout and EditText's errors ```java -assertError(R.id.edittext, R.string.error); -assertError(R.id.edittext, "Error message"); +assertErrorDisplayed(R.id.edittext, R.string.error); +assertErrorDisplayed(R.id.edittext, "Error message"); + +assertNoErrorDisplayed(R.id.edittext, R.string.error); +assertNoErrorDisplayed(R.id.edittext, "Error message"); ``` #### Check TextInputLayout's assistive helper text diff --git a/library/src/main/java/com/schibsted/spain/barista/assertion/BaristaErrorAssertions.kt b/library/src/main/java/com/schibsted/spain/barista/assertion/BaristaErrorAssertions.kt index 0a18907c3..84d48e1b8 100644 --- a/library/src/main/java/com/schibsted/spain/barista/assertion/BaristaErrorAssertions.kt +++ b/library/src/main/java/com/schibsted/spain/barista/assertion/BaristaErrorAssertions.kt @@ -1,13 +1,13 @@ package com.schibsted.spain.barista.assertion import android.content.Context -import androidx.annotation.IdRes -import androidx.annotation.StringRes -import com.google.android.material.textfield.TextInputLayout -import androidx.test.espresso.matcher.ViewMatchers import android.view.View import android.widget.TextView +import androidx.annotation.IdRes +import androidx.annotation.StringRes import androidx.test.core.app.ApplicationProvider +import androidx.test.espresso.matcher.ViewMatchers +import com.google.android.material.textfield.TextInputLayout import com.schibsted.spain.barista.internal.assertAny import org.hamcrest.Description import org.hamcrest.Matcher @@ -15,17 +15,46 @@ import org.hamcrest.TypeSafeMatcher object BaristaErrorAssertions { + @Deprecated( + message = "Use assertErrorDisplayed(id, text)", + replaceWith = ReplaceWith( + "assertErrorDisplayed(viewId, text)", + "com.schibsted.spain.barista.assertion.BaristaErrorAssertions.assertErrorDisplayed" + ) + ) @JvmStatic fun assertError(@IdRes viewId: Int, @StringRes text: Int) { - val resourceString = ApplicationProvider.getApplicationContext().resources.getString(text) - assertError(viewId, resourceString) + assertErrorDisplayed(viewId, text) } + @Deprecated( + message = "Use assertErrorDisplayed(id, text)", + replaceWith = ReplaceWith( + "assertErrorDisplayed(viewId, text)", + "com.schibsted.spain.barista.assertion.BaristaErrorAssertions.assertErrorDisplayed" + ) + ) @JvmStatic fun assertError(@IdRes viewId: Int, text: String) { + assertErrorDisplayed(viewId, text) + } + + @JvmStatic + fun assertErrorDisplayed(@IdRes viewId: Int, @StringRes text: Int) { + val resourceString = ApplicationProvider.getApplicationContext().resources.getString(text) + assertErrorDisplayed(viewId, resourceString) + } + + @JvmStatic + fun assertErrorDisplayed(@IdRes viewId: Int, text: String) { ViewMatchers.withId(viewId).assertAny(matchError(text)) } + @JvmStatic + fun assertNoErrorDisplayed(@IdRes viewId: Int) { + ViewMatchers.withId(viewId).assertAny(matchNoError()) + } + private fun matchError(expectedError: String): Matcher { return object : TypeSafeMatcher() { override fun describeTo(description: Description) { @@ -43,4 +72,22 @@ object BaristaErrorAssertions { } } } + + private fun matchNoError(): Matcher { + return object : TypeSafeMatcher() { + override fun describeTo(description: Description) { + description.appendText("without error") + } + + override fun matchesSafely(item: View): Boolean { + return when (item) { + is TextView -> item.error.isNullOrEmpty() + is TextInputLayout -> item.error.isNullOrEmpty() + else -> { + throw UnsupportedOperationException("View of class ${item.javaClass.simpleName} not supported") + } + } + } + } + } } \ No newline at end of file diff --git a/sample/src/androidTest/java/com/schibsted/spain/barista/sample/HintAndErrorTest.java b/sample/src/androidTest/java/com/schibsted/spain/barista/sample/HintAndErrorTest.java index fda84732e..0304d2989 100644 --- a/sample/src/androidTest/java/com/schibsted/spain/barista/sample/HintAndErrorTest.java +++ b/sample/src/androidTest/java/com/schibsted/spain/barista/sample/HintAndErrorTest.java @@ -2,12 +2,15 @@ import androidx.test.rule.ActivityTestRule; import androidx.test.runner.AndroidJUnit4; +import com.schibsted.spain.barista.internal.failurehandler.BaristaException; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import static com.schibsted.spain.barista.assertion.BaristaErrorAssertions.assertError; +import static com.schibsted.spain.barista.assertion.BaristaErrorAssertions.assertErrorDisplayed; +import static com.schibsted.spain.barista.assertion.BaristaErrorAssertions.assertNoErrorDisplayed; import static com.schibsted.spain.barista.assertion.BaristaHintAssertions.assertHint; +import static com.schibsted.spain.barista.interaction.BaristaClickInteractions.clickOn; @RunWith(AndroidJUnit4.class) public class HintAndErrorTest { @@ -31,15 +34,47 @@ public void assertHintByResource() { @Test public void assertErrorByString() { - assertError(R.id.hintanderror_inputlayout, "TextInputLayout error"); - assertError(R.id.hintanderror_inputedittext, "TextInputEditText error"); - assertError(R.id.hintanderror_edittext, "EditText error"); + clickOn(R.id.showErrors); + assertErrorDisplayed(R.id.hintanderror_inputlayout, "TextInputLayout error"); + assertErrorDisplayed(R.id.hintanderror_inputlayout, "TextInputLayout error"); + assertErrorDisplayed(R.id.hintanderror_inputedittext, "TextInputEditText error"); + assertErrorDisplayed(R.id.hintanderror_edittext, "EditText error"); } @Test public void assertErrorByResource() { - assertError(R.id.hintanderror_inputlayout, R.string.hintanderror_inputlayout_error); - assertError(R.id.hintanderror_inputedittext, R.string.hintanderror_inputedittext_error); - assertError(R.id.hintanderror_edittext, R.string.hintanderror_edittext_error); + clickOn(R.id.showErrors); + assertErrorDisplayed(R.id.hintanderror_inputlayout, R.string.hintanderror_inputlayout_error); + assertErrorDisplayed(R.id.hintanderror_inputedittext, R.string.hintanderror_inputedittext_error); + assertErrorDisplayed(R.id.hintanderror_edittext, R.string.hintanderror_edittext_error); + } + + @Test(expected = BaristaException.class) + public void assertErrorByStringFails() { + assertErrorDisplayed(R.id.hintanderror_inputlayout, "TextInputLayout error"); + assertErrorDisplayed(R.id.hintanderror_inputedittext, "TextInputEditText error"); + assertErrorDisplayed(R.id.hintanderror_edittext, "EditText error"); + } + + @Test(expected = BaristaException.class) + public void assertErrorByResourceFails() { + assertErrorDisplayed(R.id.hintanderror_inputlayout, R.string.hintanderror_inputlayout_error); + assertErrorDisplayed(R.id.hintanderror_inputedittext, R.string.hintanderror_inputedittext_error); + assertErrorDisplayed(R.id.hintanderror_edittext, R.string.hintanderror_edittext_error); + } + + @Test + public void assertNoErrorByResource() { + assertNoErrorDisplayed(R.id.hintanderror_inputlayout); + assertNoErrorDisplayed(R.id.hintanderror_inputedittext); + assertNoErrorDisplayed(R.id.hintanderror_edittext); + } + + @Test(expected = BaristaException.class) + public void assertNoErrorByResourceFails() { + clickOn(R.id.showErrors); + assertNoErrorDisplayed(R.id.hintanderror_inputlayout); + assertNoErrorDisplayed(R.id.hintanderror_inputedittext); + assertNoErrorDisplayed(R.id.hintanderror_edittext); } } diff --git a/sample/src/main/java/com/schibsted/spain/barista/sample/HintAndErrorActivity.java b/sample/src/main/java/com/schibsted/spain/barista/sample/HintAndErrorActivity.java index b9c2be06b..f5109b751 100644 --- a/sample/src/main/java/com/schibsted/spain/barista/sample/HintAndErrorActivity.java +++ b/sample/src/main/java/com/schibsted/spain/barista/sample/HintAndErrorActivity.java @@ -1,11 +1,11 @@ package com.schibsted.spain.barista.sample; import android.os.Bundle; +import android.widget.EditText; import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; import com.google.android.material.textfield.TextInputEditText; import com.google.android.material.textfield.TextInputLayout; -import androidx.appcompat.app.AppCompatActivity; -import android.widget.EditText; public class HintAndErrorActivity extends AppCompatActivity { @Override @@ -13,7 +13,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_hintanderrortext); - showError(); + findViewById(R.id.showErrors).setOnClickListener(v -> showError()); } private void showError() { diff --git a/sample/src/main/res/layout/activity_hintanderrortext.xml b/sample/src/main/res/layout/activity_hintanderrortext.xml index f3d69934e..77ce0ab19 100644 --- a/sample/src/main/res/layout/activity_hintanderrortext.xml +++ b/sample/src/main/res/layout/activity_hintanderrortext.xml @@ -7,6 +7,13 @@ android:padding="16dp" > + +