package ca.uhn.fhir.context;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
import org.junit.AfterClass;
import org.junit.Ignore;
import org.junit.Test;
import ca.uhn.fhir.model.api.annotation.Compartment;
import ca.uhn.fhir.model.api.annotation.ResourceDef;
import ca.uhn.fhir.model.api.annotation.SearchParamDefinition;
import ca.uhn.fhir.model.dstu.resource.CarePlan;
import ca.uhn.fhir.model.dstu.resource.Patient;
import ca.uhn.fhir.parser.DataFormatException;
import ca.uhn.fhir.parser.MyPatient;
import ca.uhn.fhir.util.TestUtil;
public class ModelScannerDstu1Test {
/** This failed at one point */
@Test
public void testCarePlan() throws DataFormatException {
FhirContext.forDstu1().getResourceDefinition(CarePlan.class);
}
@Test
public void testExtendedClass() {
FhirContext ctx = FhirContext.forDstu1();
ctx.getResourceDefinition(MyPatient.class);
RuntimeResourceDefinition patient = ctx.getResourceDefinition("Patient");
assertEquals(Patient.class, patient.getImplementingClass());
RuntimeResourceDefinition def = ctx.getResourceDefinition(MyPatient.class);
RuntimeResourceDefinition baseDef = def.getBaseDefinition();
assertEquals(Patient.class, baseDef.getImplementingClass());
}
@Test
public void testResourceWithNoDef() {
try {
FhirContext.forDstu1().getResourceDefinition(NoResourceDef.class);
fail();
} catch (ConfigurationException e) {
assertEquals("Resource class[ca.uhn.fhir.context.ModelScannerDstu1Test$NoResourceDef] does not contain any valid HAPI-FHIR annotations", e.getMessage());
}
}
@Test
public void testScanExtensionTypes() throws DataFormatException {
FhirContext ctx = FhirContext.forDstu1();
RuntimeResourceDefinition def = ctx.getResourceDefinition(ResourceWithExtensionsA.class);
assertEquals(RuntimeChildCompositeDatatypeDefinition.class, def.getChildByNameOrThrowDataFormatException("identifier").getClass());
RuntimeChildDeclaredExtensionDefinition ext = def.getDeclaredExtension("http://foo/#f1", "");
assertNotNull(ext);
BaseRuntimeElementDefinition<?> valueString = ext.getChildByName("valueString");
assertNotNull(valueString);
ext = def.getDeclaredExtension("http://foo/#f2", "");
assertNotNull(ext);
valueString = ext.getChildByName("valueString");
assertNotNull(valueString);
ext = def.getDeclaredExtension("http://bar/#b1", "");
assertNotNull(ext);
RuntimeChildDeclaredExtensionDefinition childExt = ext.getChildExtensionForUrl("http://bar/#b1/1");
assertNotNull(childExt);
BaseRuntimeElementDefinition<?> valueDate = childExt.getChildByName("valueDate");
assertNotNull(valueDate);
childExt = ext.getChildExtensionForUrl("http://bar/#b1/2");
assertNotNull(childExt);
childExt = childExt.getChildExtensionForUrl("http://bar/#b1/2/1");
assertNotNull(childExt);
valueDate = childExt.getChildByName("valueDate");
assertNotNull(valueDate);
}
/**
* TODO: re-enable this when Claim compartments are fixed
*/
@Test
@Ignore
public void testSearchParamWithCompartmentForNonReferenceParam() {
try {
FhirContext.forDstu1().getResourceDefinition(CompartmentForNonReferenceParam.class);
fail();
} catch (ConfigurationException e) {
assertEquals("Search param foo provides compartment membershit but is not of type 'reference'", e.getMessage());
}
}
@Test
public void testSearchParamWithInvalidType() {
try {
FhirContext.forDstu1().getResourceDefinition(InvalidParamType.class);
fail();
} catch (ConfigurationException e) {
assertEquals("Search param foo has an invalid type: bar", e.getMessage());
}
}
@ResourceDef(name = "Patient")
public static class CompartmentForNonReferenceParam extends Patient {
private static final long serialVersionUID = 1L;
@SearchParamDefinition(name = "foo", path = "Patient.telecom", type = "string", providesMembershipIn = { @Compartment(name = "Patient"), @Compartment(name = "Device") })
public static final String SP_TELECOM = "foo";
}
@ResourceDef(name = "Patient")
public static class InvalidParamType extends Patient {
private static final long serialVersionUID = 1L;
@SearchParamDefinition(name = "foo", path = "Patient.telecom", type = "bar")
public static final String SP_TELECOM = "foo";
}
class NoResourceDef extends Patient {
private static final long serialVersionUID = 1L;
@SearchParamDefinition(name = "foo", path = "Patient.telecom", type = "bar")
public static final String SP_TELECOM = "foo";
}
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
}