package ca.uhn.fhir.rest.server;
import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.model.api.IResource;
import ca.uhn.fhir.model.api.annotation.ProvidesResources;
import ca.uhn.fhir.model.api.annotation.ResourceDef;
import ca.uhn.fhir.model.dstu.resource.Observation;
import ca.uhn.fhir.model.dstu.resource.Patient;
import ca.uhn.fhir.model.primitive.IdDt;
import ca.uhn.fhir.rest.annotation.IdParam;
import ca.uhn.fhir.rest.annotation.Read;
import ca.uhn.fhir.util.TestUtil;
import junit.framework.TestCase;
import org.junit.AfterClass;
import org.junit.Test;
import javax.servlet.ServletException;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Bill de Beaubien on 11/1/2014.
*/
public class ServerProvidedResourceScannerTest extends TestCase {
private static FhirContext ourCtx = FhirContext.forDstu1();
@Test
public void testWhenRestfulServerInitialized_annotatedResources_shouldBeAddedToContext() throws ServletException {
// Given
MyServer server = new MyServer();
// When
server.init();
// Then
assertNotNull(server.getFhirContext().getElementDefinition(CustomObservation.class));
assertNotNull(server.getFhirContext().getElementDefinition(CustomPatient.class));
}
@Test
public void testWhenUnannotatedServerInitialized_annotatedResources_shouldNotBeAddedToContext() throws ServletException {
// Given
RestfulServer server = new RestfulServer(ourCtx);
// When
server.init();
// Then
assertEquals(CustomObservation.class, server.getFhirContext().getElementDefinition(CustomObservation.class).getImplementingClass());
assertEquals(CustomPatient.class, server.getFhirContext().getElementDefinition(CustomPatient.class).getImplementingClass());
}
@Test
public void testWhenServletWithAnnotatedProviderInitialized_annotatedResource_shouldBeAddedToContext() throws ServletException {
// Given
MyServerWithProvider server = new MyServerWithProvider();
// When
server.init();
// Then
assertNotNull(server.getFhirContext().getElementDefinition(CustomObservation.class));
}
@ResourceDef(name = "Patient", id="CustomPatient")
public static class CustomPatient extends Patient {
}
@ResourceDef(name = "Observation", id="CustomObservation")
public static class CustomObservation extends Observation {
}
@ProvidesResources(resources={CustomPatient.class,CustomObservation.class})
class MyServer extends RestfulServer {
private static final long serialVersionUID = 1L;
public MyServer() {
super(ourCtx);
}
}
class MyServerWithProvider extends RestfulServer {
private static final long serialVersionUID = 1L;
public MyServerWithProvider() {
super(ourCtx);
}
@Override
protected void initialize() throws ServletException {
List<IResourceProvider> providers = new ArrayList<IResourceProvider>();
providers.add(new MyObservationProvider());
setResourceProviders(providers);
}
}
@ProvidesResources(resources=CustomObservation.class)
public static class MyObservationProvider implements IResourceProvider {
@Override
public Class<? extends IResource> getResourceType() {
return CustomObservation.class;
}
@Read(version = false)
public CustomObservation readObservation(@IdParam IdDt theId) {
return null;
}
}
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
}