package ca.uhn.fhir.model.primitive;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.nio.charset.Charset;
import org.apache.commons.io.input.ReaderInputStream;
import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.ProtocolVersion;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicStatusLine;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.internal.stubbing.defaultanswers.ReturnsDeepStubs;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.model.dstu2.composite.ResourceReferenceDt;
import ca.uhn.fhir.model.dstu2.resource.Patient;
import ca.uhn.fhir.parser.DataFormatException;
import ca.uhn.fhir.rest.client.IGenericClient;
import ca.uhn.fhir.rest.client.ServerValidationModeEnum;
import ca.uhn.fhir.rest.client.api.IRestfulClient;
import ca.uhn.fhir.rest.server.Constants;
import ca.uhn.fhir.util.TestUtil;
public class BaseResourceReferenceDtTest {
private static FhirContext ourCtx;
private HttpClient myHttpClient;
private HttpResponse myHttpResponse;
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
@Before
public void before() {
ourCtx = FhirContext.forDstu2();
myHttpClient = mock(HttpClient.class, new ReturnsDeepStubs());
ourCtx.getRestfulClientFactory().setHttpClient(myHttpClient);
ourCtx.getRestfulClientFactory().setServerValidationMode(ServerValidationModeEnum.NEVER);
myHttpResponse = mock(HttpResponse.class, new ReturnsDeepStubs());
}
private ArgumentCaptor<HttpUriRequest> fixtureJson() throws IOException, ClientProtocolException {
Patient patient = new Patient();
patient.addName().addFamily("FAM");
final String input = ourCtx.newJsonParser().encodeResourceToString(patient);
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
when(myHttpResponse.getAllHeaders()).thenReturn(new Header[] { new BasicHeader(Constants.HEADER_LAST_MODIFIED, "Sat, 20 Jun 2015 19:32:17 GMT") });
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<InputStream>() {
@Override
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
return new ReaderInputStream(new StringReader(input), Charset.forName("UTF-8"));
}
});
return capt;
}
private ArgumentCaptor<HttpUriRequest> fixtureXml() throws IOException, ClientProtocolException {
Patient patient = new Patient();
patient.addName().addFamily("FAM");
final String input = ourCtx.newXmlParser().encodeResourceToString(patient);
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
when(myHttpResponse.getAllHeaders()).thenReturn(new Header[] { new BasicHeader(Constants.HEADER_LAST_MODIFIED, "Sat, 20 Jun 2015 19:32:17 GMT") });
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<InputStream>() {
@Override
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
return new ReaderInputStream(new StringReader(input), Charset.forName("UTF-8"));
}
});
return capt;
}
@Test
public void testLoadResourceFromAnnotationClientJson() throws Exception {
ArgumentCaptor<HttpUriRequest> capt = fixtureJson();
IClientType client = ourCtx.newRestfulClient(IClientType.class, "http://example.com/fhir");
ResourceReferenceDt ref = new ResourceReferenceDt();
ref.setReference("http://domain2.example.com/base/Patient/123");
Patient response = (Patient) ref.loadResource(client);
assertEquals("http://domain2.example.com/base/Patient/123", capt.getAllValues().get(0).getURI().toASCIIString());
assertEquals("FAM", response.getName().get(0).getFamily().get(0).getValue());
assertEquals("http://domain2.example.com/base/Patient/123", response.getId().getValue());
}
@Test
public void testErrors() {
IClientType client = ourCtx.newRestfulClient(IClientType.class, "http://example.com/fhir");
try {
new ResourceReferenceDt().loadResource(client);
fail();
} catch (IllegalStateException e) {
assertEquals("Reference has no resource ID defined", e.getMessage());
}
try {
new ResourceReferenceDt("123").loadResource(client);
fail();
} catch (IllegalStateException e) {
assertEquals("Reference is not complete (must be in the form [baseUrl]/[resource type]/[resource ID]) - Reference is: 123", e.getMessage());
}
try {
new ResourceReferenceDt("Patient/123").loadResource(client);
fail();
} catch (IllegalStateException e) {
assertEquals("Reference is not complete (must be in the form [baseUrl]/[resource type]/[resource ID]) - Reference is: Patient/123", e.getMessage());
}
try {
new ResourceReferenceDt("http://foo/123123").loadResource(client);
fail();
} catch (DataFormatException e) {
assertEquals("Unknown resource name \"foo\" (this name is not known in FHIR version \"DSTU2\")", e.getMessage());
}
try {
new ResourceReferenceDt("http://foo/Sometype/123123").loadResource(client);
fail();
} catch (DataFormatException e) {
e.printStackTrace();
assertEquals("Unknown resource name \"Sometype\" (this name is not known in FHIR version \"DSTU2\")", e.getMessage());
}
}
@Test
public void testReturnAlreadyLoadedInstance() throws ClientProtocolException, IOException {
ArgumentCaptor<HttpUriRequest> capt = fixtureJson();
IClientType client = ourCtx.newRestfulClient(IClientType.class, "http://example4.com/fhir");
Patient pat = new Patient();
ResourceReferenceDt ref = new ResourceReferenceDt();
ref.setReference("http://domain2.example.com/base/Patient/123");
ref.setResource(pat);
Patient response = (Patient) ref.loadResource(client);
assertEquals(0, capt.getAllValues().size());
assertSame(pat, response);
}
@Test
public void testLoadResourceFromAnnotationClientXml() throws Exception {
ArgumentCaptor<HttpUriRequest> capt = fixtureXml();
IClientType client = ourCtx.newRestfulClient(IClientType.class, "http://example3.com/fhir");
ResourceReferenceDt ref = new ResourceReferenceDt();
ref.setReference("http://domain2.example.com/base/Patient/123");
Patient response = (Patient) ref.loadResource(client);
assertEquals("FAM", response.getName().get(0).getFamily().get(0).getValue());
assertEquals("http://domain2.example.com/base/Patient/123", capt.getAllValues().get(0).getURI().toASCIIString());
}
@Test
public void testLoadResourceFromGenericClientJson() throws Exception {
ArgumentCaptor<HttpUriRequest> capt = fixtureJson();
IGenericClient client = ourCtx.newRestfulGenericClient("http://example1.com/fhir");
ResourceReferenceDt ref = new ResourceReferenceDt();
ref.setReference("http://domain2.example.com/base/Patient/123");
Patient response = (Patient) ref.loadResource(client);
assertEquals("http://domain2.example.com/base/Patient/123", capt.getAllValues().get(0).getURI().toASCIIString());
assertEquals("FAM", response.getName().get(0).getFamily().get(0).getValue());
}
@Test
public void testLoadResourceFromGenericClientXml() throws Exception {
ArgumentCaptor<HttpUriRequest> capt = fixtureXml();
IGenericClient client = ourCtx.newRestfulGenericClient("http://example2.com/fhir");
ResourceReferenceDt ref = new ResourceReferenceDt();
ref.setReference("http://domain2.example.com/base/Patient/123");
Patient response = (Patient) ref.loadResource(client);
assertEquals("http://domain2.example.com/base/Patient/123", capt.getAllValues().get(0).getURI().toASCIIString());
assertEquals("FAM", response.getName().get(0).getFamily().get(0).getValue());
}
public interface IClientType extends IRestfulClient {
}
}