Skip to content

Commit 6ba7cdd

Browse files
committed
Cleanup and fix failing tests
1 parent d5b1419 commit 6ba7cdd

File tree

4 files changed

+249
-299
lines changed

4 files changed

+249
-299
lines changed

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

Lines changed: 245 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,22 @@
1717
package com.google.android.fhir.datacapture.test
1818

1919
import android.view.View
20+
import android.widget.Button
2021
import android.widget.FrameLayout
2122
import android.widget.TextView
2223
import androidx.compose.ui.test.assertIsDisplayed
2324
import androidx.compose.ui.test.assertTextEquals
25+
import androidx.compose.ui.test.hasTestTag
26+
import androidx.compose.ui.test.hasText
2427
import androidx.compose.ui.test.junit4.createAndroidComposeRule
2528
import androidx.compose.ui.test.onNodeWithContentDescription
2629
import androidx.compose.ui.test.onNodeWithTag
2730
import androidx.compose.ui.test.onNodeWithText
31+
import androidx.compose.ui.test.performClick
2832
import androidx.compose.ui.test.performTextInput
33+
import androidx.core.os.bundleOf
2934
import androidx.fragment.app.commitNow
35+
import androidx.lifecycle.Lifecycle
3036
import androidx.test.espresso.Espresso.onView
3137
import androidx.test.espresso.action.ViewActions
3238
import androidx.test.espresso.assertion.ViewAssertions
@@ -42,13 +48,17 @@ import ca.uhn.fhir.context.FhirContext
4248
import ca.uhn.fhir.context.FhirVersionEnum
4349
import ca.uhn.fhir.parser.IParser
4450
import com.google.android.fhir.datacapture.QuestionnaireFragment
51+
import com.google.android.fhir.datacapture.QuestionnaireFragment.Companion.EXTRA_ENABLE_REVIEW_PAGE
52+
import com.google.android.fhir.datacapture.QuestionnaireFragment.Companion.EXTRA_QUESTIONNAIRE_JSON_STRING
53+
import com.google.android.fhir.datacapture.QuestionnaireFragment.Companion.EXTRA_SHOW_REVIEW_PAGE_FIRST
4554
import com.google.android.fhir.datacapture.test.utilities.clickIcon
4655
import com.google.android.fhir.datacapture.test.utilities.clickOnText
4756
import com.google.android.fhir.datacapture.validation.Invalid
4857
import com.google.android.fhir.datacapture.validation.QuestionnaireResponseValidator
4958
import com.google.android.fhir.datacapture.validation.Valid
5059
import com.google.android.fhir.datacapture.views.compose.EDIT_TEXT_FIELD_TEST_TAG
5160
import com.google.android.fhir.datacapture.views.compose.HANDLE_INPUT_DEBOUNCE_TIME
61+
import com.google.android.fhir.datacapture.views.compose.PAGE_NAVIGATION_BUTTON_TAG
5262
import com.google.android.fhir.datacapture.views.factories.localDate
5363
import com.google.android.fhir.datacapture.views.factories.localDateTime
5464
import com.google.android.material.progressindicator.LinearProgressIndicator
@@ -699,6 +709,233 @@ class QuestionnaireUiEspressoTest {
699709
.check(doesNotExist())
700710
}
701711

712+
713+
@Test
714+
fun shouldHideNextButtonOnLastPage() {
715+
val questionnaireJson =
716+
"""{
717+
"resourceType": "Questionnaire",
718+
"item": [
719+
{
720+
"linkId": "1",
721+
"type": "group",
722+
"extension": [
723+
{
724+
"url": "http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl",
725+
"valueCodeableConcept": {
726+
"coding": [
727+
{
728+
"system": "http://hl7.org/fhir/questionnaire-item-control",
729+
"code": "page",
730+
"display": "Page"
731+
}
732+
],
733+
"text": "Page"
734+
}
735+
}
736+
],
737+
"item": [
738+
{
739+
"linkId": "1.1",
740+
"type": "display",
741+
"text": "Item 1"
742+
}
743+
]
744+
},
745+
{
746+
"linkId": "2",
747+
"type": "group",
748+
"extension": [
749+
{
750+
"url": "http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl",
751+
"valueCodeableConcept": {
752+
"coding": [
753+
{
754+
"system": "http://hl7.org/fhir/questionnaire-item-control",
755+
"code": "page",
756+
"display": "Page"
757+
}
758+
],
759+
"text": "Page"
760+
}
761+
}
762+
],
763+
"item": [
764+
{
765+
"linkId": "2.1",
766+
"type": "display",
767+
"text": "Item 2"
768+
}
769+
]
770+
}
771+
]
772+
}
773+
"""
774+
val questionnaire = parser.parseResource(questionnaireJson) as Questionnaire
775+
buildFragmentFromQuestionnaire(questionnaire)
776+
val nextButtonText = context.getString(com.google.android.fhir.datacapture.R.string.button_pagination_next)
777+
composeTestRule.onNode(hasTestTag(PAGE_NAVIGATION_BUTTON_TAG) and hasText(nextButtonText)).performClick()
778+
composeTestRule.onNode(hasTestTag(PAGE_NAVIGATION_BUTTON_TAG) and hasText(nextButtonText)).assertDoesNotExist()
779+
780+
// val scenario =
781+
// launchFragment<QuestionnaireFragment>(
782+
// bundleOf(
783+
// EXTRA_QUESTIONNAIRE_JSON_STRING to questionnaireJson,
784+
// ),
785+
// )
786+
// scenario.moveToState(Lifecycle.State.RESUMED)
787+
// val view = scenario.withFragment { requireView() }
788+
// view.findViewById<Button>(com.google.android.fhir.datacapture.R.id.pagination_next_button).performClick()
789+
// assertThat(view.findViewById<Button>(com.google.android.fhir.datacapture.R.id.pagination_next_button).visibility)
790+
// .isEqualTo(View.GONE)
791+
}
792+
793+
@Test
794+
fun reviewPageShouldShowBothEditAndSubmitButton() {
795+
val questionnaire =
796+
Questionnaire().apply {
797+
id = "a-questionnaire"
798+
addItem(
799+
Questionnaire.QuestionnaireItemComponent().apply {
800+
linkId = "a-link-id"
801+
type = Questionnaire.QuestionnaireItemType.BOOLEAN
802+
},
803+
)
804+
}
805+
buildFragmentFromQuestionnaire(questionnaire, isReviewMode = true, showReviewPageFirst = true)
806+
onView(withId(com.google.android.fhir.datacapture.R.id.review_mode_edit_button))
807+
.check(ViewAssertions.matches(ViewMatchers.isDisplayed()))
808+
composeTestRule.onNode(hasTestTag(PAGE_NAVIGATION_BUTTON_TAG) and hasText(context.getString(com.google.android.fhir.datacapture.R.string.submit_questionnaire))).assertIsDisplayed()
809+
810+
// val questionnaireJson = parser.encodeResourceToString(questionnaire)
811+
// val scenario =
812+
// launchFragmentInContainer<QuestionnaireFragment>(
813+
// bundleOf(
814+
// EXTRA_QUESTIONNAIRE_JSON_STRING to questionnaireJson,
815+
// EXTRA_ENABLE_REVIEW_PAGE to true,
816+
// EXTRA_SHOW_REVIEW_PAGE_FIRST to true,
817+
// ),
818+
// )
819+
// scenario.moveToState(Lifecycle.State.RESUMED)
820+
// val view = scenario.withFragment { requireView() }
821+
//
822+
// assertThat(view.findViewById<Button>(com.google.android.fhir.datacapture.R.id.review_mode_edit_button).visibility)
823+
// .isEqualTo(View.VISIBLE)
824+
// assertThat(view.findViewById<Button>(com.google.android.fhir.datacapture.R.id.submit_questionnaire).visibility)
825+
// .isEqualTo(View.VISIBLE)
826+
}
827+
828+
@Test
829+
fun questionnaireSubmitButtonTextShouldBeEditable() {
830+
val questionnaire =
831+
Questionnaire().apply {
832+
id = "a-questionnaire"
833+
addItem(
834+
Questionnaire.QuestionnaireItemComponent().apply {
835+
linkId = "a-link-id"
836+
type = Questionnaire.QuestionnaireItemType.BOOLEAN
837+
},
838+
)
839+
}
840+
val customButtonText = "Apply"
841+
buildFragmentFromQuestionnaire(questionnaire, submitText = customButtonText)
842+
composeTestRule.onNode(hasTestTag(PAGE_NAVIGATION_BUTTON_TAG) and hasText(customButtonText)).assertIsDisplayed()
843+
844+
// val questionnaireJson = parser.encodeResourceToString(questionnaire)
845+
// val scenario =
846+
// launchFragment<QuestionnaireFragment>(
847+
// QuestionnaireFragment.builder()
848+
// .setQuestionnaire(questionnaireJson)
849+
// .setSubmitButtonText(customButtonText)
850+
// .buildArgs(),
851+
// )
852+
//
853+
// scenario.moveToState(Lifecycle.State.RESUMED)
854+
//
855+
// val button =
856+
// scenario.withFragment { this.requireView().findViewById<Button>(com.google.android.fhir.datacapture.R.id.submit_questionnaire) }
857+
//
858+
// val buttonText = button.text.toString()
859+
// assertEquals(buttonText, customButtonText)
860+
}
861+
862+
@Test
863+
fun shouldHidePreviousButtonOnFirstPage() {
864+
val questionnaireJson =
865+
"""{
866+
"resourceType": "Questionnaire",
867+
"item": [
868+
{
869+
"linkId": "1",
870+
"type": "group",
871+
"extension": [
872+
{
873+
"url": "http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl",
874+
"valueCodeableConcept": {
875+
"coding": [
876+
{
877+
"system": "http://hl7.org/fhir/questionnaire-item-control",
878+
"code": "page",
879+
"display": "Page"
880+
}
881+
],
882+
"text": "Page"
883+
}
884+
}
885+
],
886+
"item": [
887+
{
888+
"linkId": "1.1",
889+
"type": "display",
890+
"text": "Item 1"
891+
}
892+
]
893+
},
894+
{
895+
"linkId": "2",
896+
"type": "group",
897+
"extension": [
898+
{
899+
"url": "http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl",
900+
"valueCodeableConcept": {
901+
"coding": [
902+
{
903+
"system": "http://hl7.org/fhir/questionnaire-item-control",
904+
"code": "page",
905+
"display": "Page"
906+
}
907+
],
908+
"text": "Page"
909+
}
910+
}
911+
],
912+
"item": [
913+
{
914+
"linkId": "2.1",
915+
"type": "display",
916+
"text": "Item 2"
917+
}
918+
]
919+
}
920+
]
921+
}
922+
"""
923+
val questionnaire = parser.parseResource(questionnaireJson) as Questionnaire
924+
buildFragmentFromQuestionnaire(questionnaire)
925+
composeTestRule.onNode(hasTestTag(PAGE_NAVIGATION_BUTTON_TAG) and hasText(context.getString(com.google.android.fhir.datacapture.R.string.button_pagination_previous))).assertDoesNotExist()
926+
927+
// val scenario =
928+
// launchFragment<QuestionnaireFragment>(
929+
// bundleOf(
930+
// EXTRA_QUESTIONNAIRE_JSON_STRING to questionnaireJson,
931+
// ),
932+
// )
933+
// scenario.moveToState(Lifecycle.State.RESUMED)
934+
// val view = scenario.withFragment { requireView() }
935+
// assertThat(view.findViewById<Button>(com.google.android.fhir.datacapture.R.id.pagination_previous_button).visibility)
936+
// .isEqualTo(View.GONE)
937+
}
938+
702939
private fun buildFragmentFromQuestionnaire(
703940
fileName: String,
704941
isReviewMode: Boolean = false,
@@ -726,11 +963,19 @@ class QuestionnaireUiEspressoTest {
726963
private fun buildFragmentFromQuestionnaire(
727964
questionnaire: Questionnaire,
728965
isReviewMode: Boolean = false,
966+
showReviewPageFirst: Boolean = false,
967+
submitText: String? = null
729968
) {
730969
val questionnaireFragment =
731970
QuestionnaireFragment.builder()
732971
.setQuestionnaire(parser.encodeResourceToString(questionnaire))
733972
.showReviewPageBeforeSubmit(isReviewMode)
973+
.showReviewPageFirst(showReviewPageFirst)
974+
.apply {
975+
submitText?.let {
976+
setSubmitButtonText(it)
977+
}
978+
}
734979
.build()
735980
composeTestRule.activityRule.scenario.onActivity { activity ->
736981
activity.supportFragmentManager.commitNow {

datacapture/src/main/java/com/google/android/fhir/datacapture/views/compose/PageNavigationView.kt

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import androidx.compose.runtime.Composable
3232
import androidx.compose.runtime.remember
3333
import androidx.compose.ui.Alignment
3434
import androidx.compose.ui.Modifier
35+
import androidx.compose.ui.platform.testTag
3536
import androidx.compose.ui.res.stringResource
3637
import androidx.compose.ui.unit.dp
3738
import com.google.accompanist.themeadapter.material3.Mdc3Theme
@@ -48,11 +49,6 @@ fun PageBottomNavigationView(
4849
Mdc3Theme { PageNavigationView(navigationUIState = navigationUIState, modifier = modifier) }
4950
}
5051

51-
/**
52-
* Composable function that renders the navigation bar for questionnaires.
53-
*
54-
* This replaces the XML-based pagination_navigation_view.xml layout with a Compose implementation.
55-
*/
5652
@Composable
5753
fun PageNavigationView(
5854
navigationUIState: QuestionnaireNavigationUIState,
@@ -128,11 +124,13 @@ private fun PageNavigationButton(
128124
val buttonText = navigationViewState.labelText?.takeIf { it.isNotBlank() } ?: defaultText
129125
Button(
130126
onClick = navigationViewState.onClickAction,
131-
modifier = modifier,
127+
modifier = modifier.testTag(PAGE_NAVIGATION_BUTTON_TAG),
132128
) {
133129
Text(
134130
text = buttonText,
135131
)
136132
}
137133
}
138134
}
135+
136+
internal const val PAGE_NAVIGATION_BUTTON_TAG = "page_navigation_button"

0 commit comments

Comments
 (0)