package ca.uhn.fhir.rest.server;
import static org.junit.Assert.*;
import java.util.List;
import javax.servlet.ServletException;
import org.hamcrest.core.StringContains;
import org.hl7.fhir.instance.model.api.IBaseMetaType;
import org.hl7.fhir.instance.model.api.IBaseResource;
import org.hl7.fhir.instance.model.api.IIdType;
import org.junit.AfterClass;
import org.junit.Test;
import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.context.FhirVersionEnum;
import ca.uhn.fhir.model.api.IElement;
import ca.uhn.fhir.model.api.IResource;
import ca.uhn.fhir.model.base.resource.ResourceMetadataMap;
import ca.uhn.fhir.model.dstu.composite.ContainedDt;
import ca.uhn.fhir.model.dstu.composite.NarrativeDt;
import ca.uhn.fhir.model.dstu.resource.Patient;
import ca.uhn.fhir.model.primitive.CodeDt;
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.rest.annotation.RequiredParam;
import ca.uhn.fhir.rest.annotation.Search;
import ca.uhn.fhir.rest.param.StringParam;
import ca.uhn.fhir.util.TestUtil;
public class ServerInvalidDefinitionTest {
private static FhirContext ourCtx = FhirContext.forDstu1();
/**
* Normal, should initialize properly
*/
@Test()
public void testBaseline() throws ServletException {
RestfulServer srv = new RestfulServer(ourCtx);
srv.setResourceProviders(new InstantiableTypeForResourceProvider());
srv.init();
}
@Test
public void testInvalidSpecialNameResourceProvider() {
RestfulServer srv = new RestfulServer(ourCtx);
srv.setResourceProviders(new InvalidSpecialParameterNameResourceProvider());
try {
srv.init();
fail();
} catch (ServletException e) {
assertThat(e.getCause().toString(), StringContains.containsString("ConfigurationException"));
assertThat(e.getCause().toString(), StringContains.containsString("_pretty"));
}
}
@Test
public void testMultipleResourceProviderForSameType() {
RestfulServer srv = new RestfulServer(ourCtx);
srv.setResourceProviders(new PatientResourceProvider1(), new PatientResourceProvider2());
try {
srv.init();
fail();
} catch (ServletException e) {
assertThat(e.getCause().toString(), StringContains.containsString("[Patient]"));
assertThat(e.getCause().toString(), StringContains.containsString("PatientResourceProvider1]"));
assertThat(e.getCause().toString(), StringContains.containsString("PatientResourceProvider2]"));
}
}
@Test
public void testPrivateResourceProvider() {
RestfulServer srv = new RestfulServer(ourCtx);
srv.setResourceProviders(new PrivateResourceProvider());
try {
srv.init();
fail();
} catch (ServletException e) {
assertThat(e.getCause().toString(), StringContains.containsString("ConfigurationException"));
assertThat(e.getCause().toString(), StringContains.containsString("public"));
}
}
@Test
public void testProviderWithNonResourceType() {
RestfulServer srv = new RestfulServer(ourCtx);
srv.setResourceProviders(new ProviderWithNonResourceType());
try {
srv.init();
fail();
} catch (ServletException e) {
assertThat(e.getCause().toString(), StringContains.containsString("ConfigurationException"));
assertThat(e.getCause().toString(), StringContains.containsString("does not contain any valid HAPI-FHIR annotations"));
}
}
@Test
public void testReadMethodWithoutIdParamProvider() {
RestfulServer srv = new RestfulServer(ourCtx);
srv.setResourceProviders(new ReadMethodWithoutIdParamProvider());
try {
srv.init();
fail();
} catch (ServletException e) {
assertThat(e.getCause().toString(), StringContains.containsString("does not have a parameter"));
}
}
@Test
public void testReadMethodWithSearchParameters() {
RestfulServer srv = new RestfulServer(ourCtx);
srv.setResourceProviders(new ReadMethodWithSearchParamProvider());
try {
srv.init();
fail();
} catch (ServletException e) {
assertThat(e.getCause().toString(), StringContains.containsString("ConfigurationException"));
}
}
@Test
public void testSearchWithId() {
RestfulServer srv = new RestfulServer(ourCtx);
srv.setResourceProviders(new SearchWithIdParamProvider());
try {
srv.init();
fail();
} catch (ServletException e) {
assertThat(e.getCause().toString(), StringContains.containsString("ConfigurationException"));
assertThat(e.getCause().toString(), StringContains.containsString("compartment"));
}
}
public static class InstantiableTypeForResourceProvider implements IResourceProvider {
@Override
public Class<Patient> getResourceType() {
return Patient.class;
}
@Read
public Patient read(@IdParam IdDt theId) {
return null;
}
}
public static class InvalidSpecialParameterNameResourceProvider implements IResourceProvider {
@Override
public Class<? extends IResource> getResourceType() {
return Patient.class;
}
@Search
public List<Patient> search(@RequiredParam(name = "_pretty") StringParam theParam) {
return null;
}
}
public static class PatientResourceProvider1 implements IResourceProvider {
@Override
public Class<Patient> getResourceType() {
return Patient.class;
}
@Read
public Patient read(@IdParam IdDt theId) {
return null;
}
}
public static class PatientResourceProvider2 implements IResourceProvider {
@Override
public Class<Patient> getResourceType() {
return Patient.class;
}
@Read
public Patient read(@IdParam IdDt theId) {
return null;
}
}
private static class PrivateResourceProvider implements IResourceProvider {
@Override
public Class<? extends IResource> getResourceType() {
return Patient.class;
}
@Read
public Patient read(@IdParam IdDt theId) {
return null;
}
}
public static class ProviderWithNonResourceType implements IResourceProvider {
@Override
public Class<? extends IResource> getResourceType() {
return new IResource() {
@Override
public <T extends IElement> List<T> getAllPopulatedChildElementsOfType(Class<T> theType) {
return null;
}
@Override
public IIdType getIdElement() {
return getId();
}
@Override
public ContainedDt getContained() {
return null;
}
@Override
public IdDt getId() {
return null;
}
@Override
public CodeDt getLanguage() {
return null;
}
@Override
public ResourceMetadataMap getResourceMetadata() {
return null;
}
@Override
public String getResourceName() {
return null;
}
@Override
public FhirVersionEnum getStructureFhirVersionEnum() {
return FhirVersionEnum.DSTU1;
}
@Override
public NarrativeDt getText() {
return null;
}
@Override
public boolean isEmpty() {
return false;
}
@Override
public void setId(IdDt theId) {
}
@Override
public void setLanguage(CodeDt theLanguage) {
}
@Override
public void setResourceMetadata(ResourceMetadataMap theMap) {
}
@Override
public IBaseResource setId(String theId) {
return null;
}
@Override
public IBaseResource setId(IIdType theId) {
return null;
}
@Override
public boolean hasFormatComment() {
return false;
}
@Override
public List<String> getFormatCommentsPre() {
return null;
}
@Override
public List<String> getFormatCommentsPost() {
return null;
}
@Override
public IBaseMetaType getMeta() {
// TODO Auto-generated method stub
return null;
}
}.getClass();
}
@Search
public List<Patient> read(@IdParam IdDt theId, @RequiredParam(name = "aaa") StringParam theParam) {
return null;
}
}
public static class ReadMethodWithoutIdParamProvider implements IResourceProvider {
@Override
public Class<? extends IBaseResource> getResourceType() {
return Patient.class;
}
@Read
public Patient read() {
return null;
}
}
public static class ReadMethodWithSearchParamProvider implements IResourceProvider {
@Override
public Class<? extends IResource> getResourceType() {
return Patient.class;
}
@Read
public Patient read(@IdParam IdDt theId, @RequiredParam(name = "aaa") StringParam theParam) {
return null;
}
}
public static class SearchWithIdParamProvider implements IResourceProvider {
@Override
public Class<? extends IResource> getResourceType() {
return Patient.class;
}
@Search
public List<Patient> read(@IdParam IdDt theId, @RequiredParam(name = "aaa") StringParam theParam) {
return null;
}
}
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
}