package ca.uhn.fhir.rest.client; import static org.junit.Assert.*; import static org.mockito.Mockito.*; import java.io.StringReader; import java.nio.charset.Charset; import java.util.List; import org.apache.commons.io.input.ReaderInputStream; import org.apache.http.HttpResponse; import org.apache.http.ProtocolVersion; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; 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 ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.model.api.Bundle; import ca.uhn.fhir.model.api.ExtensionDt; import ca.uhn.fhir.model.dstu.composite.ResourceReferenceDt; import ca.uhn.fhir.model.dstu.resource.Conformance; import ca.uhn.fhir.model.dstu.resource.Organization; import ca.uhn.fhir.model.dstu.resource.Patient; import ca.uhn.fhir.rest.server.Constants; import ca.uhn.fhir.rest.server.IncludeTest; import ca.uhn.fhir.rest.server.IncludeTest.ExtPatient; import ca.uhn.fhir.util.TestUtil; public class IncludedResourceStitchingClientTest { private FhirContext ctx; private HttpClient httpClient; private HttpResponse httpResponse; // atom-document-large.xml @Before public void before() { ctx = new FhirContext(Patient.class, Conformance.class); httpClient = mock(HttpClient.class, new ReturnsDeepStubs()); ctx.getRestfulClientFactory().setHttpClient(httpClient); ctx.getRestfulClientFactory().setServerValidationModeEnum(ServerValidationModeEnum.NEVER); httpResponse = mock(HttpResponse.class, new ReturnsDeepStubs()); } @Test public void testWithParam() throws Exception { ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class); when(httpClient.execute(capt.capture())).thenReturn(httpResponse); when(httpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK")); when(httpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_ATOM_XML + "; charset=UTF-8")); when(httpResponse.getEntity().getContent()).thenReturn(new ReaderInputStream(new StringReader(createBundle()), Charset.forName("UTF-8"))); IGenericClient client = ctx.newRestfulGenericClient( "http://foo"); Bundle bundle = client.search().forResource("Patient").execute(); assertEquals(HttpGet.class, capt.getValue().getClass()); HttpGet get = (HttpGet) capt.getValue(); assertEquals("http://foo/Patient", get.getURI().toString()); assertEquals(3, bundle.size()); Patient p = (Patient) bundle.getEntries().get(0).getResource(); List<ExtensionDt> exts = p.getUndeclaredExtensionsByUrl("http://foo"); assertEquals(1,exts.size()); ExtensionDt ext = exts.get(0); ResourceReferenceDt ref = (ResourceReferenceDt) ext.getValue(); assertEquals("Organization/o1", ref.getReference().getValue()); assertNotNull(ref.getResource()); } @Test public void testWithDeclaredExtension() throws Exception { ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class); when(httpClient.execute(capt.capture())).thenReturn(httpResponse); when(httpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK")); when(httpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_ATOM_XML + "; charset=UTF-8")); when(httpResponse.getEntity().getContent()).thenReturn(new ReaderInputStream(new StringReader(createLinkedBundle()), Charset.forName("UTF-8"))); IGenericClient client = ctx.newRestfulGenericClient( "http://foo"); Bundle bundle = client.search().forResource(IncludeTest.ExtPatient.class).execute(); assertEquals(HttpGet.class, capt.getValue().getClass()); HttpGet get = (HttpGet) capt.getValue(); assertEquals("http://foo/Patient", get.getURI().toString()); assertEquals(4, bundle.size()); ExtPatient p = (ExtPatient) bundle.getEntries().get(0).getResource(); ResourceReferenceDt ref = (ResourceReferenceDt) p.getSecondOrg(); assertEquals("Organization/o1", ref.getReference().getValue()); assertNotNull(ref.getResource()); Organization o1 = (Organization) ref.getResource(); assertEquals("o2", o1.getPartOf().getReference().toUnqualifiedVersionless().getIdPart()); assertNotNull(o1.getPartOf().getResource()); } private String createLinkedBundle() { //@formatter:off return "<feed xmlns=\"http://www.w3.org/2005/Atom\">\n" + " <title/>\n" + " <id>6cfcd90e-877a-40c6-a11c-448006712979</id>\n" + " <link rel=\"self\" href=\"http://localhost:49782/Patient?_query=declaredExtInclude&_pretty=true\"/>\n" + " <link rel=\"fhir-base\" href=\"http://localhost:49782\"/>\n" + " <os:totalResults xmlns:os=\"http://a9.com/-/spec/opensearch/1.1/\">2</os:totalResults>\n" + " <author>\n" + " <name>HAPI FHIR Server</name>\n" + " </author>\n" + " <entry>\n" + " <title>Patient p1</title>\n" + " <id>http://localhost:49782/Patient/p1</id>\n" + " <published>2014-08-12T10:22:19-04:00</published>\n" + " <link rel=\"self\" href=\"http://localhost:49782/Patient/p1\"/>\n" + " <content type=\"text/xml\">\n" + " <Patient xmlns=\"http://hl7.org/fhir\">\n" + " <extension url=\"http://foo#secondOrg\">\n" + " <valueResource>\n" + " <reference value=\"Organization/o1\"/>\n" + " </valueResource>\n" + " </extension>\n" + " <identifier>\n" + " <label value=\"p1\"/>\n" + " </identifier>\n" + " </Patient>\n" + " </content>\n" + " </entry>\n" + " <entry>\n" + " <title>Patient p2</title>\n" + " <id>http://localhost:49782/Patient/p2</id>\n" + " <published>2014-08-12T10:22:19-04:00</published>\n" + " <link rel=\"self\" href=\"http://localhost:49782/Patient/p2\"/>\n" + " <content type=\"text/xml\">\n" + " <Patient xmlns=\"http://hl7.org/fhir\">\n" + " <extension url=\"http://foo#secondOrg\">\n" + " <valueResource>\n" + " <reference value=\"Organization/o1\"/>\n" + " </valueResource>\n" + " </extension>\n" + " <identifier>\n" + " <label value=\"p2\"/>\n" + " </identifier>\n" + " </Patient>\n" + " </content>\n" + " </entry>\n" + " <entry>\n" + " <title>Organization o1</title>\n" + " <id>http://localhost:49782/Organization/o1</id>\n" + " <published>2014-08-12T10:22:19-04:00</published>\n" + " <link rel=\"self\" href=\"http://localhost:49782/Organization/o1\"/>\n" + " <content type=\"text/xml\">\n" + " <Organization xmlns=\"http://hl7.org/fhir\">\n" + " <name value=\"o1\"/>\n" + " <partOf>\n" + " <reference value=\"Organization/o2\"/>\n" + " </partOf>\n" + " </Organization>\n" + " </content>\n" + " </entry>\n" + " <entry>\n" + " <title>Organization o2</title>\n" + " <id>http://localhost:49782/Organization/o2</id>\n" + " <published>2014-08-12T10:22:19-04:00</published>\n" + " <link rel=\"self\" href=\"http://localhost:49782/Organization/o2\"/>\n" + " <content type=\"text/xml\">\n" + " <Organization xmlns=\"http://hl7.org/fhir\">\n" + " <name value=\"o2\"/>\n" + " </Organization>\n" + " </content>\n" + " </entry>\n" + "</feed>"; //@formatter:on } private String createBundle() { //@formatter:on return "<feed xmlns=\"http://www.w3.org/2005/Atom\">\n" + " <title/>\n" + " <id>f051fd86-4daa-48da-80f7-5a0443bf6f11</id>\n" + " <link rel=\"self\" href=\"http://localhost:49627/Patient?_query=extInclude&_pretty=true\"/>\n" + " <link rel=\"fhir-base\" href=\"http://localhost:49627\"/>\n" + " <os:totalResults xmlns:os=\"http://a9.com/-/spec/opensearch/1.1/\">2</os:totalResults>\n" + " <author>\n" + " <name>HAPI FHIR Server</name>\n" + " </author>\n" + " <entry>\n" + " <title>Patient p1</title>\n" + " <id>http://localhost:49627/Patient/p1</id>\n" + " <published>2014-08-05T15:22:08-04:00</published>\n" + " <link rel=\"self\" href=\"http://localhost:49627/Patient/p1\"/>\n" + " <content type=\"text/xml\">\n" + " <Patient xmlns=\"http://hl7.org/fhir\">\n" + " <extension url=\"http://foo\">\n" + " <valueResource>\n" + " <reference value=\"Organization/o1\"/>\n" + " </valueResource>\n" + " </extension>\n" + " <identifier>\n" + " <label value=\"p1\"/>\n" + " </identifier>\n" + " </Patient>\n" + " </content>\n" + " </entry>\n" + " <entry>\n" + " <title>Patient p2</title>\n" + " <id>http://localhost:49627/Patient/p2</id>\n" + " <published>2014-08-05T15:22:08-04:00</published>\n" + " <link rel=\"self\" href=\"http://localhost:49627/Patient/p2\"/>\n" + " <content type=\"text/xml\">\n" + " <Patient xmlns=\"http://hl7.org/fhir\">\n" + " <extension url=\"http://foo\">\n" + " <valueResource>\n" + " <reference value=\"Organization/o1\"/>\n" + " </valueResource>\n" + " </extension>\n" + " <identifier>\n" + " <label value=\"p2\"/>\n" + " </identifier>\n" + " </Patient>\n" + " </content>\n" + " </entry>\n" + " <entry>\n" + " <title>Organization o1</title>\n" + " <id>http://localhost:49627/Organization/o1</id>\n" + " <published>2014-08-05T15:22:08-04:00</published>\n" + " <link rel=\"self\" href=\"http://localhost:49627/Organization/o1\"/>\n" + " <content type=\"text/xml\">\n" + " <Organization xmlns=\"http://hl7.org/fhir\">\n" + " <name value=\"o1\"/>\n" + " </Organization>\n" + " </content>\n" + " </entry>\n" + "</feed>"; //@formatter:off } @AfterClass public static void afterClassClearContext() { TestUtil.clearAllStaticFieldsForUnitTest(); } }