Skip to content

Commit

Permalink
Add tests for repeating groups in QuestionnaireResponseValidatorTest
Browse files Browse the repository at this point in the history
  • Loading branch information
LZRS committed Dec 17, 2024
1 parent a1638ae commit 1c86cae
Showing 1 changed file with 137 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import android.content.Context
import android.os.Build
import androidx.test.core.app.ApplicationProvider
import com.google.android.fhir.datacapture.extensions.EXTENSION_HIDDEN_URL
import com.google.android.fhir.datacapture.extensions.packRepeatedGroups
import com.google.common.truth.Truth.assertThat
import java.math.BigDecimal
import kotlinx.coroutines.test.runTest
Expand Down Expand Up @@ -596,6 +597,79 @@ class QuestionnaireResponseValidatorTest {
)
}

@Test
fun `validation fails for required item in a questionnaire repeating group item with answer value`() {
val questionnaire1 =
Questionnaire().apply {
url = "questionnaire-1"
addItem(
Questionnaire.QuestionnaireItemComponent(
StringType("group-1"),
Enumeration(
Questionnaire.QuestionnaireItemTypeEnumFactory(),
Questionnaire.QuestionnaireItemType.GROUP,
),
)
.apply {
repeats = true
addItem(
Questionnaire.QuestionnaireItemComponent(
StringType("question-0"),
Enumeration(
Questionnaire.QuestionnaireItemTypeEnumFactory(),
Questionnaire.QuestionnaireItemType.INTEGER,
),
)
.apply { required = true },
)
},
)
}

val questionnaireResponse1 =
QuestionnaireResponse()
.apply {
questionnaire = "questionnaire-1"
addItem(
QuestionnaireResponse.QuestionnaireResponseItemComponent(StringType("group-1")).apply {
addItem(
QuestionnaireResponse.QuestionnaireResponseItemComponent(StringType("question-0"))
.apply {
addAnswer(
QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent().apply {
value = IntegerType(1)
},
)
},
)
},
)

addItem(
QuestionnaireResponse.QuestionnaireResponseItemComponent(StringType("group-1")).apply {
addItem(
QuestionnaireResponse.QuestionnaireResponseItemComponent(StringType("question-0")),
)
},
)
}
.apply { packRepeatedGroups(questionnaire1) }

runTest {
val result =
QuestionnaireResponseValidator.validateQuestionnaireResponse(
questionnaire1,
questionnaireResponse1,
context,
)

assertThat(result.keys).containsExactly("question-0", "group-1")
assertThat(result["question-0"]!!.first()).isInstanceOf(Invalid::class.java)
assertThat((result["question-0"]!!.first() as Invalid).getSingleStringValidationMessage())
.isEqualTo("Missing answer for required field.")
}
}

@Test
fun `check passes if questionnaire response matches questionnaire`() {
QuestionnaireResponseValidator.checkQuestionnaireResponse(
Expand Down Expand Up @@ -1653,6 +1727,69 @@ class QuestionnaireResponseValidatorTest {
)
}

@Test
fun `check fails for wrong answer type to a nested question in repeating group`() {
assertException_checkQuestionnaireResponse_throwsIllegalArgumentException(
Questionnaire().apply {
url = "questionnaire-1"
addItem(
Questionnaire.QuestionnaireItemComponent(
StringType("group-1"),
Enumeration(
Questionnaire.QuestionnaireItemTypeEnumFactory(),
Questionnaire.QuestionnaireItemType.GROUP,
),
)
.apply {
repeats = true
addItem(
Questionnaire.QuestionnaireItemComponent(
StringType("question-0"),
Enumeration(
Questionnaire.QuestionnaireItemTypeEnumFactory(),
Questionnaire.QuestionnaireItemType.INTEGER,
),
),
)
},
)
},
QuestionnaireResponse().apply {
questionnaire = "questionnaire-1"
addItem(
QuestionnaireResponse.QuestionnaireResponseItemComponent(StringType("group-1")).apply {
addItem(
QuestionnaireResponse.QuestionnaireResponseItemComponent(StringType("question-0"))
.apply {
addAnswer(
QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent().apply {
value = IntegerType(1)
},
)
},
)
},
)

addItem(
QuestionnaireResponse.QuestionnaireResponseItemComponent(StringType("group-1")).apply {
addItem(
QuestionnaireResponse.QuestionnaireResponseItemComponent(StringType("question-0"))
.apply {
addAnswer(
QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent().apply {
value = DecimalType(2.0)
},
)
},
)
},
)
},
"Mismatching question type INTEGER and answer type decimal for question-0",
)
}

private fun assertException_checkQuestionnaireResponse_throwsIllegalArgumentException(
questionnaire: Questionnaire,
questionnaireResponse: QuestionnaireResponse,
Expand Down

0 comments on commit 1c86cae

Please sign in to comment.