mirror of
https://github.com/hapifhir/hapi-fhir.git
synced 2025-02-16 18:05:19 +00:00
Add validation module for QuestionnaireAnswers
This commit is contained in:
parent
818c40498c
commit
3bba0c0425
@ -0,0 +1,22 @@
|
|||||||
|
package ca.uhn.fhir.validation;
|
||||||
|
|
||||||
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
|
import org.hl7.fhir.instance.model.api.IIdType;
|
||||||
|
|
||||||
|
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
|
||||||
|
|
||||||
|
public interface IResourceLoader {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load the latest version of a given resource
|
||||||
|
*
|
||||||
|
* @param theType
|
||||||
|
* The type of the resource to load
|
||||||
|
* @param theId
|
||||||
|
* The ID of the resource to load
|
||||||
|
* @throws ResourceNotFoundException
|
||||||
|
* If the resource is not known
|
||||||
|
*/
|
||||||
|
public <T extends IBaseResource> T load(Class<T> theType, IIdType theId) throws ResourceNotFoundException;
|
||||||
|
|
||||||
|
}
|
@ -23,7 +23,7 @@ package ca.uhn.fhir.validation;
|
|||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.rest.server.EncodingEnum;
|
import ca.uhn.fhir.rest.server.EncodingEnum;
|
||||||
|
|
||||||
interface IValidationContext<T> {
|
public interface IValidationContext<T> {
|
||||||
|
|
||||||
FhirContext getFhirContext();
|
FhirContext getFhirContext();
|
||||||
|
|
||||||
|
@ -218,7 +218,6 @@
|
|||||||
<artifactId>maven-compiler-plugin</artifactId>
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
<configuration>
|
<configuration>
|
||||||
<fork>true</fork>
|
<fork>true</fork>
|
||||||
<verbose>true</verbose>
|
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
|
@ -0,0 +1,51 @@
|
|||||||
|
package ca.uhn.fhir.validation;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
|
import org.hl7.fhir.instance.validation.ValidationMessage;
|
||||||
|
|
||||||
|
import ca.uhn.fhir.model.api.Bundle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base class for a bridge between the RI validation tools and HAPI
|
||||||
|
*/
|
||||||
|
abstract class BaseValidatorBridge implements IValidator {
|
||||||
|
|
||||||
|
public BaseValidatorBridge() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void doValidate(IValidationContext<?> theCtx) {
|
||||||
|
List<ValidationMessage> messages = validate(theCtx);
|
||||||
|
|
||||||
|
for (ValidationMessage riMessage : messages) {
|
||||||
|
SingleValidationMessage hapiMessage = new SingleValidationMessage();
|
||||||
|
if (riMessage.getCol() != -1) {
|
||||||
|
hapiMessage.setLocationCol(riMessage.getCol());
|
||||||
|
}
|
||||||
|
if (riMessage.getLine() != -1) {
|
||||||
|
hapiMessage.setLocationLine(riMessage.getLine());
|
||||||
|
}
|
||||||
|
hapiMessage.setLocationString(riMessage.getLocation());
|
||||||
|
hapiMessage.setMessage(riMessage.getMessage());
|
||||||
|
if (riMessage.getLevel() != null) {
|
||||||
|
hapiMessage.setSeverity(ResultSeverityEnum.fromCode(riMessage.getLevel().toCode()));
|
||||||
|
}
|
||||||
|
theCtx.addValidationMessage(hapiMessage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract List<ValidationMessage> validate(IValidationContext<?> theCtx);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void validateBundle(IValidationContext<Bundle> theCtx) {
|
||||||
|
doValidate(theCtx);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void validateResource(IValidationContext<IBaseResource> theCtx) {
|
||||||
|
doValidate(theCtx);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -14,7 +14,6 @@ import javax.xml.parsers.DocumentBuilderFactory;
|
|||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
import org.hl7.fhir.instance.model.OperationOutcome.IssueSeverity;
|
import org.hl7.fhir.instance.model.OperationOutcome.IssueSeverity;
|
||||||
import org.hl7.fhir.instance.model.StructureDefinition;
|
import org.hl7.fhir.instance.model.StructureDefinition;
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
|
||||||
import org.hl7.fhir.instance.utils.WorkerContext;
|
import org.hl7.fhir.instance.utils.WorkerContext;
|
||||||
import org.hl7.fhir.instance.validation.ValidationMessage;
|
import org.hl7.fhir.instance.validation.ValidationMessage;
|
||||||
import org.w3c.dom.Document;
|
import org.w3c.dom.Document;
|
||||||
@ -24,7 +23,6 @@ import org.xml.sax.InputSource;
|
|||||||
|
|
||||||
import ca.uhn.fhir.context.ConfigurationException;
|
import ca.uhn.fhir.context.ConfigurationException;
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.model.api.Bundle;
|
|
||||||
import ca.uhn.fhir.rest.server.EncodingEnum;
|
import ca.uhn.fhir.rest.server.EncodingEnum;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
|
|
||||||
@ -32,9 +30,9 @@ import com.google.gson.Gson;
|
|||||||
import com.google.gson.GsonBuilder;
|
import com.google.gson.GsonBuilder;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
|
|
||||||
public class FhirInstanceValidator implements IValidator {
|
public class FhirInstanceValidator extends BaseValidatorBridge implements IValidator {
|
||||||
|
|
||||||
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(FhirInstanceValidator.class);
|
static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(FhirInstanceValidator.class);
|
||||||
|
|
||||||
private DocumentBuilderFactory myDocBuilderFactory;
|
private DocumentBuilderFactory myDocBuilderFactory;
|
||||||
|
|
||||||
@ -43,7 +41,39 @@ public class FhirInstanceValidator implements IValidator {
|
|||||||
myDocBuilderFactory.setNamespaceAware(true);
|
myDocBuilderFactory.setNamespaceAware(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<ValidationMessage> validate(FhirContext theCtx, String theInput, EncodingEnum theEncoding) {
|
private String determineResourceName(Document theDocument) {
|
||||||
|
Element root = null;
|
||||||
|
|
||||||
|
NodeList list = theDocument.getChildNodes();
|
||||||
|
for (int i = 0; i < list.getLength(); i++) {
|
||||||
|
if (list.item(i) instanceof Element) {
|
||||||
|
root = (Element) list.item(i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
root = theDocument.getDocumentElement();
|
||||||
|
return root.getLocalName();
|
||||||
|
}
|
||||||
|
|
||||||
|
private StructureDefinition loadProfileOrReturnNull(List<ValidationMessage> theMessages, FhirContext theCtx, String theResourceName) {
|
||||||
|
if (isBlank(theResourceName)) {
|
||||||
|
theMessages.add(new ValidationMessage().setLevel(IssueSeverity.FATAL).setMessage("Could not determine resource type from request. Content appears invalid."));
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
String profileCpName = "/org/hl7/fhir/instance/model/profile/" + theResourceName.toLowerCase() + ".profile.xml";
|
||||||
|
String profileText;
|
||||||
|
try {
|
||||||
|
profileText = IOUtils.toString(FhirInstanceValidator.class.getResourceAsStream(profileCpName), "UTF-8");
|
||||||
|
} catch (IOException e1) {
|
||||||
|
theMessages.add(new ValidationMessage().setLevel(IssueSeverity.FATAL).setMessage("No profile found for resource type " + theResourceName));
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
StructureDefinition profile = theCtx.newXmlParser().parseResource(StructureDefinition.class, profileText);
|
||||||
|
return profile;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected List<ValidationMessage> validate(FhirContext theCtx, String theInput, EncodingEnum theEncoding) {
|
||||||
WorkerContext workerContext = new WorkerContext();
|
WorkerContext workerContext = new WorkerContext();
|
||||||
org.hl7.fhir.instance.validation.InstanceValidator v;
|
org.hl7.fhir.instance.validation.InstanceValidator v;
|
||||||
try {
|
try {
|
||||||
@ -97,61 +127,9 @@ public class FhirInstanceValidator implements IValidator {
|
|||||||
return messages;
|
return messages;
|
||||||
}
|
}
|
||||||
|
|
||||||
private StructureDefinition loadProfileOrReturnNull(List<ValidationMessage> theMessages, FhirContext theCtx, String theResourceName) {
|
|
||||||
if (isBlank(theResourceName)) {
|
|
||||||
theMessages.add(new ValidationMessage().setLevel(IssueSeverity.FATAL).setMessage("Could not determine resource type from request. Content appears invalid."));
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
String profileCpName = "/org/hl7/fhir/instance/model/profile/" + theResourceName.toLowerCase() + ".profile.xml";
|
|
||||||
String profileText;
|
|
||||||
try {
|
|
||||||
profileText = IOUtils.toString(FhirInstanceValidator.class.getResourceAsStream(profileCpName), "UTF-8");
|
|
||||||
} catch (IOException e1) {
|
|
||||||
theMessages.add(new ValidationMessage().setLevel(IssueSeverity.FATAL).setMessage("No profile found for resource type " + theResourceName));
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
StructureDefinition profile = theCtx.newXmlParser().parseResource(StructureDefinition.class, profileText);
|
|
||||||
return profile;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String determineResourceName(Document theDocument) {
|
|
||||||
Element root = null;
|
|
||||||
|
|
||||||
NodeList list = theDocument.getChildNodes();
|
|
||||||
for (int i = 0; i < list.getLength(); i++) {
|
|
||||||
if (list.item(i) instanceof Element) {
|
|
||||||
root = (Element) list.item(i);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
root = theDocument.getDocumentElement();
|
|
||||||
return root.getLocalName();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void validateResource(IValidationContext<IBaseResource> theCtx) {
|
protected List<ValidationMessage> validate(IValidationContext<?> theCtx) {
|
||||||
List<ValidationMessage> messages = validate(theCtx.getFhirContext(), theCtx.getResourceAsString(), theCtx.getResourceAsStringEncoding());
|
return validate(theCtx.getFhirContext(), theCtx.getResourceAsString(), theCtx.getResourceAsStringEncoding());
|
||||||
for (ValidationMessage riMessage : messages) {
|
|
||||||
SingleValidationMessage hapiMessage = new SingleValidationMessage();
|
|
||||||
if (riMessage.getCol() != -1) {
|
|
||||||
hapiMessage.setLocationCol(riMessage.getCol());
|
|
||||||
}
|
|
||||||
if (riMessage.getLine() != -1) {
|
|
||||||
hapiMessage.setLocationLine(riMessage.getLine());
|
|
||||||
}
|
|
||||||
hapiMessage.setLocationString(riMessage.getLocation());
|
|
||||||
hapiMessage.setMessage(riMessage.getMessage());
|
|
||||||
if (riMessage.getLevel() != null) {
|
|
||||||
hapiMessage.setSeverity(ResultSeverityEnum.fromCode(riMessage.getLevel().toCode()));
|
|
||||||
}
|
|
||||||
theCtx.addValidationMessage(hapiMessage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void validateBundle(IValidationContext<Bundle> theContext) {
|
|
||||||
// nothing for now
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,139 @@
|
|||||||
|
package ca.uhn.fhir.validation;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.hl7.fhir.instance.model.OperationOutcome.IssueSeverity;
|
||||||
|
import org.hl7.fhir.instance.model.Questionnaire;
|
||||||
|
import org.hl7.fhir.instance.model.QuestionnaireAnswers;
|
||||||
|
import org.hl7.fhir.instance.model.ValueSet;
|
||||||
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
|
import org.hl7.fhir.instance.model.api.IIdType;
|
||||||
|
import org.hl7.fhir.instance.utils.WorkerContext;
|
||||||
|
import org.hl7.fhir.instance.validation.QuestionnaireAnswersValidator;
|
||||||
|
import org.hl7.fhir.instance.validation.ValidationMessage;
|
||||||
|
|
||||||
|
import ca.uhn.fhir.context.RuntimeResourceDefinition;
|
||||||
|
import ca.uhn.fhir.parser.IParser;
|
||||||
|
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
|
||||||
|
import ca.uhn.fhir.util.ResourceReferenceInfo;
|
||||||
|
|
||||||
|
public class FhirQuestionnaireAnswersValidator extends BaseValidatorBridge {
|
||||||
|
|
||||||
|
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(FhirQuestionnaireAnswersValidator.class);
|
||||||
|
private IResourceLoader myResourceLoader;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the class which will be used to load linked resources from the <code>QuestionnaireAnswers</code>. Specifically, if the <code>QuestionnaireAnswers</code> refers to an external (non-contained)
|
||||||
|
* <code>Questionnaire</code>, or to any external (non-contained) <code>ValueSet</code>, the resource loader will be used to fetch those resources during the validation.
|
||||||
|
*
|
||||||
|
* @param theResourceLoader
|
||||||
|
* The resourceloader to use. May be <code>null</code> if no resource loader should be used (in which case any <code>QuestionaireAnswers</code> with external references will fail to
|
||||||
|
* validate.)
|
||||||
|
*/
|
||||||
|
public void setResourceLoader(IResourceLoader theResourceLoader) {
|
||||||
|
myResourceLoader = theResourceLoader;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected List<ValidationMessage> validate(IValidationContext<?> theCtx) {
|
||||||
|
Object resource = theCtx.getResource();
|
||||||
|
if (!(theCtx.getResource() instanceof IBaseResource)) {
|
||||||
|
ourLog.debug("Not validating object of type {}", theCtx.getResource().getClass());
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (resource instanceof QuestionnaireAnswers) {
|
||||||
|
return doValidate(theCtx, (QuestionnaireAnswers) resource);
|
||||||
|
}
|
||||||
|
|
||||||
|
RuntimeResourceDefinition def = theCtx.getFhirContext().getResourceDefinition((IBaseResource) resource);
|
||||||
|
if ("QuestionnaireAnswers".equals(def.getName()) == false) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If we have a non-RI structure, convert it
|
||||||
|
*/
|
||||||
|
|
||||||
|
IParser p = theCtx.getFhirContext().newJsonParser();
|
||||||
|
String string = p.encodeResourceToString((IBaseResource) resource);
|
||||||
|
QuestionnaireAnswers qa = p.parseResource(QuestionnaireAnswers.class, string);
|
||||||
|
|
||||||
|
return doValidate(theCtx, qa);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<ValidationMessage> doValidate(IValidationContext<?> theValCtx, QuestionnaireAnswers theResource) {
|
||||||
|
|
||||||
|
WorkerContext workerCtx = new WorkerContext();
|
||||||
|
ArrayList<ValidationMessage> retVal = new ArrayList<ValidationMessage>();
|
||||||
|
|
||||||
|
if (!loadReferences(theResource, workerCtx, theValCtx, retVal)) {
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
QuestionnaireAnswersValidator val = new QuestionnaireAnswersValidator(workerCtx);
|
||||||
|
|
||||||
|
val.validate(retVal, theResource);
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean loadReferences(IBaseResource theResource, WorkerContext theWorkerCtx, IValidationContext<?> theValCtx, ArrayList<ValidationMessage> theMessages) {
|
||||||
|
List<ResourceReferenceInfo> refs = theValCtx.getFhirContext().newTerser().getAllResourceReferences(theResource);
|
||||||
|
|
||||||
|
List<IBaseResource> newResources = new ArrayList<IBaseResource>();
|
||||||
|
|
||||||
|
for (ResourceReferenceInfo nextRefInfo : refs) {
|
||||||
|
IIdType nextRef = nextRefInfo.getResourceReference().getReferenceElement();
|
||||||
|
String resourceType = nextRef.getResourceType();
|
||||||
|
if ("ValueSet".equals(resourceType)) {
|
||||||
|
if (!theWorkerCtx.getValueSets().containsKey(nextRef.getValue())) {
|
||||||
|
ValueSet resource = tryToLoad(ValueSet.class, nextRef, theMessages);
|
||||||
|
if (resource == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
theWorkerCtx.getValueSets().put(nextRef.getValue(), resource);
|
||||||
|
newResources.add(resource);
|
||||||
|
}
|
||||||
|
} else if ("Questionnaire".equals(resourceType)) {
|
||||||
|
if (!theWorkerCtx.getQuestionnaires().containsKey(nextRef.getValue())) {
|
||||||
|
Questionnaire resource = tryToLoad(Questionnaire.class, nextRef, theMessages);
|
||||||
|
if (resource == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
theWorkerCtx.getQuestionnaires().put(nextRef.getValue(), resource);
|
||||||
|
newResources.add(resource);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (IBaseResource nextAddedResource : newResources) {
|
||||||
|
boolean outcome = loadReferences(nextAddedResource, theWorkerCtx, theValCtx, theMessages);
|
||||||
|
if (!outcome) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private <T extends IBaseResource> T tryToLoad(Class<T> theType, IIdType theReference, List<ValidationMessage> theMessages) {
|
||||||
|
if (myResourceLoader == null) {
|
||||||
|
theMessages.add(new ValidationMessage().setLevel(IssueSeverity.FATAL).setMessage("No resource loader present, could not load " + theReference));
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
T retVal = myResourceLoader.load(theType, theReference);
|
||||||
|
if (retVal == null) {
|
||||||
|
throw new IllegalStateException("ResourceLoader returned null. This is a bug with the resourceloader. Reference was: " + theReference);
|
||||||
|
}
|
||||||
|
return retVal;
|
||||||
|
} catch (ResourceNotFoundException e) {
|
||||||
|
theMessages.add(new ValidationMessage().setLevel(IssueSeverity.FATAL).setMessage("Reference could not be found: " + theReference));
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,124 @@
|
|||||||
|
package ca.uhn.fhir.validation;
|
||||||
|
|
||||||
|
import static org.hamcrest.Matchers.containsString;
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.apache.commons.io.IOUtils;
|
||||||
|
import org.hl7.fhir.instance.model.Coding;
|
||||||
|
import org.hl7.fhir.instance.model.IdType;
|
||||||
|
import org.hl7.fhir.instance.model.Questionnaire;
|
||||||
|
import org.hl7.fhir.instance.model.QuestionnaireAnswers;
|
||||||
|
import org.hl7.fhir.instance.model.Reference;
|
||||||
|
import org.hl7.fhir.instance.model.StringType;
|
||||||
|
import org.hl7.fhir.instance.model.ValueSet;
|
||||||
|
import org.hl7.fhir.instance.model.Questionnaire.AnswerFormat;
|
||||||
|
import org.hl7.fhir.instance.utils.WorkerContext;
|
||||||
|
import org.hl7.fhir.instance.validation.QuestionnaireAnswersValidator;
|
||||||
|
import org.hl7.fhir.instance.validation.ValidationMessage;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.mockito.Mockito;
|
||||||
|
|
||||||
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
|
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
|
||||||
|
|
||||||
|
public class QuestionnaireAnswersValidatorIntegrationTest {
|
||||||
|
private static final FhirContext ourCtx = FhirContext.forDstu2Hl7Org();
|
||||||
|
|
||||||
|
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(QuestionnaireAnswersValidatorIntegrationTest.class);
|
||||||
|
|
||||||
|
private IResourceLoader myResourceLoaderMock;
|
||||||
|
|
||||||
|
private FhirValidator myVal;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void before() {
|
||||||
|
myResourceLoaderMock = mock(IResourceLoader.class);
|
||||||
|
|
||||||
|
FhirQuestionnaireAnswersValidator qaVal = new FhirQuestionnaireAnswersValidator();
|
||||||
|
qaVal.setResourceLoader(myResourceLoaderMock);
|
||||||
|
|
||||||
|
myVal = ourCtx.newValidator();
|
||||||
|
myVal.setValidateAgainstStandardSchema(false);
|
||||||
|
myVal.setValidateAgainstStandardSchematron(false);
|
||||||
|
myVal.registerValidator(qaVal);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAnswerWithWrongType() {
|
||||||
|
Questionnaire q = new Questionnaire();
|
||||||
|
q.getGroup().addQuestion().setLinkId("link0").setRequired(true).setType(AnswerFormat.BOOLEAN);
|
||||||
|
|
||||||
|
when(myResourceLoaderMock.load(Mockito.eq(Questionnaire.class), Mockito.eq(new IdType("http://example.com/Questionnaire/q1")))).thenReturn(q);
|
||||||
|
|
||||||
|
QuestionnaireAnswers qa = new QuestionnaireAnswers();
|
||||||
|
qa.getQuestionnaire().setReference("http://example.com/Questionnaire/q1");
|
||||||
|
qa.getGroup().addQuestion().setLinkId("link0").addAnswer().setValue(new StringType("FOO"));
|
||||||
|
|
||||||
|
ValidationResult result = myVal.validateWithResult(qa);
|
||||||
|
ourLog.info(result.getMessages().toString());
|
||||||
|
assertThat(result.getMessages().toString(), containsString("Answer to question with linkId[link0] found of type [StringType] but this is invalid for question of type [boolean]"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCodedAnswer() {
|
||||||
|
String questionnaireRef = "http://example.com/Questionnaire/q1";
|
||||||
|
|
||||||
|
Questionnaire q = new Questionnaire();
|
||||||
|
q.getGroup().addQuestion().setLinkId("link0").setRequired(false).setType(AnswerFormat.CHOICE).setOptions(new Reference("http://somevalueset/ValueSet/123"));
|
||||||
|
when(myResourceLoaderMock.load(Mockito.eq(Questionnaire.class), Mockito.eq(new IdType("http://example.com/Questionnaire/q1")))).thenReturn(q);
|
||||||
|
|
||||||
|
ValueSet options = new ValueSet();
|
||||||
|
options.getDefine().setSystem("urn:system").addConcept().setCode("code0");
|
||||||
|
when(myResourceLoaderMock.load(Mockito.eq(ValueSet.class), Mockito.eq(new IdType("http://somevalueset/ValueSet/123")))).thenReturn(options);
|
||||||
|
|
||||||
|
QuestionnaireAnswers qa;
|
||||||
|
|
||||||
|
// Good code
|
||||||
|
|
||||||
|
qa = new QuestionnaireAnswers();
|
||||||
|
qa.getQuestionnaire().setReference(questionnaireRef);
|
||||||
|
qa.getGroup().addQuestion().setLinkId("link0").addAnswer().setValue(new Coding().setSystem("urn:system").setCode("code0"));
|
||||||
|
ValidationResult result = myVal.validateWithResult(qa);
|
||||||
|
assertEquals(result.getMessages().toString(), 0, result.getMessages().size());
|
||||||
|
|
||||||
|
// Bad code
|
||||||
|
|
||||||
|
qa = new QuestionnaireAnswers();
|
||||||
|
qa.getQuestionnaire().setReference(questionnaireRef);
|
||||||
|
qa.getGroup().addQuestion().setLinkId("link0").addAnswer().setValue(new Coding().setSystem("urn:system").setCode("code1"));
|
||||||
|
result = myVal.validateWithResult(qa);
|
||||||
|
ourLog.info(result.getMessages().toString());
|
||||||
|
assertThat(result.getMessages().toString(), containsString("myLocationString=QuestionnaireAnswers.group(0).question(0).answer(0)"));
|
||||||
|
assertThat(result.getMessages().toString(), containsString("myMessage=Question with linkId[link0] has answer with system[urn:system] and code[code1] but this is not a valid answer for ValueSet[http://somevalueset/ValueSet/123]"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testUnknownValueSet() {
|
||||||
|
String questionnaireRef = "http://example.com/Questionnaire/q1";
|
||||||
|
|
||||||
|
Questionnaire q = new Questionnaire();
|
||||||
|
q.getGroup().addQuestion().setLinkId("link0").setRequired(false).setType(AnswerFormat.CHOICE).setOptions(new Reference("http://somevalueset/ValueSet/123"));
|
||||||
|
when(myResourceLoaderMock.load(Mockito.eq(Questionnaire.class), Mockito.eq(new IdType("http://example.com/Questionnaire/q1")))).thenReturn(q);
|
||||||
|
|
||||||
|
when(myResourceLoaderMock.load(Mockito.eq(ValueSet.class), Mockito.eq(new IdType("http://somevalueset/ValueSet/123")))).thenThrow(new ResourceNotFoundException("Unknown"));
|
||||||
|
|
||||||
|
QuestionnaireAnswers qa;
|
||||||
|
|
||||||
|
// Bad code
|
||||||
|
|
||||||
|
qa = new QuestionnaireAnswers();
|
||||||
|
qa.getQuestionnaire().setReference(questionnaireRef);
|
||||||
|
qa.getGroup().addQuestion().setLinkId("link0").addAnswer().setValue(new Coding().setSystem("urn:system").setCode("code1"));
|
||||||
|
ValidationResult result = myVal.validateWithResult(qa);
|
||||||
|
assertThat(result.getMessages().toString(), containsString("myMessage=Reference could not be found: http://some"));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user