package gov.samhsa.consent2share.infrastructure;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import gov.samhsa.acs.common.tool.SimpleMarshallerImpl;
import gov.samhsa.consent2share.hl7.Hl7v3Transformer;
import gov.samhsa.consent2share.hl7.Hl7v3TransformerException;
import gov.samhsa.consent2share.pixclient.service.PixManagerService;
import gov.samhsa.consent2share.pixclient.util.PixManagerBean;
import gov.samhsa.consent2share.pixclient.util.PixManagerConstants;
import gov.samhsa.consent2share.pixclient.util.PixManagerMessageHelper;
import gov.samhsa.consent2share.pixclient.util.PixManagerRequestXMLToJava;
import java.io.IOException;
import javax.xml.bind.JAXBException;
import org.hl7.v3.types.PRPAIN201309UV02;
import org.hl7.v3.types.PRPAIN201310UV02;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Spy;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.test.util.ReflectionTestUtils;
@RunWith(MockitoJUnitRunner.class)
public class PixServiceImplTest {
@InjectMocks
private PixServiceImpl sut;;
@Mock
private PixManagerRequestXMLToJava requestXMLToJava;
@Mock
private PixManagerService pixManagerService;
@Mock
private Hl7v3Transformer hl7v3Transformer;
@Spy
private PixManagerMessageHelper pixManagerMessageHelper;
@Mock
private SimpleMarshallerImpl marshallerMock;
private SimpleMarshallerImpl marshaller;
@Rule
public ExpectedException thrown = ExpectedException.none();
private final String MRN_DOMAIN = "MRN_DOMAIN";
private final String MRN = "MRN";
private final String EXPECTED_EID = "1c5c59f0-5788-11e3-84b3-00155d3a2124";
private final String EXPECTED_DOMAIN = "2.16.840.1.113883.4.357";
@Before
public void setUp() throws Exception {
marshaller = new SimpleMarshallerImpl();
}
@Test
public void testGetEid() throws Hl7v3TransformerException, JAXBException,
IOException {
// Arrange
ReflectionTestUtils.setField(sut, "mrnDomain", MRN_DOMAIN);
PixManagerConstants.GLOBAL_DOMAIN_ID = EXPECTED_DOMAIN;
arrangeCommonValid();
// Act
String eid = sut.getEid(MRN);
// Assert
assertEquals(EXPECTED_EID, eid);
verify(marshallerMock, times(2)).marshal(anyObject());
}
@SuppressWarnings("unchecked")
@Test
public void testGetEid_Query_Failure_Hl7v3TransformerException()
throws Hl7v3TransformerException {
// Arrange
thrown.expect(IllegalArgumentException.class);
ReflectionTestUtils.setField(sut, "mrnDomain", MRN_DOMAIN);
PixManagerConstants.GLOBAL_DOMAIN_ID = EXPECTED_DOMAIN;
when(
hl7v3Transformer.getPixQueryXml(MRN, MRN_DOMAIN,
Hl7v3Transformer.XML_PIX_QUERY)).thenThrow(
Hl7v3TransformerException.class);
// Act
String eid = sut.getEid(MRN);
// Assert
assertNull(eid);
}
@Test
public void testQueryPerson() throws Hl7v3TransformerException,
JAXBException, IOException {
// Arrange
String expectedQueryMessage = "Query Success! Given PID: PUI100010060001 Given UID: 2.16.840.1.113883.3.72.5.9.1 ";
arrangeCommonValid();
// Act
PixManagerBean bean = sut.queryPatient(MRN, MRN_DOMAIN);
// Assert
assertNotNull(bean);
assertEquals(expectedQueryMessage, bean.getQueryMessage());
assertEquals(EXPECTED_EID, bean.getQueryIdMap().get(EXPECTED_DOMAIN));
assertEquals("", bean.getAddMessage());
assertEquals("", bean.getUpdateMessage());
verify(marshallerMock, times(2)).marshal(anyObject());
}
@SuppressWarnings("unchecked")
@Test
public void testQueryPerson_Throws_Hl7v3TransformerException()
throws Hl7v3TransformerException, JAXBException, IOException {
// Arrange
when(
hl7v3Transformer.getPixQueryXml(MRN, MRN_DOMAIN,
Hl7v3Transformer.XML_PIX_QUERY)).thenThrow(
Hl7v3TransformerException.class);
thrown.expect(RuntimeException.class);
// Act
@SuppressWarnings("unused")
PixManagerBean bean = sut.queryPatient(MRN, MRN_DOMAIN);
}
@SuppressWarnings("unchecked")
@Test
public void testQueryPerson_Query_Failure_JAXBException()
throws Hl7v3TransformerException, JAXBException, IOException {
// Arrange
String expectedErrorMessage = "Query Failure! Server error! A unexpected error has occured";
String hl7v3 = "hl7v3";
when(
hl7v3Transformer.getPixQueryXml(MRN, MRN_DOMAIN,
Hl7v3Transformer.XML_PIX_QUERY)).thenReturn(hl7v3);
when(
requestXMLToJava.getPIXQueryReqObject(hl7v3,
PixManagerConstants.ENCODE_STRING)).thenThrow(
JAXBException.class);
// Act
PixManagerBean bean = sut.queryPatient(MRN, MRN_DOMAIN);
// Assert
assertEquals(expectedErrorMessage, bean.getQueryMessage());
}
@SuppressWarnings("unchecked")
@Test
public void testQueryPerson_Query_Failure_IOException()
throws Hl7v3TransformerException, JAXBException, IOException {
// Arrange
String expectedErrorMessage = "Query Failure! Server error! A unexpected error has occured";
String hl7v3 = "hl7v3";
when(
hl7v3Transformer.getPixQueryXml(MRN, MRN_DOMAIN,
Hl7v3Transformer.XML_PIX_QUERY)).thenReturn(hl7v3);
when(
requestXMLToJava.getPIXQueryReqObject(hl7v3,
PixManagerConstants.ENCODE_STRING)).thenThrow(
IOException.class);
// Act
PixManagerBean bean = sut.queryPatient(MRN, MRN_DOMAIN);
// Assert
assertEquals(expectedErrorMessage, bean.getQueryMessage());
}
// Arrange common valid scenario
private void arrangeCommonValid() throws JAXBException,
Hl7v3TransformerException, IOException {
String hl7v3 = "hl7v3";
String responseMockString = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><PRPA_IN201310UV02 ITSVersion=\"XML_1.0\" xmlns=\"urn:hl7-org:v3\"><id root=\"1.1\" extension=\"107e7d8d-5d80-4744-a4b3-3462edbacca6\"/><creationTime value=\"20131216193923\"/><interactionId root=\"2.16.840.1.113883.1.6\" extension=\"PRPA_IN201310UV02\"/><processingCode code=\"P\"/><processingModeCode code=\"T\"/><acceptAckCode code=\"NE\"/><receiver typeCode=\"RCV\"><device classCode=\"DEV\" determinerCode=\"INSTANCE\"><id root=\"1.2.840.114350.1.13.99998.8734\"/></device></receiver><sender typeCode=\"SND\"><device classCode=\"DEV\" determinerCode=\"INSTANCE\"><id root=\"1.2.840.114350.1.13.99999.4567\"/></device></sender><acknowledgement><typeCode code=\"AA\"/><targetMessage><id root=\"2220c1c4-87ef-11dc-b865-3603d6866807\"/></targetMessage></acknowledgement><controlActProcess classCode=\"CACT\" moodCode=\"EVN\"><code code=\"PRPA_TE201310UV02\"/><subject typeCode=\"SUBJ\"><registrationEvent classCode=\"REG\" moodCode=\"EVN\"><id nullFlavor=\"NA\"/><statusCode code=\"active\"/><subject1 typeCode=\"SBJ\"><patient classCode=\"PAT\"><id root=\"2.16.840.1.113883.4.357\" extension=\"1c5c59f0-5788-11e3-84b3-00155d3a2124\"/><statusCode code=\"active\"/><patientPerson classCode=\"PSN\" determinerCode=\"INSTANCE\"><name nullFlavor=\"NA\"/></patientPerson></patient></subject1><custodian typeCode=\"CST\"><assignedEntity classCode=\"ASSIGNED\"><id root=\"1.3.6.1.4.1.21367.13.50.106\"/></assignedEntity></custodian></registrationEvent></subject><queryAck><queryId root=\"1.2.840.114350.1.13.99999.4567.34\" extension=\"018499884245\"/><queryResponseCode code=\"OK\"/></queryAck><queryByParameter><queryId root=\"1.2.840.114350.1.13.99999.4567.34\" extension=\"018499884245\"/><statusCode code=\"new\"/><responsePriorityCode code=\"I\"/><parameterList><patientIdentifier><value root=\"2.16.840.1.113883.3.72.5.9.1\" extension=\"PUI100010060001\"/><semanticsText/></patientIdentifier></parameterList></queryByParameter></controlActProcess></PRPA_IN201310UV02>";
PRPAIN201309UV02 requestMock = mock(PRPAIN201309UV02.class);
PRPAIN201310UV02 responseMock = marshaller.unmarshalFromXml(
PRPAIN201310UV02.class, responseMockString);
when(
hl7v3Transformer.getPixQueryXml(MRN, MRN_DOMAIN,
Hl7v3Transformer.XML_PIX_QUERY)).thenReturn(hl7v3);
when(
requestXMLToJava.getPIXQueryReqObject(hl7v3,
PixManagerConstants.ENCODE_STRING)).thenReturn(
requestMock);
when(pixManagerService.pixManagerPRPAIN201309UV02(requestMock))
.thenReturn(responseMock);
}
}