package ca.uhn.fhir.parser; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.stringContainsInOrder; import static org.junit.Assert.*; import org.junit.AfterClass; import org.junit.Test; import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.model.dstu.resource.AllergyIntolerance; import ca.uhn.fhir.model.dstu.resource.Composition; import ca.uhn.fhir.util.TestUtil; public class BaseParserTest { private static FhirContext ourCtx = FhirContext.forDstu1(); private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(BaseParserTest.class); private AllergyIntolerance createAllergy(String theId, String theIdentifierValue) { AllergyIntolerance retVal = new AllergyIntolerance(); if (theId != null) { retVal.setId(theId); } return retVal.addIdentifier("urn:system", theIdentifierValue); } /** * See #103 */ @Test public void testDontEncodeUnnecessaryContainedResources01() { Composition comp = new Composition(); comp.addAuthor().setReference("Practitioner/123"); comp.getContained().getContainedResources().add(createAllergy("#AAA", "allergy0")); String xml = ourCtx.newXmlParser().encodeResourceToString(comp); assertThat(xml, not(containsString("contained"))); String json = ourCtx.newJsonParser().encodeResourceToString(comp); assertThat(json, not(containsString("contained"))); } /** * See #103 */ @Test public void testDontEncodeUnnecessaryContainedResources02() { Composition comp = new Composition(); comp.addAuthor().setReference("Practitioner/123"); comp.getContained().getContainedResources().add(createAllergy("#AAA", "allergy0")); comp.getContained().getContainedResources().add(createAllergy("#BBB", "allergy1")); comp.addSection().getContent().setReference("#AAA"); String xml = ourCtx.newXmlParser().encodeResourceToString(comp); assertThat(xml, stringContainsInOrder("<contained>", "id=\"AAA\"", "reference value=\"#AAA\"")); assertThat(xml, not(containsString("BBB"))); String json = ourCtx.newJsonParser().encodeResourceToString(comp); assertThat(json, stringContainsInOrder("\"contained\"", "\"id\":\"AAA\"", "\"reference\":\"#AAA\"")); assertThat(json, not(containsString("BBB"))); } /** * See #103 */ @Test public void testDontEncodeUnnecessaryContainedResources03() { Composition comp = new Composition(); comp.addAuthor().setReference("Practitioner/123"); AllergyIntolerance allergy = createAllergy("#AAA", "allergy0"); comp.getContained().getContainedResources().add(allergy); comp.addSection().getContent().setResource(allergy); String xml = ourCtx.newXmlParser().encodeResourceToString(comp); assertThat(xml, stringContainsInOrder("<contained>", "id=\"AAA\"", "reference value=\"#AAA\"")); assertThat(xml, not(stringContainsInOrder("AAA", ">", "AAA", ">", "AAA"))); // only once in the contained tag, and once in the reference String json = ourCtx.newJsonParser().encodeResourceToString(comp); assertThat(json, stringContainsInOrder("\"contained\"", "\"id\":\"AAA\"", "\"reference\":\"#AAA\"")); assertThat(json, not(stringContainsInOrder("AAA", "\"", "AAA", "\"", "AAA"))); // only once in the contained tag, and once in the reference } /** * See #103 */ @Test public void testDontEncodeUnnecessaryContainedResources04() { Composition comp = new Composition(); comp.addAuthor().setReference("Practitioner/999"); AllergyIntolerance allergy = createAllergy(null, "allergy0"); comp.getContained().getContainedResources().add(allergy); comp.addSection().getContent().setResource(allergy); String xml = ourCtx.newXmlParser().encodeResourceToString(comp); assertThat(xml, stringContainsInOrder("<contained>", "id=\"1\"", "reference value=\"#1\"")); assertThat(xml, not(stringContainsInOrder("1", ">", "1", ">", "1"))); // only once in the contained tag, and once in the reference String json = ourCtx.newJsonParser().encodeResourceToString(comp); assertThat(json, stringContainsInOrder("\"contained\"", "\"id\":\"1\"", "\"reference\":\"#1\"")); assertThat(json, not(stringContainsInOrder("1", "\"", "1", "\"", "1"))); // only once in the contained tag, and once in the reference } /** * See #103 */ @Test public void testDontEncodeUnnecessaryContainedResources05() { Composition comp = new Composition(); comp.addAuthor().setReference("Practitioner/999"); AllergyIntolerance allergy = createAllergy(null, "allergy0"); comp.addSection().getContent().setResource(allergy); String xml = ourCtx.newXmlParser().encodeResourceToString(comp); assertThat(xml, stringContainsInOrder("<contained>", "id=\"1\"", "reference value=\"#1\"")); assertThat(xml, not(stringContainsInOrder("1", ">", "1", ">", "1"))); // only once in the contained tag, and once in the reference String json = ourCtx.newJsonParser().encodeResourceToString(comp); assertThat(json, stringContainsInOrder("\"contained\"", "\"id\":\"1\"", "\"reference\":\"#1\"")); assertThat(json, not(stringContainsInOrder("1", "\"", "1", "\"", "1"))); // only once in the contained tag, and once in the reference } /** * See #103 */ @Test public void testDontEncodeUnnecessaryContainedResources06() { Composition comp = new Composition(); comp.addSection().getContent().setResource(new AllergyIntolerance().addIdentifier("foo", "bar")); comp.addSection().getContent().setResource(new AllergyIntolerance().addIdentifier("foo", "bar")); comp.addSection().getContent().setResource(new AllergyIntolerance().addIdentifier("foo", "bar")); String string = ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(comp); ourLog.info(string); String xml = ourCtx.newXmlParser().encodeResourceToString(comp); assertThat(xml, stringContainsInOrder("<contained>", "id=\"1\"", "reference value=\"#1\"")); } /** * See #120 */ @Test public void testParseExtensionWithBoundCodeType() { //@formatter:off String resText = "<DiagnosticReport xmlns=\"http://hl7.org/fhir\">" + " <extension url=\"http://agfa.com/extensions#workflowAction\">" + " <valueCode value=\"sign-off\"/>" + " </extension>" + "</DiagnosticReport>"; //@formatter:on MyDiagnosticReportWithBoundCodeExtension res = ourCtx.newXmlParser().parseResource(MyDiagnosticReportWithBoundCodeExtension.class, resText); assertEquals(WorkflowActionEnum.SIGNOFF, res.getWorkflowAction().getValueAsEnum()); } @AfterClass public static void afterClassClearContext() { TestUtil.clearAllStaticFieldsForUnitTest(); } }