Questions on FHIR Repository Validation and profile versions.
This commit is contained in:
parent
564ae46008
commit
15497e39a9
|
@ -0,0 +1,160 @@
|
||||||
|
package ca.uhn.fhir.jpa.provider;
|
||||||
|
|
||||||
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
|
import ca.uhn.fhir.context.support.DefaultProfileValidationSupport;
|
||||||
|
import ca.uhn.fhir.jpa.test.BaseJpaR4Test;
|
||||||
|
import ca.uhn.fhir.validation.FhirValidator;
|
||||||
|
import ca.uhn.fhir.validation.SingleValidationMessage;
|
||||||
|
import ca.uhn.fhir.validation.ValidationResult;
|
||||||
|
import org.hl7.fhir.common.hapi.validation.support.CachingValidationSupport;
|
||||||
|
import org.hl7.fhir.common.hapi.validation.support.CommonCodeSystemsTerminologyService;
|
||||||
|
import org.hl7.fhir.common.hapi.validation.support.InMemoryTerminologyServerValidationSupport;
|
||||||
|
import org.hl7.fhir.common.hapi.validation.support.PrePopulatedValidationSupport;
|
||||||
|
import org.hl7.fhir.common.hapi.validation.support.SnapshotGeneratingValidationSupport;
|
||||||
|
import org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain;
|
||||||
|
import org.hl7.fhir.common.hapi.validation.validator.FhirInstanceValidator;
|
||||||
|
import org.hl7.fhir.r4.model.CodeType;
|
||||||
|
import org.hl7.fhir.r4.model.ElementDefinition;
|
||||||
|
import org.hl7.fhir.r4.model.Enumerations;
|
||||||
|
import org.hl7.fhir.r4.model.Observation;
|
||||||
|
import org.hl7.fhir.r4.model.Patient;
|
||||||
|
import org.hl7.fhir.r4.model.Quantity;
|
||||||
|
import org.hl7.fhir.r4.model.StructureDefinition;
|
||||||
|
import org.hl7.fhir.r4.model.UriType;
|
||||||
|
import org.hl7.fhir.r4.model.ValueSet;
|
||||||
|
import org.junit.jupiter.api.BeforeAll;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
|
public class DiscoveryValidationSupportTest extends BaseJpaR4Test {
|
||||||
|
private static final FhirContext ourCtx = FhirContext.forR4();
|
||||||
|
private static FhirValidator myFhirValidator;
|
||||||
|
|
||||||
|
private static PrePopulatedValidationSupport ourValidationSupport;
|
||||||
|
|
||||||
|
@BeforeAll
|
||||||
|
public static void setup() {
|
||||||
|
myFhirValidator = ourCtx.newValidator();
|
||||||
|
myFhirValidator.setValidateAgainstStandardSchema(false);
|
||||||
|
myFhirValidator.setValidateAgainstStandardSchematron(false);
|
||||||
|
|
||||||
|
ourValidationSupport = new PrePopulatedValidationSupport(ourCtx);
|
||||||
|
|
||||||
|
ValidationSupportChain chain = new ValidationSupportChain(
|
||||||
|
new DefaultProfileValidationSupport(ourCtx),
|
||||||
|
new SnapshotGeneratingValidationSupport(ourCtx),
|
||||||
|
new CommonCodeSystemsTerminologyService(ourCtx),
|
||||||
|
new InMemoryTerminologyServerValidationSupport(ourCtx),
|
||||||
|
ourValidationSupport);
|
||||||
|
CachingValidationSupport myValidationSupport = new CachingValidationSupport(chain, true);
|
||||||
|
FhirInstanceValidator myInstanceVal = new FhirInstanceValidator(myValidationSupport);
|
||||||
|
myFhirValidator.registerValidatorModule(myInstanceVal);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
ValueSet vs = new ValueSet();
|
||||||
|
vs.setUrl("http://vs");
|
||||||
|
vs.getCompose().addInclude().setSystem("http://cs")
|
||||||
|
.addConcept(new ValueSet.ConceptReferenceComponent(new CodeType("code1")))
|
||||||
|
.addConcept(new ValueSet.ConceptReferenceComponent(new CodeType("code2")));
|
||||||
|
myValueSetDao.create(vs);
|
||||||
|
|
||||||
|
StructureDefinition sd1 = new StructureDefinition()
|
||||||
|
.setUrl("http://example.org/fhir/StructureDefinition/TestObservation").setVersion("v1")
|
||||||
|
.setBaseDefinition("http://hl7.org/fhir/StructureDefinition/Observation")
|
||||||
|
.setType("Observation")
|
||||||
|
.setDerivation(StructureDefinition.TypeDerivationRule.CONSTRAINT);
|
||||||
|
sd1.getDifferential()
|
||||||
|
.addElement()
|
||||||
|
.setPath("Observation.value[x]")
|
||||||
|
.addType(new ElementDefinition.TypeRefComponent(new UriType("Quantity")))
|
||||||
|
.setBinding(new ElementDefinition.ElementDefinitionBindingComponent().setStrength(Enumerations.BindingStrength.REQUIRED).setValueSet("http://vs1"))
|
||||||
|
.setId("Observation.value[x]");
|
||||||
|
myStructureDefinitionDao.create(sd1, mySrd);
|
||||||
|
|
||||||
|
StructureDefinition sd2 = new StructureDefinition()
|
||||||
|
.setUrl("http://example.org/fhir/StructureDefinition/TestObservation").setVersion("v2")
|
||||||
|
.setBaseDefinition("http://hl7.org/fhir/StructureDefinition/Observation")
|
||||||
|
.setType("Observation")
|
||||||
|
.setDerivation(StructureDefinition.TypeDerivationRule.CONSTRAINT);
|
||||||
|
sd2.getDifferential()
|
||||||
|
.addElement()
|
||||||
|
.setPath("Observation.value[x]")
|
||||||
|
.addType(new ElementDefinition.TypeRefComponent(new UriType("Quantity")))
|
||||||
|
.setBinding(new ElementDefinition.ElementDefinitionBindingComponent().setStrength(Enumerations.BindingStrength.REQUIRED).setValueSet("http://vs"))
|
||||||
|
.setId("Observation.value[x]");
|
||||||
|
myStructureDefinitionDao.create(sd2, mySrd);
|
||||||
|
|
||||||
|
ourValidationSupport.addStructureDefinition(sd1);
|
||||||
|
ourValidationSupport.addStructureDefinition(sd2);
|
||||||
|
|
||||||
|
Observation observation = new Observation();
|
||||||
|
observation.getMeta().addProfile("http://example.org/fhir/StructureDefinition/TestObservation");
|
||||||
|
observation.setStatus(Observation.ObservationStatus.REGISTERED);
|
||||||
|
observation.getCode().setText("new-visit");
|
||||||
|
observation.setValue(new Quantity().setSystem("http://cs").setCode("code1").setValue(123));
|
||||||
|
|
||||||
|
ValidationResult validationResult = myFhirValidator.validateWithResult(observation);
|
||||||
|
for (SingleValidationMessage message : validationResult.getMessages()) {
|
||||||
|
ourLog.info(message.toString());
|
||||||
|
}
|
||||||
|
assertTrue(validationResult.isSuccessful());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test_simple() {
|
||||||
|
StructureDefinition sdIdentifier = new StructureDefinition()
|
||||||
|
.setUrl("http://example.org/fhir/StructureDefinition/TestPatient").setVersion("1")
|
||||||
|
.setBaseDefinition("http://hl7.org/fhir/StructureDefinition/Patient-identifier")
|
||||||
|
.setType("Patient")
|
||||||
|
.setDerivation(StructureDefinition.TypeDerivationRule.CONSTRAINT);
|
||||||
|
sdIdentifier.getDifferential().addElement()
|
||||||
|
.setPath("Patient.identifier")
|
||||||
|
.setMin(1)
|
||||||
|
.setId("Patient.identifier");
|
||||||
|
myStructureDefinitionDao.create(sdIdentifier, mySrd);
|
||||||
|
|
||||||
|
StructureDefinition sdName = new StructureDefinition()
|
||||||
|
.setUrl("http://example.org/fhir/StructureDefinition/TestPatient").setVersion("2")
|
||||||
|
.setBaseDefinition("http://hl7.org/fhir/StructureDefinition/Patient-name")
|
||||||
|
.setType("Patient")
|
||||||
|
.setDerivation(StructureDefinition.TypeDerivationRule.CONSTRAINT);
|
||||||
|
sdName.getDifferential().addElement()
|
||||||
|
.setPath("Patient.name")
|
||||||
|
.setMin(1)
|
||||||
|
.setMustSupport(true)
|
||||||
|
.setId("Patient.name");
|
||||||
|
myStructureDefinitionDao.create(sdName, mySrd);
|
||||||
|
|
||||||
|
StructureDefinition sdBirthDate = new StructureDefinition()
|
||||||
|
.setUrl("http://example.org/fhir/StructureDefinition/TestPatient").setVersion("3")
|
||||||
|
.setBaseDefinition("http://hl7.org/fhir/StructureDefinition/Patient")
|
||||||
|
.setType("Patient")
|
||||||
|
.setDerivation(StructureDefinition.TypeDerivationRule.CONSTRAINT);
|
||||||
|
sdBirthDate.getDifferential().addElement()
|
||||||
|
.setPath("Patient.birthDate")
|
||||||
|
.setMin(1)
|
||||||
|
.setMustSupport(true)
|
||||||
|
.setId("Patient.birthDate");
|
||||||
|
myStructureDefinitionDao.create(sdBirthDate, mySrd);
|
||||||
|
|
||||||
|
ourValidationSupport.addStructureDefinition(sdIdentifier);
|
||||||
|
ourValidationSupport.addStructureDefinition(sdName);
|
||||||
|
ourValidationSupport.addStructureDefinition(sdBirthDate);
|
||||||
|
|
||||||
|
Patient patient = new Patient();
|
||||||
|
patient.getMeta()
|
||||||
|
.addProfile("http://example.org/fhir/StructureDefinition/TestPatient-name|1")
|
||||||
|
.addProfile("http://example.org/fhir/StructureDefinition/TestPatient-identifier|2");
|
||||||
|
myPatientDao.create(patient, mySrd);
|
||||||
|
|
||||||
|
ValidationResult validationResult = myFhirValidator.validateWithResult(patient);
|
||||||
|
for (SingleValidationMessage message : validationResult.getMessages()) {
|
||||||
|
ourLog.info(message.toString());
|
||||||
|
}
|
||||||
|
assertTrue(validationResult.isSuccessful());
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue