Merge pull request #886 from hdconradi/instance-validator-npe-on-itemtype

Instance validator NPE on itemtype
This commit is contained in:
James Agnew 2018-05-24 05:58:42 -04:00 committed by GitHub
commit 6d8ebe2df1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 316 additions and 11 deletions

View File

@ -2588,19 +2588,23 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
break;
case CHOICE:
String itemType=validateQuestionnaireResponseItemType(errors, answer, ns, "Coding", "date", "time", "integer", "string");
if (itemType.equals("Coding")) validateAnswerCode(errors, answer, ns, qsrc, qItem, false);
else if (itemType.equals("date")) checkOption(errors, answer, ns, qsrc, qItem, "date");
else if (itemType.equals("time")) checkOption(errors, answer, ns, qsrc, qItem, "time");
else if (itemType.equals("integer")) checkOption(errors, answer, ns, qsrc, qItem, "integer");
else if (itemType.equals("string")) checkOption(errors, answer, ns, qsrc, qItem, "string");
if (itemType != null) {
if (itemType.equals("Coding")) validateAnswerCode(errors, answer, ns, qsrc, qItem, false);
else if (itemType.equals("date")) checkOption(errors, answer, ns, qsrc, qItem, "date");
else if (itemType.equals("time")) checkOption(errors, answer, ns, qsrc, qItem, "time");
else if (itemType.equals("integer")) checkOption(errors, answer, ns, qsrc, qItem, "integer");
else if (itemType.equals("string")) checkOption(errors, answer, ns, qsrc, qItem, "string");
}
break;
case OPENCHOICE:
itemType=validateQuestionnaireResponseItemType(errors, answer, ns, "Coding", "date", "time", "integer", "string");
if (itemType.equals("Coding")) validateAnswerCode(errors, answer, ns, qsrc, qItem, true);
else if (itemType.equals("date")) checkOption(errors, answer, ns, qsrc, qItem, "date");
else if (itemType.equals("time")) checkOption(errors, answer, ns, qsrc, qItem, "time");
else if (itemType.equals("integer")) checkOption(errors, answer, ns, qsrc, qItem, "integer");
else if (itemType.equals("string")) checkOption(errors, answer, ns, qsrc, qItem, "string", true);
if (itemType != null) {
if (itemType.equals("Coding")) validateAnswerCode(errors, answer, ns, qsrc, qItem, true);
else if (itemType.equals("date")) checkOption(errors, answer, ns, qsrc, qItem, "date");
else if (itemType.equals("time")) checkOption(errors, answer, ns, qsrc, qItem, "time");
else if (itemType.equals("integer")) checkOption(errors, answer, ns, qsrc, qItem, "integer");
else if (itemType.equals("string")) checkOption(errors, answer, ns, qsrc, qItem, "string", true);
}
break;
case QUESTION:
case NULL:

View File

@ -1,6 +1,7 @@
package org.hl7.fhir.dstu3.hapi.validation;
import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.parser.IParser;
import ca.uhn.fhir.util.TestUtil;
import ca.uhn.fhir.validation.FhirValidator;
import ca.uhn.fhir.validation.ResultSeverityEnum;
@ -216,6 +217,156 @@ public class QuestionnaireResponseValidatorDstu3Test {
assertThat(errors.toString(), containsString("No response found for required item link0"));
}
@Test
public void testEmbeddedItemInChoice() {
String questionnaireRef = "http://example.com/Questionnaire/q1";
String valueSetRef = "http://somevalueset";
String codeSystemUrl = "http://codesystems.com/system";
String codeValue = "code0";
// create the questionnaire
QuestionnaireItemComponent item1 = new QuestionnaireItemComponent();
item1.setLinkId("link1")
.setType(QuestionnaireItemType.CHOICE)
.setOptions(new Reference(valueSetRef));
item1.addItem().setLinkId("link11")
.setType(QuestionnaireItemType.TEXT);
Questionnaire q = new Questionnaire();
q.addItem(item1);
when(myValSupport.fetchResource(any(FhirContext.class), eq(Questionnaire.class), eq(questionnaireRef)))
.thenReturn(q);
CodeSystem codeSystem = new CodeSystem();
codeSystem.setContent(CodeSystemContentMode.COMPLETE);
codeSystem.setUrl(codeSystemUrl);
codeSystem.addConcept().setCode(codeValue);
when(myValSupport.fetchCodeSystem(any(FhirContext.class), eq(codeSystemUrl)))
.thenReturn(codeSystem);
ValueSet options = new ValueSet();
options.getCompose().addInclude().setSystem(codeSystemUrl).addConcept().setCode(codeValue);
when(myValSupport.fetchResource(any(FhirContext.class), eq(ValueSet.class), eq(valueSetRef)))
.thenReturn(options);
when(myValSupport.validateCode(any(FhirContext.class), eq(codeSystemUrl), eq(codeValue), any(String.class)))
.thenReturn(new CodeValidationResult(new ConceptDefinitionComponent(new CodeType(codeValue))));
IParser xmlParser = ourCtx.newXmlParser().setPrettyPrint(true);
String qXml = xmlParser.encodeResourceToString(q);
ourLog.info(qXml);
// create the response
QuestionnaireResponse qa = new QuestionnaireResponse();
qa.setStatus(QuestionnaireResponseStatus.INPROGRESS);
qa.getQuestionnaire().setReference(questionnaireRef);
qa.addItem().setLinkId("link1")
.addAnswer()
.addItem().setLinkId("link11");
String rXml = xmlParser.encodeResourceToString(qa);
ourLog.info(rXml);
ValidationResult errors = myVal.validateWithResult(qa);
ourLog.info(errors.toString());
assertThat(errors.getMessages(), empty());
}
@Test
public void testEmbeddedItemInOpenChoice() {
String questionnaireRef = "http://example.com/Questionnaire/q1";
String valueSetRef = "http://somevalueset";
String codeSystemUrl = "http://codesystems.com/system";
String codeValue = "code0";
// create the questionnaire
QuestionnaireItemComponent item1 = new QuestionnaireItemComponent();
item1.setLinkId("link1")
.setType(QuestionnaireItemType.OPENCHOICE)
.setOptions(new Reference(valueSetRef));
item1.addItem().setLinkId("link11")
.setType(QuestionnaireItemType.TEXT);
Questionnaire q = new Questionnaire();
q.addItem(item1);
when(myValSupport.fetchResource(any(FhirContext.class), eq(Questionnaire.class), eq(questionnaireRef)))
.thenReturn(q);
CodeSystem codeSystem = new CodeSystem();
codeSystem.setContent(CodeSystemContentMode.COMPLETE);
codeSystem.setUrl(codeSystemUrl);
codeSystem.addConcept().setCode(codeValue);
when(myValSupport.fetchCodeSystem(any(FhirContext.class), eq(codeSystemUrl)))
.thenReturn(codeSystem);
ValueSet options = new ValueSet();
options.getCompose().addInclude().setSystem(codeSystemUrl).addConcept().setCode(codeValue);
when(myValSupport.fetchResource(any(FhirContext.class), eq(ValueSet.class), eq(valueSetRef)))
.thenReturn(options);
when(myValSupport.validateCode(any(FhirContext.class), eq(codeSystemUrl), eq(codeValue), any(String.class)))
.thenReturn(new CodeValidationResult(new ConceptDefinitionComponent(new CodeType(codeValue))));
IParser xmlParser = ourCtx.newXmlParser().setPrettyPrint(true);
String qXml = xmlParser.encodeResourceToString(q);
ourLog.info(qXml);
// create the response
QuestionnaireResponse qa = new QuestionnaireResponse();
qa.setStatus(QuestionnaireResponseStatus.INPROGRESS);
qa.getQuestionnaire().setReference(questionnaireRef);
qa.addItem().setLinkId("link1")
.addAnswer()
.addItem().setLinkId("link11");
String rXml = xmlParser.encodeResourceToString(qa);
ourLog.info(rXml);
ValidationResult errors = myVal.validateWithResult(qa);
ourLog.info(errors.toString());
assertThat(errors.getMessages(), empty());
}
@Test
public void testEmbeddedItemInString() {
String questionnaireRef = "http://example.com/Questionnaire/q1";
// create the questionnaire
QuestionnaireItemComponent item1 = new QuestionnaireItemComponent();
item1.setLinkId("link1")
.setType(QuestionnaireItemType.TEXT);
item1.addItem().setLinkId("link11")
.setType(QuestionnaireItemType.TEXT);
Questionnaire q = new Questionnaire();
q.addItem(item1);
when(myValSupport.fetchResource(any(FhirContext.class), eq(Questionnaire.class), eq(questionnaireRef)))
.thenReturn(q);
IParser xmlParser = ourCtx.newXmlParser().setPrettyPrint(true);
String qXml = xmlParser.encodeResourceToString(q);
ourLog.info(qXml);
// create the response
QuestionnaireResponse qa = new QuestionnaireResponse();
qa.setStatus(QuestionnaireResponseStatus.INPROGRESS);
qa.getQuestionnaire().setReference(questionnaireRef);
qa.addItem().setLinkId("link1")
.addAnswer()
.addItem().setLinkId("link11");
String rXml = xmlParser.encodeResourceToString(qa);
ourLog.info(rXml);
ValidationResult errors = myVal.validateWithResult(qa);
ourLog.info(errors.toString());
assertThat(errors.getMessages(), empty());
}
@Test
public void testValidateQuestionnaireResponseWithValueSetChoiceAnswer() {
/*

View File

@ -1,6 +1,7 @@
package org.hl7.fhir.r4.validation;
import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.parser.IParser;
import ca.uhn.fhir.util.TestUtil;
import ca.uhn.fhir.validation.FhirValidator;
import ca.uhn.fhir.validation.ResultSeverityEnum;
@ -221,7 +222,156 @@ public class QuestionnaireResponseValidatorR4Test {
}
@Test
public void testMissingRequiredAnswer() {
public void testEmbeddedItemInChoice() {
String questionnaireRef = "http://example.com/Questionnaire/q1";
String valueSetRef = "http://somevalueset";
String codeSystemUrl = "http://codesystems.com/system";
String codeValue = "code0";
// create the questionnaire
QuestionnaireItemComponent item1 = new QuestionnaireItemComponent();
item1.setLinkId("link1")
.setType(QuestionnaireItemType.CHOICE)
.setOptions(valueSetRef);
item1.addItem().setLinkId("link11")
.setType(QuestionnaireItemType.TEXT);
Questionnaire q = new Questionnaire();
q.addItem(item1);
when(myValSupport.fetchResource(any(FhirContext.class), eq(Questionnaire.class), eq(questionnaireRef)))
.thenReturn(q);
CodeSystem codeSystem = new CodeSystem();
codeSystem.setContent(CodeSystemContentMode.COMPLETE);
codeSystem.setUrl(codeSystemUrl);
codeSystem.addConcept().setCode(codeValue);
when(myValSupport.fetchCodeSystem(any(FhirContext.class), eq(codeSystemUrl)))
.thenReturn(codeSystem);
ValueSet options = new ValueSet();
options.getCompose().addInclude().setSystem(codeSystemUrl).addConcept().setCode(codeValue);
when(myValSupport.fetchResource(any(FhirContext.class), eq(ValueSet.class), eq(valueSetRef)))
.thenReturn(options);
when(myValSupport.validateCode(any(FhirContext.class), eq(codeSystemUrl), eq(codeValue), any(String.class)))
.thenReturn(new CodeValidationResult(new ConceptDefinitionComponent(new CodeType(codeValue))));
IParser xmlParser = ourCtx.newXmlParser().setPrettyPrint(true);
String qXml = xmlParser.encodeResourceToString(q);
ourLog.info(qXml);
// create the response
QuestionnaireResponse qa = new QuestionnaireResponse();
qa.setStatus(QuestionnaireResponseStatus.INPROGRESS);
qa.setQuestionnaire(questionnaireRef);
qa.addItem().setLinkId("link1")
.addAnswer()
.addItem().setLinkId("link11");
String rXml = xmlParser.encodeResourceToString(qa);
ourLog.info(rXml);
ValidationResult errors = myVal.validateWithResult(qa);
ourLog.info(errors.toString());
assertThat(errors.getMessages(), empty());
}
@Test
public void testEmbeddedItemInOpenChoice() {
String questionnaireRef = "http://example.com/Questionnaire/q1";
String valueSetRef = "http://somevalueset";
String codeSystemUrl = "http://codesystems.com/system";
String codeValue = "code0";
// create the questionnaire
QuestionnaireItemComponent item1 = new QuestionnaireItemComponent();
item1.setLinkId("link1")
.setType(QuestionnaireItemType.OPENCHOICE)
.setOptions(valueSetRef);
item1.addItem().setLinkId("link11")
.setType(QuestionnaireItemType.TEXT);
Questionnaire q = new Questionnaire();
q.addItem(item1);
when(myValSupport.fetchResource(any(FhirContext.class), eq(Questionnaire.class), eq(questionnaireRef)))
.thenReturn(q);
CodeSystem codeSystem = new CodeSystem();
codeSystem.setContent(CodeSystemContentMode.COMPLETE);
codeSystem.setUrl(codeSystemUrl);
codeSystem.addConcept().setCode(codeValue);
when(myValSupport.fetchCodeSystem(any(FhirContext.class), eq(codeSystemUrl)))
.thenReturn(codeSystem);
ValueSet options = new ValueSet();
options.getCompose().addInclude().setSystem(codeSystemUrl).addConcept().setCode(codeValue);
when(myValSupport.fetchResource(any(FhirContext.class), eq(ValueSet.class), eq(valueSetRef)))
.thenReturn(options);
when(myValSupport.validateCode(any(FhirContext.class), eq(codeSystemUrl), eq(codeValue), any(String.class)))
.thenReturn(new CodeValidationResult(new ConceptDefinitionComponent(new CodeType(codeValue))));
IParser xmlParser = ourCtx.newXmlParser().setPrettyPrint(true);
String qXml = xmlParser.encodeResourceToString(q);
ourLog.info(qXml);
// create the response
QuestionnaireResponse qa = new QuestionnaireResponse();
qa.setStatus(QuestionnaireResponseStatus.INPROGRESS);
qa.setQuestionnaire(questionnaireRef);
qa.addItem().setLinkId("link1")
.addAnswer()
.addItem().setLinkId("link11");
String rXml = xmlParser.encodeResourceToString(qa);
ourLog.info(rXml);
ValidationResult errors = myVal.validateWithResult(qa);
ourLog.info(errors.toString());
assertThat(errors.getMessages(), empty());
}
@Test
public void testEmbeddedItemInString() {
String questionnaireRef = "http://example.com/Questionnaire/q1";
// create the questionnaire
QuestionnaireItemComponent item1 = new QuestionnaireItemComponent();
item1.setLinkId("link1")
.setType(QuestionnaireItemType.TEXT);
item1.addItem().setLinkId("link11")
.setType(QuestionnaireItemType.TEXT);
Questionnaire q = new Questionnaire();
q.addItem(item1);
when(myValSupport.fetchResource(any(FhirContext.class), eq(Questionnaire.class), eq(questionnaireRef)))
.thenReturn(q);
IParser xmlParser = ourCtx.newXmlParser().setPrettyPrint(true);
String qXml = xmlParser.encodeResourceToString(q);
ourLog.info(qXml);
// create the response
QuestionnaireResponse qa = new QuestionnaireResponse();
qa.setStatus(QuestionnaireResponseStatus.INPROGRESS);
qa.setQuestionnaire(questionnaireRef);
qa.addItem().setLinkId("link1")
.addAnswer()
.addItem().setLinkId("link11");
String rXml = xmlParser.encodeResourceToString(qa);
ourLog.info(rXml);
ValidationResult errors = myVal.validateWithResult(qa);
ourLog.info(errors.toString());
assertThat(errors.getMessages(), empty());
}
public void testMissingRequiredAnswer() {
Questionnaire q = new Questionnaire();
q.addItem().setLinkId("link0")
.setType(QuestionnaireItemType.STRING)