Skip to content

Commit

Permalink
use waitUntilDisplayed for constantly flaky test (#2138)
Browse files Browse the repository at this point in the history
* use waitUntilDisplayed for constantly flaky test

* better func name
  • Loading branch information
omarismail94 committed Aug 18, 2023
1 parent 4b2ae40 commit 173db10
Show file tree
Hide file tree
Showing 5 changed files with 82 additions and 69 deletions.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,19 @@

package com.google.android.fhir.datacapture.test.utilities

import android.view.View
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.UiController
import androidx.test.espresso.ViewAction
import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.RootMatchers.isDialog
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.matcher.ViewMatchers.withText
import com.google.common.truth.Truth.assertThat
import org.hamcrest.CoreMatchers.any
import org.hamcrest.Matcher
import org.hl7.fhir.r4.model.Coding
import org.hl7.fhir.r4.model.QuestionnaireResponse

Expand All @@ -47,3 +52,20 @@ fun assertQuestionnaireResponseAtIndex(
assertThat((answers[index].value as Coding).display).isEqualTo(expectedString)
}
}

/* Avoid test flakiness with a delay. See https://github.com/google/android-fhir/issues/1323.*/
fun delayMainThread(): ViewAction {
return object : ViewAction {
override fun getConstraints(): Matcher<View> {
return any(View::class.java)
}

override fun getDescription(): String {
return "wait until displayed"
}

override fun perform(uiController: UiController, view: View) {
uiController.loopMainThreadForAtLeast(1000)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package com.google.android.fhir.datacapture.test.views

import android.view.View
import android.widget.AutoCompleteTextView
import android.widget.FrameLayout
import android.widget.TextView
import androidx.test.espresso.Espresso.onData
Expand All @@ -33,7 +34,7 @@ import androidx.test.platform.app.InstrumentationRegistry
import com.google.android.fhir.datacapture.R
import com.google.android.fhir.datacapture.extensions.EXTENSION_ITEM_ANSWER_MEDIA
import com.google.android.fhir.datacapture.test.TestActivity
import com.google.android.fhir.datacapture.test.utilities.showDropDown
import com.google.android.fhir.datacapture.test.utilities.delayMainThread
import com.google.android.fhir.datacapture.validation.NotValidated
import com.google.android.fhir.datacapture.views.QuestionnaireViewItem
import com.google.android.fhir.datacapture.views.factories.DropDownAnswerOption
Expand Down Expand Up @@ -90,9 +91,12 @@ class DropDownViewHolderFactoryEspressoTest {
validationResult = NotValidated,
answersChangedCallback = { _, _, _, _ -> },
)
runOnUI { viewHolder.bind(questionnaireViewItem) }
runOnUI {
viewHolder.bind(questionnaireViewItem)
viewHolder.itemView.findViewById<AutoCompleteTextView>(R.id.auto_complete).showDropDown()
}

onView(withId(R.id.auto_complete)).perform(showDropDown())
onView(withId(R.id.auto_complete)).perform(delayMainThread())
onView(withText("-")).inRoot(isPlatformPopup()).check(matches(isDisplayed())).perform(click())
assertThat(viewHolder.itemView.findViewById<TextView>(R.id.auto_complete).text.toString())
.isEqualTo("-")
Expand All @@ -109,9 +113,12 @@ class DropDownViewHolderFactoryEspressoTest {
validationResult = NotValidated,
answersChangedCallback = { _, _, answers, _ -> answerHolder = answers },
)
runOnUI { viewHolder.bind(questionnaireViewItem) }
runOnUI {
viewHolder.bind(questionnaireViewItem)
viewHolder.itemView.findViewById<AutoCompleteTextView>(R.id.auto_complete).showDropDown()
}

onView(withId(R.id.auto_complete)).perform(showDropDown())
onView(withId(R.id.auto_complete)).perform(delayMainThread())
onView(withText("Coding 3"))
.inRoot(isPlatformPopup())
.check(matches(isDisplayed()))
Expand All @@ -131,9 +138,12 @@ class DropDownViewHolderFactoryEspressoTest {
validationResult = NotValidated,
answersChangedCallback = { _, _, answers, _ -> answerHolder = answers },
)
runOnUI { viewHolder.bind(questionnaireViewItem) }
runOnUI {
viewHolder.bind(questionnaireViewItem)
viewHolder.itemView.findViewById<AutoCompleteTextView>(R.id.auto_complete).showDropDown()
}

onView(withId(R.id.auto_complete)).perform(showDropDown())
onView(withId(R.id.auto_complete)).perform(delayMainThread())
onView(withText("Coding 3"))
.inRoot(isPlatformPopup())
.check(matches(isDisplayed()))
Expand Down Expand Up @@ -169,9 +179,12 @@ class DropDownViewHolderFactoryEspressoTest {
validationResult = NotValidated,
answersChangedCallback = { _, _, answers, _ -> answerHolder = answers },
)
runOnUI { viewHolder.bind(questionnaireViewItem) }
runOnUI {
viewHolder.bind(questionnaireViewItem)
viewHolder.itemView.findViewById<AutoCompleteTextView>(R.id.auto_complete).showDropDown()
}

onView(withId(R.id.auto_complete)).perform(showDropDown())
onView(withId(R.id.auto_complete)).perform(delayMainThread())
onView(withText("Coding 3"))
.inRoot(isPlatformPopup())
.check(matches(isDisplayed()))
Expand All @@ -196,9 +209,12 @@ class DropDownViewHolderFactoryEspressoTest {
validationResult = NotValidated,
answersChangedCallback = { _, _, answers, _ -> answerHolder = answers },
)
runOnUI { viewHolder.bind(questionnaireViewItem) }
runOnUI {
viewHolder.bind(questionnaireViewItem)
viewHolder.itemView.findViewById<AutoCompleteTextView>(R.id.auto_complete).showDropDown()
}

onView(withId(R.id.auto_complete)).perform(showDropDown())
onView(withId(R.id.auto_complete)).perform(delayMainThread())
onView(withText("Coding 1"))
.inRoot(isPlatformPopup())
.check(matches(isDisplayed()))
Expand All @@ -217,9 +233,12 @@ class DropDownViewHolderFactoryEspressoTest {
validationResult = NotValidated,
answersChangedCallback = { _, _, _, _ -> },
)
runOnUI { viewHolder.bind(questionnaireViewItem) }
runOnUI {
viewHolder.bind(questionnaireViewItem)
viewHolder.itemView.findViewById<AutoCompleteTextView>(R.id.auto_complete).showDropDown()
}

onView(withId(R.id.auto_complete)).perform(showDropDown())
onView(withId(R.id.auto_complete)).perform(delayMainThread())
assertThat(
viewHolder.itemView
.findViewById<MaterialAutoCompleteTextView>(R.id.auto_complete)
Expand All @@ -236,9 +255,12 @@ class DropDownViewHolderFactoryEspressoTest {
validationResult = NotValidated,
answersChangedCallback = { _, _, _, _ -> },
)
runOnUI { viewHolder.bind(questionnaireViewItem) }
runOnUI {
viewHolder.bind(questionnaireViewItem)
viewHolder.itemView.findViewById<AutoCompleteTextView>(R.id.auto_complete).showDropDown()
}

onView(withId(R.id.auto_complete)).perform(showDropDown())
onView(withId(R.id.auto_complete)).perform(delayMainThread())
onView(withId(R.id.auto_complete)).perform(typeText("Coding"))
assertThat(
viewHolder.itemView
Expand All @@ -257,9 +279,12 @@ class DropDownViewHolderFactoryEspressoTest {
validationResult = NotValidated,
answersChangedCallback = { _, _, _, _ -> },
)
runOnUI { viewHolder.bind(questionnaireViewItem) }
runOnUI {
viewHolder.bind(questionnaireViewItem)
viewHolder.itemView.findViewById<AutoCompleteTextView>(R.id.auto_complete).showDropDown()
}

onView(withId(R.id.auto_complete)).perform(showDropDown())
onView(withId(R.id.auto_complete)).perform(delayMainThread())
onView(withId(R.id.auto_complete)).perform(typeText("Division"))
assertThat(
viewHolder.itemView
Expand Down Expand Up @@ -302,9 +327,12 @@ class DropDownViewHolderFactoryEspressoTest {
answersChangedCallback = { _, _, answers, _ -> answerHolder = answers }
)

runOnUI { viewHolder.bind(questionnaireViewItem) }
runOnUI {
viewHolder.bind(questionnaireViewItem)
viewHolder.itemView.findViewById<AutoCompleteTextView>(R.id.auto_complete).showDropDown()
}

onView(withId(R.id.auto_complete)).perform(showDropDown())
onView(withId(R.id.auto_complete)).perform(delayMainThread())
onData(`is`(instanceOf(DropDownAnswerOption::class.java)))
.atPosition(2)
.inRoot(isPlatformPopup())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.assertion.ViewAssertions
import androidx.test.espresso.assertion.ViewAssertions.doesNotExist
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.contrib.RecyclerViewActions
Expand All @@ -40,6 +39,7 @@ import com.google.android.fhir.datacapture.test.TestActivity
import com.google.android.fhir.datacapture.test.utilities.assertQuestionnaireResponseAtIndex
import com.google.android.fhir.datacapture.test.utilities.clickOnText
import com.google.android.fhir.datacapture.test.utilities.clickOnTextInDialog
import com.google.android.fhir.datacapture.test.utilities.delayMainThread
import com.google.android.fhir.datacapture.test.utilities.endIconClickInTextInputLayout
import com.google.android.fhir.datacapture.validation.Invalid
import com.google.android.fhir.datacapture.validation.NotValidated
Expand Down Expand Up @@ -288,7 +288,8 @@ class QuestionnaireItemDialogMultiSelectViewHolderFactoryEspressoTest {
onView(withId(R.id.recycler_view))
.perform(RecyclerViewActions.scrollToPosition<RecyclerView.ViewHolder>(8))
clickOnTextInDialog("Other")
onView(withId(R.id.add_another)).check(ViewAssertions.matches(ViewMatchers.isDisplayed()))
onView(withId(R.id.add_another)).perform(delayMainThread())
onView(withId(R.id.add_another)).check(matches(isDisplayed()))
}

@Test
Expand Down Expand Up @@ -354,7 +355,8 @@ class QuestionnaireItemDialogMultiSelectViewHolderFactoryEspressoTest {
.perform(RecyclerViewActions.scrollToPosition<RecyclerView.ViewHolder>(8))
clickOnTextInDialog("Other")
onView(withId(R.id.add_another)).perform(click())
onView(withId(R.id.add_another)).check(ViewAssertions.matches(ViewMatchers.isDisplayed()))
onView(withId(R.id.add_another)).perform(delayMainThread())
onView(withId(R.id.add_another)).check(matches(isDisplayed()))
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package com.google.android.fhir.datacapture.views.factories

import android.view.View
import android.widget.AutoCompleteTextView
import android.widget.FrameLayout
import android.widget.TextView
import androidx.test.espresso.Espresso.onView
Expand All @@ -28,7 +29,7 @@ import androidx.test.ext.junit.rules.ActivityScenarioRule
import androidx.test.platform.app.InstrumentationRegistry
import com.google.android.fhir.datacapture.R
import com.google.android.fhir.datacapture.test.TestActivity
import com.google.android.fhir.datacapture.test.utilities.showDropDown
import com.google.android.fhir.datacapture.test.utilities.delayMainThread
import com.google.android.fhir.datacapture.validation.NotValidated
import com.google.android.fhir.datacapture.views.QuestionnaireViewItem
import com.google.android.material.chip.ChipGroup
Expand Down Expand Up @@ -90,7 +91,12 @@ class AutoCompleteViewHolderFactoryEspressoTest {
runOnUI { viewHolder.bind(questionnaireViewItem) }

onView(ViewMatchers.withId(R.id.autoCompleteTextView)).perform(ViewActions.typeText("Coding 3"))
onView(ViewMatchers.withId(R.id.autoCompleteTextView)).perform(showDropDown())
runOnUI {
viewHolder.itemView
.findViewById<AutoCompleteTextView>(R.id.autoCompleteTextView)
.showDropDown()
}
onView(ViewMatchers.withId(R.id.autoCompleteTextView)).perform(delayMainThread())
onView(ViewMatchers.withText("Coding 3"))
.inRoot(RootMatchers.isPlatformPopup())
.check(ViewAssertions.matches(ViewMatchers.isDisplayed()))
Expand Down

0 comments on commit 173db10

Please sign in to comment.