@@ -23,6 +23,7 @@ import androidx.compose.ui.semantics.SemanticsProperties
2323import androidx.compose.ui.test.SemanticsMatcher
2424import androidx.compose.ui.test.assert
2525import androidx.compose.ui.test.assertIsDisplayed
26+ import androidx.compose.ui.test.assertIsEnabled
2627import androidx.compose.ui.test.assertIsNotEnabled
2728import androidx.compose.ui.test.assertTextEquals
2829import androidx.compose.ui.test.hasAnyAncestor
@@ -34,6 +35,8 @@ import androidx.compose.ui.test.onNodeWithTag
3435import androidx.compose.ui.test.onNodeWithText
3536import androidx.compose.ui.test.performClick
3637import androidx.compose.ui.test.performTextInput
38+ import androidx.compose.ui.test.performTextReplacement
39+ import androidx.compose.ui.test.printToLog
3740import androidx.fragment.app.commitNow
3841import androidx.recyclerview.widget.RecyclerView
3942import androidx.recyclerview.widget.RecyclerView.ViewHolder
@@ -65,8 +68,8 @@ import com.google.android.fhir.datacapture.validation.Valid
6568import com.google.android.fhir.datacapture.views.compose.DATE_TEXT_INPUT_FIELD
6669import com.google.android.fhir.datacapture.views.compose.EDIT_TEXT_FIELD_TEST_TAG
6770import com.google.android.fhir.datacapture.views.compose.HANDLE_INPUT_DEBOUNCE_TIME
71+ import com.google.android.fhir.datacapture.views.compose.TIME_PICKER_INPUT_FIELD
6872import com.google.android.material.progressindicator.LinearProgressIndicator
69- import com.google.android.material.textfield.TextInputLayout
7073import com.google.common.truth.Truth.assertThat
7174import java.math.BigDecimal
7275import java.time.LocalDate
@@ -232,57 +235,58 @@ class QuestionnaireUiEspressoTest {
232235 buildFragmentFromQuestionnaire(" /component_date_time_picker.json" )
233236
234237 // Add month and day. No need to add slashes as they are added automatically
235- onView(withId(R .id.date_input_edit_text))
236- .perform(ViewActions .click())
237- .perform(ViewActions .typeTextIntoFocusedView(" 0105" ))
238+ composeTestRule.onNodeWithTag(DATE_TEXT_INPUT_FIELD ).performTextReplacement(" 0105" )
238239
239- onView(withId(R .id.date_input_layout)).check { view, _ ->
240- val actualError = (view as TextInputLayout ).error
241- assertThat(actualError).isEqualTo(" Date format needs to be mm/dd/yyyy (e.g. 01/31/2023)" )
242- }
243- onView(withId(R .id.time_input_layout)).check { view, _ -> assertThat(view.isEnabled).isFalse() }
240+ composeTestRule
241+ .onNodeWithTag(DATE_TEXT_INPUT_FIELD )
242+ .assert (
243+ SemanticsMatcher .expectValue(
244+ SemanticsProperties .Error ,
245+ " Date format needs to be mm/dd/yyyy (e.g. 01/31/2023)" ,
246+ ),
247+ )
248+ composeTestRule.onNodeWithTag(TIME_PICKER_INPUT_FIELD ).assertIsNotEnabled()
244249 }
245250
246251 @Test
247252 fun dateTimePicker_shouldEnableTimePickerWithCorrectDate_butNotSaveInQuestionnaireResponse () {
248253 buildFragmentFromQuestionnaire(" /component_date_time_picker.json" )
249254
250- onView(withId(R .id.date_input_edit_text))
251- .perform(ViewActions .click())
252- .perform(ViewActions .typeTextIntoFocusedView(" 01052005" ))
253-
254- onView(withId(R .id.date_input_layout)).check { view, _ ->
255- val actualError = (view as TextInputLayout ).error
256- assertThat(actualError).isEqualTo(null )
257- }
255+ composeTestRule.onNodeWithTag(DATE_TEXT_INPUT_FIELD ).performTextReplacement(" 01052005" )
258256
259- onView(withId(R .id.time_input_layout)).check { view, _ -> assertThat(view.isEnabled).isTrue() }
257+ composeTestRule
258+ .onNodeWithTag(DATE_TEXT_INPUT_FIELD )
259+ .assert (
260+ SemanticsMatcher .keyNotDefined(
261+ SemanticsProperties .Error ,
262+ ),
263+ )
264+ composeTestRule.onNodeWithTag(TIME_PICKER_INPUT_FIELD ).assertIsEnabled()
260265
261- runBlocking {
262- assertThat(getQuestionnaireResponse().item.size).isEqualTo(1 )
263- assertThat(getQuestionnaireResponse().item.first().answer.size).isEqualTo(0 )
264- }
266+ val questionnaireResponse = runBlocking { getQuestionnaireResponse() }
267+ assertThat(questionnaireResponse.item.size).isEqualTo(1 )
268+ assertThat(questionnaireResponse.item.first().answer.size).isEqualTo(1 )
269+ val answer = questionnaireResponse.item.first().answer.first().valueDateTimeType
270+ assertThat(answer.localDateTime).isEqualTo(LocalDateTime .of(2005 , 1 , 5 , 0 , 0 ))
265271 }
266272
267273 @Test
268274 fun dateTimePicker_shouldSetAnswerWhenDateAndTimeAreFilled () {
269275 buildFragmentFromQuestionnaire(" /component_date_time_picker.json" )
270276
271- onView(withId(R .id.date_input_edit_text))
272- .perform(ViewActions .click())
273- .perform(ViewActions .typeTextIntoFocusedView(" 01052005" ))
277+ composeTestRule.onNodeWithTag(DATE_TEXT_INPUT_FIELD ).performTextReplacement(" 01052005" )
274278
279+ composeTestRule.onNodeWithTag(TIME_PICKER_INPUT_FIELD ).printToLog(" Timer!" )
275280 onView(withId(R .id.time_input_layout)).perform(clickIcon(true ))
276281 clickOnText(" AM" )
277282 clickOnText(" 6" )
278283 clickOnText(" 10" )
279284 clickOnText(" OK" )
280285
281- runBlocking {
282- val answer = getQuestionnaireResponse().item.first().answer.first().valueDateTimeType
283- // check Locale
284- assertThat(answer.localDateTime).isEqualTo(LocalDateTime .of(2005 , 1 , 5 , 6 , 10 ))
285- }
286+ val questionnaireResponse = runBlocking { getQuestionnaireResponse() }
287+ val answer = questionnaireResponse.item.first().answer.first().valueDateTimeType
288+ // check Locale
289+ assertThat(answer.localDateTime).isEqualTo(LocalDateTime .of(2005 , 1 , 5 , 6 , 10 ))
286290 }
287291
288292 @Test
0 commit comments