Skip to content

Commit

Permalink
Merge b95b4cf into b6bf7cc
Browse files Browse the repository at this point in the history
  • Loading branch information
mattiuus committed Apr 25, 2019
2 parents b6bf7cc + b95b4cf commit f5e4a00
Show file tree
Hide file tree
Showing 6 changed files with 82 additions and 11 deletions.
2 changes: 1 addition & 1 deletion hapi-fhir-converter/pom.xml
Expand Up @@ -84,7 +84,7 @@
<dependency>
<groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>hapi-fhir-client</artifactId>
<version>${project.version}</version>
<version>3.6.0</version>
<scope>test</scope>
</dependency>
<dependency>
Expand Down
Expand Up @@ -34,6 +34,11 @@
import org.hl7.fhir.exceptions.FHIRException;
import org.hl7.fhir.r4.model.*;
import org.hl7.fhir.r4.model.Expression.ExpressionLanguage;
import org.hl7.fhir.r4.model.BooleanType;
import org.hl7.fhir.r4.model.Identifier;
import org.hl7.fhir.r4.model.Reference;
import org.hl7.fhir.r4.model.Type;
import org.hl7.fhir.r4.model.UriType;
import org.hl7.fhir.r4.model.HealthcareService.HealthcareServiceEligibilityComponent;
import org.hl7.fhir.utilities.Utilities;

Expand Down
Expand Up @@ -255,7 +255,7 @@ public boolean isNoTerminologyChecks() {
}

/**
* Sets a customized {@link IEnableWhenEvaluator} which is injected to created InstanceValidators
* Sets a function which creates {@link IEnableWhenEvaluator} instance which is injected to the InstanceValidator created during validation
*/
public void setEnableWhenEvaluatorSupplier(
Function<IWorkerContext, IEnableWhenEvaluator> enableWhenEvaluatorSupplier) {
Expand Down Expand Up @@ -294,7 +294,7 @@ protected List<ValidationMessage> validate(final FhirContext theCtx, String theI
v.setAnyExtensionsAllowed(isAnyExtensionsAllowed());
v.setResourceIdRule(IdStatus.OPTIONAL);
v.setNoTerminologyChecks(isNoTerminologyChecks());
v.setEnableWhenEvaluator(enableWhenEvaluatorSupplier.apply(wrappedWorkerContext));
v.setMyEnableWhenEvaluator(enableWhenEvaluatorSupplier.apply(wrappedWorkerContext));
v.setErrorForUnknownProfiles(isErrorForUnknownProfiles());
v.getExtensionDomains().addAll(extensionDomains);

Expand Down
Expand Up @@ -48,7 +48,6 @@ public boolean checkConditionResults(List<EnableWhenResult> evaluationResults,

protected EnableWhenResult evaluateCondition(QuestionnaireItemEnableWhenComponent enableCondition,
Element questionnaireResponse, String linkId) {
//TODO: Fix EnableWhenResult stuff
List<Element> answerItems = findQuestionAnswers(questionnaireResponse,
enableCondition.getQuestion());
QuestionnaireItemOperator operator = enableCondition.getOperator();
Expand Down
Expand Up @@ -2506,7 +2506,7 @@ public void setAllowXsiLocation(boolean allowXsiLocation) {
this.allowXsiLocation = allowXsiLocation;
}

public void setEnableWhenEvaluator(IEnableWhenEvaluator myEnableWhenEvaluator) {
public void setMyEnableWhenEvaluator(IEnableWhenEvaluator myEnableWhenEvaluator) {
this.myEnableWhenEvaluator = myEnableWhenEvaluator;
}

Expand Down Expand Up @@ -2800,8 +2800,10 @@ private void validateQuestionannaireResponseItem(Questionnaire qsrc, Questionnai
element.getNamedChildren("answer", answers);
if (inProgress)
warning(errors, IssueType.REQUIRED, element.line(), element.col(), stack.getLiteralPath(), isAnswerRequirementFulfilled(qItem, answers), "No response answer found for required item "+qItem.getLinkId());
else
else if(myEnableWhenEvaluator.isQuestionEnabled(qItem, questionnaireResponseRoot))
rule(errors, IssueType.REQUIRED, element.line(), element.col(), stack.getLiteralPath(), isAnswerRequirementFulfilled(qItem, answers), "No response answer found for required item "+qItem.getLinkId());
else if (!answers.isEmpty()) // items without answers should be allowed, but not items with answers to questions that are disabled
rule(errors, IssueType.INVALID, element.line(), element.col(), stack.getLiteralPath(), !isAnswerRequirementFulfilled(qItem, answers), "Item has answer, even though it is not enabled "+qItem.getLinkId());
if (answers.size() > 1)
rule(errors, IssueType.INVALID, answers.get(1).line(), answers.get(1).col(), stack.getLiteralPath(), qItem.getRepeats(), "Only one response answer item with this linkId allowed");

Expand Down Expand Up @@ -2945,8 +2947,7 @@ private void validateQuestionannaireResponseItems(Questionnaire qsrc, List<Quest
// ok, now we have a list of known items, grouped by linkId. We've made an error for anything out of order
for (QuestionnaireItemComponent qItem : qItems) {
List<Element> mapItem = map.get(qItem.getLinkId());
if (mapItem != null){
rule(errors, IssueType.INVALID, element.line(), element.col(), stack.getLiteralPath(), myEnableWhenEvaluator.isQuestionEnabled(qItem, questionnaireResponseRoot), "Item with linkId [{0}] has answer, even though it is not enabled", qItem.getLinkId());
if (mapItem != null) {
validateQuestionannaireResponseItem(qsrc, qItem, errors, mapItem, stack, inProgress, questionnaireResponseRoot);
} else {
//item is missing, is the question enabled?
Expand Down
Expand Up @@ -349,7 +349,6 @@ public void testMissingRequiredQuestion() {

@Test
public void testEnableWhenWithHasAnswerTrueDisablesQuestionWhenNoAnswerIsPresent() {

Questionnaire q = new Questionnaire();
q.addItem().setLinkId("link0").setRequired(false).setType(QuestionnaireItemType.STRING);
q.addItem().setLinkId("link1").setRequired(true).addEnableWhen().setQuestion("link0").setHasAnswer(true);
Expand All @@ -373,7 +372,31 @@ public void testRequiredQuestionQuantityWithEnableWhenHidesQuestionHasAnswerTrue
Questionnaire q = new Questionnaire();
q.addItem().setLinkId("link0").setRequired(false).setType(QuestionnaireItemType.QUANTITY);

//link1 question is enabled when link0 has answer
// create the questionnaire
QuestionnaireItemComponent item1 = new QuestionnaireItemComponent();
item1.setLinkId("link1").setRequired(true).addEnableWhen().setQuestion("link0").setHasAnswer(true);
q.addItem(item1);

QuestionnaireResponse qa = new QuestionnaireResponse();
qa.setStatus(QuestionnaireResponseStatus.COMPLETED);

qa.getQuestionnaire().setReference(QUESTIONNAIRE_URL);

String reference = qa.getQuestionnaire().getReference();
when(myValSupport.fetchResource(any(FhirContext.class), eq(Questionnaire.class), eq(reference))).thenReturn(q);
ValidationResult errors = myVal.validateWithResult(qa);

ourLog.info(errors.toString());
assertThat(errors.toString(), containsString("No issues"));
}

@Test
public void testRequiredQuestionWithEnableWhenHidesQuestion() {

Questionnaire q = new Questionnaire();
q.addItem().setLinkId("link0").setRequired(false).setType(QuestionnaireItemType.STRING);

// create the questionnaire
QuestionnaireItemComponent item1 = new QuestionnaireItemComponent();
item1.setLinkId("link1").setRequired(true);
q.addItem(item1);
Expand Down Expand Up @@ -425,7 +448,6 @@ public void testRequiredQuestionQuantityWithEnableWhenHidesQuestionValue() {

@Test
public void testRequiredQuestionQuantityWithEnableWhenEnablesQuestionValue() {

Questionnaire q = new Questionnaire();
q.addItem().setLinkId("link0").setRequired(false).setType(QuestionnaireItemType.QUANTITY);

Expand Down Expand Up @@ -531,6 +553,50 @@ public void testGivenQuestionIsNotEnabledWithEnableWhenAnswersAreReportedAsError
assertThat(errors.toString(), Matchers.not(containsString("No issues")));
}

@Test
public void testGivenQuestionIsNotEnabledWithEnableWhenButHasItemsWithoutAnswersAreOk() throws Exception {
Questionnaire q = new Questionnaire();
q.addItem().setLinkId("link0").setRequired(false).setType(QuestionnaireItemType.STRING);
q.addItem().setLinkId("link2").setRequired(false).setType(QuestionnaireItemType.STRING).addEnableWhen().setQuestion("link0").setHasAnswer(true);

QuestionnaireResponse qr = new QuestionnaireResponse();
qr.setStatus(QuestionnaireResponseStatus.COMPLETED);
qr.getQuestionnaire().setReference(QUESTIONNAIRE_URL);

qr.addItem().setLinkId("link2");

String reference = qr.getQuestionnaire().getReference();
when(myValSupport.fetchResource(any(FhirContext.class), eq(Questionnaire.class), eq(reference))).thenReturn(q);

ValidationResult errors = myVal.validateWithResult(qr);

assertThat(errors.toString(), containsString("No issues"));
}

@Test
public void testGivenQuestionIsNotEnabledWithEnableWhenButHasItemsWithoutAnswersAreOk2() throws Exception {
Questionnaire q = new Questionnaire();
q.addItem().setLinkId("link0").setRequired(false).setType(QuestionnaireItemType.STRING);
q.addItem().setLinkId("link1").setRequired(false).setType(QuestionnaireItemType.STRING);
q.addItem().setLinkId("link2").setRequired(true).setType(QuestionnaireItemType.STRING).addEnableWhen().setQuestion("link0").setHasAnswer(true);

QuestionnaireResponse qr = new QuestionnaireResponse();
qr.setStatus(QuestionnaireResponseStatus.COMPLETED);
qr.getQuestionnaire().setReference(QUESTIONNAIRE_URL);
qr.addItem().setLinkId("link0");

qr.addItem().setLinkId("link1").addAnswer().setValue(new StringType("Answer"));

qr.addItem().setLinkId("link2");

String reference = qr.getQuestionnaire().getReference();
when(myValSupport.fetchResource(any(FhirContext.class), eq(Questionnaire.class), eq(reference))).thenReturn(q);

ValidationResult errors = myVal.validateWithResult(qr);

assertThat(errors.toString(), containsString("No issues"));
}

@Test
public void testGivenQuestionnaireResponseHasSiblingItemsWhenTheyShouldBeChildItems() throws Exception {
Questionnaire q = new Questionnaire();
Expand Down

0 comments on commit f5e4a00

Please sign in to comment.