Add null check on code lookup result.

This commit is contained in:
ianmarshall 2021-05-24 22:09:44 -04:00
parent 2c722e64c2
commit f2627959c2
2 changed files with 51 additions and 1 deletions

View File

@ -104,7 +104,7 @@ public class ResponseTerminologyDisplayPopulationInterceptor extends BaseRespons
if (myValidationSupport.isCodeSystemSupported(validationSupportContext, system)) { if (myValidationSupport.isCodeSystemSupported(validationSupportContext, system)) {
IValidationSupport.LookupCodeResult lookupCodeResult = myValidationSupport.lookupCode(validationSupportContext, system, code); IValidationSupport.LookupCodeResult lookupCodeResult = myValidationSupport.lookupCode(validationSupportContext, system, code);
if (lookupCodeResult.isFound()) { if (lookupCodeResult != null && lookupCodeResult.isFound()) {
String newDisplay = lookupCodeResult.getCodeDisplay(); String newDisplay = lookupCodeResult.getCodeDisplay();
IPrimitiveType<?> newString = myStringDefinition.newInstance(newDisplay); IPrimitiveType<?> newString = myStringDefinition.newInstance(newDisplay);
myCodingDisplayChild.getMutator().addValue(theElement, newString); myCodingDisplayChild.getMutator().addValue(theElement, newString);

View File

@ -2,6 +2,8 @@ package ca.uhn.fhir.rest.server.interceptor;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.context.FhirVersionEnum; import ca.uhn.fhir.context.FhirVersionEnum;
import ca.uhn.fhir.context.support.IValidationSupport;
import ca.uhn.fhir.context.support.ValidationSupportContext;
import ca.uhn.fhir.rest.client.api.IGenericClient; import ca.uhn.fhir.rest.client.api.IGenericClient;
import ca.uhn.fhir.test.utilities.server.HashMapResourceProviderExtension; import ca.uhn.fhir.test.utilities.server.HashMapResourceProviderExtension;
import ca.uhn.fhir.test.utilities.server.RestfulServerExtension; import ca.uhn.fhir.test.utilities.server.RestfulServerExtension;
@ -15,6 +17,7 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.extension.RegisterExtension;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
public class ResponseTerminologyDisplayPopulationInterceptorTest { public class ResponseTerminologyDisplayPopulationInterceptorTest {
@ -50,6 +53,19 @@ public class ResponseTerminologyDisplayPopulationInterceptorTest {
assertEquals("Annulled", p.getMaritalStatus().getCoding().get(0).getDisplay()); assertEquals("Annulled", p.getMaritalStatus().getCoding().get(0).getDisplay());
} }
@Test
public void testPopulateCoding_Read_NullableValidationSupport() {
myServerExtension.getRestfulServer().registerInterceptor(new ResponseTerminologyDisplayPopulationInterceptor(new NullableValidationSupport(myCtx)));
Patient p = new Patient();
p.getMaritalStatus().addCoding().setSystem("http://terminology.hl7.org/CodeSystem/v3-MaritalStatus").setCode("A");
IIdType id = myClient.create().resource(p).execute().getId();
p = myClient.read().resource(Patient.class).withId(id).execute();
assertEquals(1, p.getMaritalStatus().getCoding().size());
assertNull(p.getMaritalStatus().getCoding().get(0).getDisplay());
}
@Test @Test
public void testPopulateCoding_Search() { public void testPopulateCoding_Search() {
myServerExtension.getRestfulServer().registerInterceptor(new ResponseTerminologyDisplayPopulationInterceptor(myCtx.getValidationSupport())); myServerExtension.getRestfulServer().registerInterceptor(new ResponseTerminologyDisplayPopulationInterceptor(myCtx.getValidationSupport()));
@ -65,6 +81,21 @@ public class ResponseTerminologyDisplayPopulationInterceptorTest {
assertEquals("Annulled", p.getMaritalStatus().getCoding().get(0).getDisplay()); assertEquals("Annulled", p.getMaritalStatus().getCoding().get(0).getDisplay());
} }
@Test
public void testPopulateCoding_Search_NullableValidationSupport() {
myServerExtension.getRestfulServer().registerInterceptor(new ResponseTerminologyDisplayPopulationInterceptor(new NullableValidationSupport(myCtx)));
Patient p = new Patient();
p.getMaritalStatus().addCoding().setSystem("http://terminology.hl7.org/CodeSystem/v3-MaritalStatus").setCode("A");
IIdType id = myClient.create().resource(p).execute().getId();
Bundle bundle = myClient.search().forResource(Patient.class).returnBundle(Bundle.class).execute();
assertEquals(1, bundle.getEntry().size());
p = (Patient) bundle.getEntry().get(0).getResource();
assertEquals(1, p.getMaritalStatus().getCoding().size());
assertNull(p.getMaritalStatus().getCoding().get(0).getDisplay());
}
@Test @Test
public void testDontPopulateCodingIfAlreadyPopulated() { public void testDontPopulateCodingIfAlreadyPopulated() {
myServerExtension.getRestfulServer().registerInterceptor(new ResponseTerminologyDisplayPopulationInterceptor(myCtx.getValidationSupport())); myServerExtension.getRestfulServer().registerInterceptor(new ResponseTerminologyDisplayPopulationInterceptor(myCtx.getValidationSupport()));
@ -91,4 +122,23 @@ public class ResponseTerminologyDisplayPopulationInterceptorTest {
assertEquals(null, p.getMaritalStatus().getCoding().get(0).getDisplay()); assertEquals(null, p.getMaritalStatus().getCoding().get(0).getDisplay());
} }
private static class NullableValidationSupport implements IValidationSupport {
private static FhirContext myStaticCtx;
NullableValidationSupport(FhirContext theCtx) {
myStaticCtx = theCtx;
}
@Override
public FhirContext getFhirContext() {
return myStaticCtx;
}
@Override
public boolean isCodeSystemSupported(ValidationSupportContext theValidationSupportContext, String theSystem) {
return true;
}
}
} }