@@ -72,6 +72,7 @@ import java.time.LocalDate
7272import java.time.LocalDateTime
7373import java.util.Calendar
7474import java.util.Date
75+ import kotlin.time.Duration.Companion.seconds
7576import kotlinx.coroutines.delay
7677import kotlinx.coroutines.runBlocking
7778import org.hamcrest.CoreMatchers
@@ -231,99 +232,113 @@ class QuestionnaireUiEspressoTest {
231232 fun dateTimePicker_shouldShowErrorForWrongDate () {
232233 buildFragmentFromQuestionnaire(" /component_date_time_picker.json" )
233234
234- // Add month and day. No need to add slashes as they are added automatically
235- composeTestRule.onNodeWithTag(DATE_TEXT_INPUT_FIELD ).performTextReplacement(" 0105" )
235+ runBlocking {
236+ // Add month and day. No need to add slashes as they are added automatically
237+ composeTestRule.onNodeWithTag(DATE_TEXT_INPUT_FIELD ).performTextReplacement(" 0105" )
238+ delay(HANDLE_INPUT_DEBOUNCE_TIME + 10L )
236239
237- composeTestRule
238- .onNodeWithTag(DATE_TEXT_INPUT_FIELD )
239- .assert (
240- SemanticsMatcher .expectValue(
241- SemanticsProperties .Error ,
242- " Date format needs to be mm/dd/yyyy (e.g. 01/31/2023)" ,
243- ),
244- )
245- composeTestRule.onNodeWithTag(TIME_PICKER_INPUT_FIELD ).assertIsNotEnabled()
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()
249+ }
246250 }
247251
248252 @Test
249253 fun dateTimePicker_shouldEnableTimePickerWithCorrectDate_butNotSaveInQuestionnaireResponse () {
250254 buildFragmentFromQuestionnaire(" /component_date_time_picker.json" )
251255
252- composeTestRule.onNodeWithTag(DATE_TEXT_INPUT_FIELD ).performTextReplacement(" 01052005" )
256+ runBlocking {
257+ composeTestRule.onNodeWithTag(DATE_TEXT_INPUT_FIELD ).performTextReplacement(" 01052005" )
258+ delay(HANDLE_INPUT_DEBOUNCE_TIME + 10L )
253259
254- composeTestRule
255- .onNodeWithTag(DATE_TEXT_INPUT_FIELD )
256- .assert (
257- SemanticsMatcher .keyNotDefined(
258- SemanticsProperties .Error ,
259- ),
260- )
261- composeTestRule.onNodeWithTag(TIME_PICKER_INPUT_FIELD ).assertIsEnabled()
260+ composeTestRule
261+ .onNodeWithTag(DATE_TEXT_INPUT_FIELD )
262+ .assert (
263+ SemanticsMatcher .keyNotDefined(
264+ SemanticsProperties .Error ,
265+ ),
266+ )
267+ composeTestRule.onNodeWithTag(TIME_PICKER_INPUT_FIELD ).assertIsEnabled()
262268
263- val questionnaireResponse = runBlocking { getQuestionnaireResponse() }
264- assertThat(questionnaireResponse.item.size).isEqualTo(1 )
265- assertThat(questionnaireResponse.item.first().answer.size).isEqualTo(1 )
266- val answer = questionnaireResponse.item.first().answer.first().valueDateTimeType
267- assertThat(answer.localDateTime).isEqualTo(LocalDateTime .of(2005 , 1 , 5 , 0 , 0 ))
269+ val questionnaireResponse = getQuestionnaireResponse()
270+ assertThat(questionnaireResponse.item.size).isEqualTo(1 )
271+ assertThat(questionnaireResponse.item.first().answer.size).isEqualTo(1 )
272+ val answer = questionnaireResponse.item.first().answer.first().valueDateTimeType
273+ assertThat(answer.localDateTime).isEqualTo(LocalDateTime .of(2005 , 1 , 5 , 0 , 0 ))
274+ }
268275 }
269276
270277 @Test
271278 fun dateTimePicker_shouldSetAnswerWhenDateAndTimeAreFilled () {
272279 buildFragmentFromQuestionnaire(" /component_date_time_picker.json" )
273280
274- composeTestRule.onNodeWithTag(DATE_TEXT_INPUT_FIELD ).performTextReplacement(" 01052005" )
275-
276- composeTestRule
277- .onNodeWithTag(TIME_PICKER_INPUT_FIELD )
278- .onChildren()
279- .filterToOne(
280- SemanticsMatcher .expectValue(SemanticsProperties .Role , Role .Button ),
281- )
282- .performClick()
283-
284- composeTestRule.onNodeWithText(" AM" ).performClick()
285- composeTestRule.onNodeWithContentDescription(" Select hour" , substring = true ).performClick()
286- composeTestRule.onNodeWithContentDescription(" 6 o'clock" , substring = true ).performClick()
287-
288- composeTestRule.onNodeWithContentDescription(" Select minutes" , substring = true ).performClick()
289- composeTestRule.onNodeWithContentDescription(" 10 minutes" , substring = true ).performClick()
281+ runBlocking {
282+ composeTestRule.onNodeWithTag(DATE_TEXT_INPUT_FIELD ).performTextReplacement(" 01052005" )
283+ delay(HANDLE_INPUT_DEBOUNCE_TIME + 10L )
284+ composeTestRule
285+ .onNodeWithTag(TIME_PICKER_INPUT_FIELD )
286+ .onChildren()
287+ .filterToOne(
288+ SemanticsMatcher .expectValue(SemanticsProperties .Role , Role .Button ),
289+ )
290+ .performClick()
290291
291- composeTestRule.onNodeWithText(" OK " ).performClick()
292- // Synchronize
293- composeTestRule.waitForIdle ()
292+ composeTestRule.onNodeWithText(" AM " ).performClick()
293+ composeTestRule.onNodeWithContentDescription( " Select hour " , substring = true ).performClick()
294+ composeTestRule.onNodeWithContentDescription( " 6 o'clock " , substring = true ).performClick ()
294295
295- val questionnaireResponse = runBlocking { getQuestionnaireResponse() }
296- val answer = questionnaireResponse.item.first().answer.first().valueDateTimeType
297- // check Locale
298- assertThat(answer.localDateTime).isEqualTo(LocalDateTime .of(2005 , 1 , 5 , 6 , 10 ))
296+ composeTestRule
297+ .onNodeWithContentDescription(" Select minutes" , substring = true )
298+ .performClick()
299+ composeTestRule.onNodeWithContentDescription(" 10 minutes" , substring = true ).performClick()
300+
301+ composeTestRule.onNodeWithText(" OK" ).performClick()
302+ // Synchronize
303+ composeTestRule.waitForIdle()
304+
305+ val questionnaireResponse = getQuestionnaireResponse()
306+ val answer = questionnaireResponse.item.first().answer.first().valueDateTimeType
307+ // check Locale
308+ assertThat(answer.localDateTime).isEqualTo(LocalDateTime .of(2005 , 1 , 5 , 6 , 10 ))
309+ }
299310 }
300311
301312 @Test
302313 fun datePicker_shouldShowErrorForWrongDate () {
303314 buildFragmentFromQuestionnaire(" /component_date_picker.json" )
304315
305- // Add month and day. No need to add slashes as they are added automatically
306- composeTestRule.onNodeWithTag(DATE_TEXT_INPUT_FIELD ).performTextInput(" 0105" )
307- composeTestRule
308- .onNodeWithTag(DATE_TEXT_INPUT_FIELD )
309- .assert (
310- SemanticsMatcher .expectValue(
311- SemanticsProperties .Error ,
312- " Date format needs to be mm/dd/yyyy (e.g. 01/31/2023)" ,
313- ),
314- )
316+ runBlocking {
317+ // Add month and day. No need to add slashes as they are added automatically
318+ composeTestRule.onNodeWithTag(DATE_TEXT_INPUT_FIELD ).performTextInput(" 0105" )
319+ delay(HANDLE_INPUT_DEBOUNCE_TIME + 10L )
320+ composeTestRule
321+ .onNodeWithTag(DATE_TEXT_INPUT_FIELD )
322+ .assert (
323+ SemanticsMatcher .expectValue(
324+ SemanticsProperties .Error ,
325+ " Date format needs to be mm/dd/yyyy (e.g. 01/31/2023)" ,
326+ ),
327+ )
328+ }
315329 }
316330
317331 @Test
318332 fun datePicker_shouldSaveInQuestionnaireResponseWhenCorrectDateEntered () {
319333 buildFragmentFromQuestionnaire(" /component_date_picker.json" )
320334
321- composeTestRule.onNodeWithTag(DATE_TEXT_INPUT_FIELD ).performTextInput(" 01052005" )
322- composeTestRule
323- .onNodeWithTag(DATE_TEXT_INPUT_FIELD )
324- .assert (SemanticsMatcher .keyNotDefined(SemanticsProperties .Error ))
325-
326335 runBlocking {
336+ composeTestRule.onNodeWithTag(DATE_TEXT_INPUT_FIELD ).performTextInput(" 01052005" )
337+ delay(HANDLE_INPUT_DEBOUNCE_TIME + 10L )
338+ composeTestRule
339+ .onNodeWithTag(DATE_TEXT_INPUT_FIELD )
340+ .assert (SemanticsMatcher .keyNotDefined(SemanticsProperties .Error ))
341+
327342 val answer = getQuestionnaireResponse().item.first().answer.first().valueDateType
328343 assertThat(answer.localDate).isEqualTo(LocalDate .of(2005 , 1 , 5 ))
329344 }
@@ -579,19 +594,25 @@ class QuestionnaireUiEspressoTest {
579594 @Test
580595 fun clearAllAnswers_shouldClearDraftAnswer () {
581596 val questionnaireFragment = buildFragmentFromQuestionnaire(" /component_date_picker.json" )
582- // Add month and day. No need to add slashes as they are added automatically
583- composeTestRule
584- .onNodeWithTag(DATE_TEXT_INPUT_FIELD , useUnmergedTree = true )
585- .performTextInput(" 0105" )
586- composeTestRule
587- .onNodeWithTag(DATE_TEXT_INPUT_FIELD , useUnmergedTree = true )
588- .assertTextEquals(" 01/05/" )
589597
590- questionnaireFragment.clearAllAnswers()
598+ runBlocking {
599+ // Add month and day. No need to add slashes as they are added automatically
600+ composeTestRule
601+ .onNodeWithTag(DATE_TEXT_INPUT_FIELD , useUnmergedTree = true )
602+ .performTextInput(" 0105" )
603+ composeTestRule
604+ .onNodeWithTag(DATE_TEXT_INPUT_FIELD , useUnmergedTree = true )
605+ .assertTextEquals(" 01/05" )
606+ delay(1 .seconds) // Add delay to give time for new questionnaire state
607+ composeTestRule.awaitIdle()
591608
592- composeTestRule
593- .onNodeWithTag(DATE_TEXT_INPUT_FIELD , useUnmergedTree = true )
594- .assertTextEquals(" " )
609+ questionnaireFragment.clearAllAnswers()
610+ composeTestRule.awaitIdle()
611+
612+ composeTestRule
613+ .onNodeWithTag(DATE_TEXT_INPUT_FIELD , useUnmergedTree = true )
614+ .assertTextEquals(" " )
615+ }
595616 }
596617
597618 @Test
0 commit comments