Skip to content

Commit 4fcf123

Browse files
committed
Replace date visualTransformation with manual insert of delimiter
1 parent 9a26893 commit 4fcf123

File tree

7 files changed

+200
-303
lines changed

7 files changed

+200
-303
lines changed

datacapture/src/androidTest/java/com/google/android/fhir/datacapture/test/QuestionnaireUiEspressoTest.kt

Lines changed: 95 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ import java.time.LocalDate
7272
import java.time.LocalDateTime
7373
import java.util.Calendar
7474
import java.util.Date
75+
import kotlin.time.Duration.Companion.seconds
7576
import kotlinx.coroutines.delay
7677
import kotlinx.coroutines.runBlocking
7778
import 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

datacapture/src/androidTest/java/com/google/android/fhir/datacapture/test/views/DatePickerViewHolderFactoryTest.kt

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -223,8 +223,7 @@ class DatePickerViewHolderFactoryTest {
223223
)
224224

225225
viewHolder.bind(item)
226-
val dateTextInput = "11192020" // is transformed to 11/19/2020 in the date widget
227-
composeTestRule.onNodeWithTag(DATE_TEXT_INPUT_FIELD).performTextInput(dateTextInput)
226+
composeTestRule.onNodeWithTag(DATE_TEXT_INPUT_FIELD).performTextInput("11/19/2020")
228227
composeTestRule.waitUntil { answers != null }
229228

230229
val answer = answers!!.single().value as DateType
@@ -246,7 +245,7 @@ class DatePickerViewHolderFactoryTest {
246245
answersChangedCallback = { _, _, result, _ -> answers = result },
247246
)
248247
viewHolder.bind(item)
249-
composeTestRule.onNodeWithTag(DATE_TEXT_INPUT_FIELD).performTextInput("20201119")
248+
composeTestRule.onNodeWithTag(DATE_TEXT_INPUT_FIELD).performTextInput("2020/11/19")
250249
composeTestRule.waitUntil { answers != null }
251250
val answer = answers!!.single().value as DateType
252251

@@ -303,15 +302,14 @@ class DatePickerViewHolderFactoryTest {
303302
composeTestRule
304303
.onNodeWithTag(DATE_TEXT_INPUT_FIELD, useUnmergedTree = true)
305304
.assertTextEquals("11/19/2020")
306-
val dateTextInput = "1119" // transforms to 11/19 in the datePicker widget
307305
composeTestRule.onNodeWithTag(DATE_TEXT_INPUT_FIELD).performSemanticsAction(
308306
SemanticsActions.SetText,
309307
) {
310-
it(dateTextInput.toAnnotatedString())
308+
it("11/19".toAnnotatedString())
311309
}
312310
composeTestRule
313311
.onNodeWithTag(DATE_TEXT_INPUT_FIELD, useUnmergedTree = true)
314-
.assertTextEquals("11/19/")
312+
.assertTextEquals("11/19")
315313
}
316314

317315
@Test
@@ -388,13 +386,13 @@ class DatePickerViewHolderFactoryTest {
388386
QuestionnaireResponse.QuestionnaireResponseItemComponent(),
389387
validationResult = NotValidated,
390388
answersChangedCallback = { _, _, _, _ -> },
391-
draftAnswer = "0207",
389+
draftAnswer = "02/07",
392390
)
393391

394392
viewHolder.bind(questionnaireItem)
395393
composeTestRule
396394
.onNodeWithTag(DATE_TEXT_INPUT_FIELD, useUnmergedTree = true)
397-
.assertTextEquals("02/07/")
395+
.assertTextEquals("02/07")
398396
}
399397

400398
@Test
@@ -406,13 +404,13 @@ class DatePickerViewHolderFactoryTest {
406404
QuestionnaireResponse.QuestionnaireResponseItemComponent(),
407405
validationResult = NotValidated,
408406
answersChangedCallback = { _, _, _, _ -> },
409-
draftAnswer = "0207",
407+
draftAnswer = "02/07",
410408
)
411409

412410
viewHolder.bind(questionnaireItem)
413411
composeTestRule
414412
.onNodeWithTag(DATE_TEXT_INPUT_FIELD, useUnmergedTree = true)
415-
.assertTextEquals("02/07/")
413+
.assertTextEquals("02/07")
416414

417415
questionnaireItem =
418416
QuestionnaireViewItem(

datacapture/src/androidTest/java/com/google/android/fhir/datacapture/test/views/DateTimePickerViewHolderFactoryTest.kt

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -171,9 +171,7 @@ class DateTimePickerViewHolderFactoryTest {
171171
)
172172
viewHolder.bind(itemViewItem)
173173

174-
composeTestRule
175-
.onNodeWithTag(DATE_TEXT_INPUT_FIELD)
176-
.performTextReplacement("11192020") // transforms to 11/19/2020 in the date widget
174+
composeTestRule.onNodeWithTag(DATE_TEXT_INPUT_FIELD).performTextReplacement("11/19/2020")
177175
composeTestRule.waitUntil { answer != null }
178176

179177
val dateTime = answer!!.value as DateTimeType
@@ -199,9 +197,7 @@ class DateTimePickerViewHolderFactoryTest {
199197
)
200198
viewHolder.bind(itemViewItem)
201199

202-
composeTestRule
203-
.onNodeWithTag(DATE_TEXT_INPUT_FIELD)
204-
.performTextReplacement("20201119") // transforms to 2020/11/19 in the date widget
200+
composeTestRule.onNodeWithTag(DATE_TEXT_INPUT_FIELD).performTextReplacement("2020/11/19")
205201
composeTestRule.waitUntil { answer != null }
206202

207203
val dateTime = answer!!.value as DateTimeType
@@ -255,13 +251,11 @@ class DateTimePickerViewHolderFactoryTest {
255251
answersChangedCallback = { _, _, _, _ -> },
256252
)
257253
viewHolder.bind(itemViewItem)
258-
composeTestRule
259-
.onNodeWithTag(DATE_TEXT_INPUT_FIELD)
260-
.performTextReplacement("202011") // transforms to 2020/11 for Locale.JAPAN
254+
composeTestRule.onNodeWithTag(DATE_TEXT_INPUT_FIELD).performTextReplacement("2020/11")
261255

262256
composeTestRule
263257
.onNodeWithTag(DATE_TEXT_INPUT_FIELD, useUnmergedTree = true)
264-
.assertTextEquals("2020/11/")
258+
.assertTextEquals("2020/11")
265259
}
266260

267261
@Test
@@ -335,13 +329,13 @@ class DateTimePickerViewHolderFactoryTest {
335329
QuestionnaireResponse.QuestionnaireResponseItemComponent(),
336330
validationResult = NotValidated,
337331
answersChangedCallback = { _, _, _, _ -> },
338-
draftAnswer = "0207", // transforms to 02/07 for default locale
332+
draftAnswer = "02/07",
339333
)
340334

341335
viewHolder.bind(questionnaireItem)
342336
composeTestRule
343337
.onNodeWithTag(DATE_TEXT_INPUT_FIELD, useUnmergedTree = true)
344-
.assertTextEquals("02/07/")
338+
.assertTextEquals("02/07")
345339
}
346340

347341
@Test
@@ -352,13 +346,13 @@ class DateTimePickerViewHolderFactoryTest {
352346
QuestionnaireResponse.QuestionnaireResponseItemComponent(),
353347
validationResult = NotValidated,
354348
answersChangedCallback = { _, _, _, _ -> },
355-
draftAnswer = "0207", // transforms to 02/07 for default locale
349+
draftAnswer = "02/07",
356350
)
357351

358352
viewHolder.bind(questionnaireItem)
359353
composeTestRule
360354
.onNodeWithTag(DATE_TEXT_INPUT_FIELD, useUnmergedTree = true)
361-
.assertTextEquals("02/07/")
355+
.assertTextEquals("02/07")
362356

363357
questionnaireItem =
364358
QuestionnaireViewItem(

0 commit comments

Comments
 (0)