1717package com.google.android.fhir.datacapture.test
1818
1919import android.view.View
20+ import android.widget.Button
2021import android.widget.FrameLayout
2122import android.widget.TextView
2223import androidx.compose.ui.test.assertIsDisplayed
2324import androidx.compose.ui.test.assertTextEquals
25+ import androidx.compose.ui.test.hasTestTag
26+ import androidx.compose.ui.test.hasText
2427import androidx.compose.ui.test.junit4.createAndroidComposeRule
2528import androidx.compose.ui.test.onNodeWithContentDescription
2629import androidx.compose.ui.test.onNodeWithTag
2730import androidx.compose.ui.test.onNodeWithText
31+ import androidx.compose.ui.test.performClick
2832import androidx.compose.ui.test.performTextInput
33+ import androidx.core.os.bundleOf
2934import androidx.fragment.app.commitNow
35+ import androidx.lifecycle.Lifecycle
3036import androidx.test.espresso.Espresso.onView
3137import androidx.test.espresso.action.ViewActions
3238import androidx.test.espresso.assertion.ViewAssertions
@@ -42,13 +48,17 @@ import ca.uhn.fhir.context.FhirContext
4248import ca.uhn.fhir.context.FhirVersionEnum
4349import ca.uhn.fhir.parser.IParser
4450import 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
4554import com.google.android.fhir.datacapture.test.utilities.clickIcon
4655import com.google.android.fhir.datacapture.test.utilities.clickOnText
4756import com.google.android.fhir.datacapture.validation.Invalid
4857import com.google.android.fhir.datacapture.validation.QuestionnaireResponseValidator
4958import com.google.android.fhir.datacapture.validation.Valid
5059import com.google.android.fhir.datacapture.views.compose.EDIT_TEXT_FIELD_TEST_TAG
5160import com.google.android.fhir.datacapture.views.compose.HANDLE_INPUT_DEBOUNCE_TIME
61+ import com.google.android.fhir.datacapture.views.compose.PAGE_NAVIGATION_BUTTON_TAG
5262import com.google.android.fhir.datacapture.views.factories.localDate
5363import com.google.android.fhir.datacapture.views.factories.localDateTime
5464import 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 {
0 commit comments