diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/questionnaire/QuestionnaireViewModel.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/questionnaire/QuestionnaireViewModel.kt index ee2f3b9b5d..b491cd7200 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/questionnaire/QuestionnaireViewModel.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/questionnaire/QuestionnaireViewModel.kt @@ -826,7 +826,7 @@ constructor( val questionnaireItemsMap = questionnaire.item.associateBy { it.linkId } // Only validate items that are present on both Questionnaire and the QuestionnaireResponse - questionnaireResponse.item.forEach { + questionnaireResponse.copy().item.forEach { if (questionnaireItemsMap.containsKey(it.linkId)) { val questionnaireItem = questionnaireItemsMap.getValue(it.linkId) validQuestionnaireResponseItems.add(it) diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/TestHelper.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/TestHelper.kt new file mode 100644 index 0000000000..8d9c0fc277 --- /dev/null +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/TestHelper.kt @@ -0,0 +1,31 @@ +/* + * Copyright 2021-2024 Ona Systems, Inc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.smartregister.fhircore.quest + +import ca.uhn.fhir.context.FhirContext +import ca.uhn.fhir.parser.IParser +import org.hl7.fhir.instance.model.api.IBaseResource +import org.junit.Assert + +private val printer: IParser = FhirContext.forR4().newJsonParser() + +fun assertResourceEquals(expected: T, actual: T) { + Assert.assertEquals( + printer.encodeResourceToString(expected), + printer.encodeResourceToString(actual), + ) +} diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/questionnaire/QuestionnaireViewModelTest.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/questionnaire/QuestionnaireViewModelTest.kt index 244cd3e72d..6362624910 100644 --- a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/questionnaire/QuestionnaireViewModelTest.kt +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/questionnaire/QuestionnaireViewModelTest.kt @@ -110,6 +110,7 @@ import org.smartregister.fhircore.engine.util.extension.valueToString import org.smartregister.fhircore.engine.util.extension.yesterday import org.smartregister.fhircore.engine.util.fhirpath.FhirPathDataExtractor import org.smartregister.fhircore.quest.app.fakes.Faker +import org.smartregister.fhircore.quest.assertResourceEquals import org.smartregister.fhircore.quest.robolectric.RobolectricTest import org.smartregister.fhircore.quest.ui.questionnaire.QuestionnaireViewModel.Companion.CONTAINED_LIST_TITLE import org.smartregister.model.practitioner.FhirPractitionerDetails @@ -804,7 +805,7 @@ class QuestionnaireViewModelTest : RobolectricTest() { } @Test - fun testValidateQuestionnaireResponseWithRepeatsGroup() = runTest { + fun testValidateQuestionnaireResponseWithRepeatedGroup() = runTest { val questionnaireString = """ { @@ -901,9 +902,10 @@ class QuestionnaireViewModelTest : RobolectricTest() { } @Test - fun testValidateQuestionnaireResponseWithNestedRepeatsGroup() = runTest { - val questionnaireString = - """ + fun testValidateQuestionnaireResponseWithNestedRepeatedGroupShouldNotUpdateTheOriginalQuestionnaireResponse() = + runTest { + val questionnaireString = + """ { "resourceType": "Questionnaire", "item": [ @@ -949,9 +951,9 @@ class QuestionnaireViewModelTest : RobolectricTest() { ] } """ - .trimIndent() - val questionnaireResponseString = - """ + .trimIndent() + val questionnaireResponseString = + """ { "resourceType": "QuestionnaireResponse", "item": [ @@ -1010,18 +1012,21 @@ class QuestionnaireViewModelTest : RobolectricTest() { ] } """ - .trimIndent() - val questionnaire = parser.parseResource(questionnaireString) as Questionnaire - val questionnaireResponse = - parser.parseResource(questionnaireResponseString) as QuestionnaireResponse - val result = - questionnaireViewModel.validateQuestionnaireResponse( - questionnaire, - questionnaireResponse, - context, - ) - Assert.assertTrue(result) - } + .trimIndent() + val questionnaire = parser.parseResource(questionnaireString) as Questionnaire + val actualQuestionnaireResponse = + parser.parseResource(questionnaireResponseString) as QuestionnaireResponse + val result = + questionnaireViewModel.validateQuestionnaireResponse( + questionnaire, + actualQuestionnaireResponse, + context, + ) + val expectedQuestionnaireResponse = + parser.parseResource(questionnaireResponseString) as QuestionnaireResponse + Assert.assertTrue(result) + assertResourceEquals(expectedQuestionnaireResponse, actualQuestionnaireResponse) + } @Test fun testExecuteCqlShouldInvokeRunCqlLibrary() = runTest {