package gov.samhsa.acs.xdsb.registry.wsclient.adapter; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import static org.mockito.Mockito.*; import gov.samhsa.acs.common.tool.DocumentAccessor; import gov.samhsa.acs.common.tool.DocumentXmlConverter; import gov.samhsa.acs.common.tool.DocumentXmlConverterImpl; import gov.samhsa.acs.common.tool.FileReader; import gov.samhsa.acs.common.tool.FileReaderImpl; import gov.samhsa.acs.common.tool.SimpleMarshaller; import gov.samhsa.acs.common.tool.SimpleMarshallerImpl; import gov.samhsa.acs.xdsb.common.XdsbDocumentReference; import gov.samhsa.acs.xdsb.common.XdsbDocumentType; import gov.samhsa.acs.xdsb.registry.wsclient.XdsbRegistryWebServiceClient; import gov.samhsa.acs.xdsb.registry.wsclient.exception.XdsbRegistryAdapterException; import ihe.iti.xds_b._2007.RetrieveDocumentSetRequest; import java.io.IOException; import java.util.LinkedList; import java.util.List; import javax.xml.bind.JAXBException; import oasis.names.tc.ebxml_regrep.xsd.query._3.AdhocQueryRequest; import oasis.names.tc.ebxml_regrep.xsd.query._3.AdhocQueryResponse; import oasis.names.tc.ebxml_regrep.xsd.rim._3.AdhocQueryType; import oasis.names.tc.ebxml_regrep.xsd.rim._3.SlotType1; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class XdsbRegistryAdapterTest { // Constants private static final String PATIENT_ID = "PATIENT_ID"; private static final String DOMAIN_ID = "DOMAIN_ID"; private String patientUniqueId; private static final XdsbDocumentType XDSB_DOCUMENT_TYPE_CLINICAL_DOCUMENT = XdsbDocumentType.CLINICAL_DOCUMENT; private static final XdsbDocumentType XDSB_DOCUMENT_TYPE_PRIVACY_CONSENT = XdsbDocumentType.PRIVACY_CONSENT; // Mocks @Mock private XdsbRegistryWebServiceClient xdsbRegistryMock; @Mock private SimpleMarshaller marshallerMock; @Mock private DocumentXmlConverter documentXmlConverterMock; @Mock private AdhocQueryResponseFilter responseFilterMock; @Mock private DocumentAccessor documentAccessorMock; // Helpers private FileReader fileReader; private SimpleMarshaller marshaller; private DocumentXmlConverter documentXmlConverter; // System under test private XdsbRegistryAdapter xdsbRegistryAdapterSpy; @Before public void setUp() throws Exception { StringBuilder builder = new StringBuilder(); builder.append("'"); builder.append(PATIENT_ID); builder.append("^^^&"); builder.append(DOMAIN_ID); builder.append("&ISO'"); this.patientUniqueId = builder.toString(); fileReader = new FileReaderImpl(); marshaller = new SimpleMarshallerImpl(); documentXmlConverter = new DocumentXmlConverterImpl(); MockitoAnnotations.initMocks(this); XdsbRegistryAdapter xdsbRegistryAdapter = new XdsbRegistryAdapter( xdsbRegistryMock, responseFilterMock, marshallerMock, documentXmlConverterMock, documentAccessorMock); xdsbRegistryAdapterSpy = spy(xdsbRegistryAdapter); } @Test public void testRegistryStoredQuery_Given_AdhocQueryRequest() { // Arrange AdhocQueryRequest adhocQueryRequest = new AdhocQueryRequest(); AdhocQueryResponse adhocQueryResponse = new AdhocQueryResponse(); when(xdsbRegistryMock.registryStoredQuery(adhocQueryRequest)) .thenReturn(adhocQueryResponse); // Act AdhocQueryResponse actualResponse = xdsbRegistryAdapterSpy .registryStoredQuery(adhocQueryRequest); // Assert assertEquals(adhocQueryResponse, actualResponse); } @Test public void testRegistryStoredQuery_Given_PatientId_HomeCommunityId_XdsbDocumentType_ClinicalDocument() throws Exception, Throwable { // Arrange AdhocQueryRequest adhocQueryRequest = new AdhocQueryRequest(); AdhocQueryResponse adhocQueryResponse = new AdhocQueryResponse(); when( xdsbRegistryAdapterSpy.createRegistryStoredQueryByPatientId( patientUniqueId, XDSB_DOCUMENT_TYPE_CLINICAL_DOCUMENT, false, "")).thenReturn(adhocQueryRequest); when(xdsbRegistryMock.registryStoredQuery(adhocQueryRequest)) .thenReturn(adhocQueryResponse); // Act AdhocQueryResponse actualResponse = xdsbRegistryAdapterSpy .registryStoredQuery(patientUniqueId, null, XDSB_DOCUMENT_TYPE_CLINICAL_DOCUMENT, false, ""); // Assert assertEquals(adhocQueryResponse, actualResponse); } @Test public void testRegistryStoredQuery_Given_PatientId_HomeCommunityId_XdsbDocumentType_PrivacyConsent() throws Exception, Throwable { // Arrange AdhocQueryRequest adhocQueryRequest = new AdhocQueryRequest(); AdhocQueryResponse adhocQueryResponse = new AdhocQueryResponse(); when( xdsbRegistryAdapterSpy.createRegistryStoredQueryByPatientId( patientUniqueId, XDSB_DOCUMENT_TYPE_PRIVACY_CONSENT, true, "")).thenReturn(adhocQueryRequest); when(xdsbRegistryMock.registryStoredQuery(adhocQueryRequest)) .thenReturn(adhocQueryResponse); // Act AdhocQueryResponse actualResponse = xdsbRegistryAdapterSpy .registryStoredQuery(patientUniqueId, null, XDSB_DOCUMENT_TYPE_PRIVACY_CONSENT, true, ""); // Assert assertEquals(adhocQueryResponse, actualResponse); } @Test public void testExtractXdsbDocumentReferenceList_Given_AdhocQueryResponse_ClinicalDocument() throws Exception, Throwable { // Arrange XdsbDocumentReference xdsbDocumentReference1 = new XdsbDocumentReference( "41421263015.98411.41414.91230.401390172014139", "1.3.6.1.4.1.21367.2010.1.2.1040"); XdsbDocumentReference xdsbDocumentReference2 = new XdsbDocumentReference( "1513150391310.11184.4632.11139.05080551281557", "1.3.6.1.4.1.21367.2010.1.2.1040"); String adhocQueryResponseString = fileReader .readFile("adhocQueryResponseClinicalDocument.xml"); AdhocQueryResponse adhocQueryResponse = marshaller.unmarshalFromXml( AdhocQueryResponse.class, adhocQueryResponseString); when(marshallerMock.marshal(adhocQueryResponse)).thenReturn( adhocQueryResponseString); Document doc = documentXmlConverter .loadDocument(adhocQueryResponseString); when(documentXmlConverterMock.loadDocument(adhocQueryResponseString)) .thenReturn(doc); // Act List<XdsbDocumentReference> list = xdsbRegistryAdapterSpy .extractXdsbDocumentReferenceList(adhocQueryResponse); // Assert assertEquals(2, list.size()); assertTrue(list.contains(xdsbDocumentReference1)); assertTrue(list.contains(xdsbDocumentReference2)); } @Test public void testExtractXdsbDocumentReferenceList_Given_AdhocQueryResponse_PrivacyConsent() throws Exception, Throwable { // Arrange XdsbDocumentReference xdsbDocumentReference1 = new XdsbDocumentReference( "2931513224.111050.43108.1114145.628015389614413", "1.3.6.1.4.1.21367.2010.1.2.1040"); XdsbDocumentReference xdsbDocumentReference2 = new XdsbDocumentReference( "12132124715.97915.410413.87115.61142312711102135", "1.3.6.1.4.1.21367.2010.1.2.1040"); String adhocQueryResponseString = fileReader .readFile("adhocQueryResponsePrivacyConsent.xml"); AdhocQueryResponse adhocQueryResponse = marshaller.unmarshalFromXml( AdhocQueryResponse.class, adhocQueryResponseString); when(marshallerMock.marshal(adhocQueryResponse)).thenReturn( adhocQueryResponseString); Document doc = documentXmlConverter .loadDocument(adhocQueryResponseString); when(documentXmlConverterMock.loadDocument(adhocQueryResponseString)) .thenReturn(doc); // Act List<XdsbDocumentReference> list = xdsbRegistryAdapterSpy .extractXdsbDocumentReferenceList(adhocQueryResponse); // Assert assertEquals(2, list.size()); assertTrue(list.contains(xdsbDocumentReference1)); assertTrue(list.contains(xdsbDocumentReference2)); } @Test public void testAddFormatCode_Given_AdhocQueryType_XdsbDocumentType_ClinicalDocument() { // Arrange String actualValue = null; String expectedValue = XdsbRegistryAdapter.FORMAT_CODE_CLINICAL_DOCUMENT; AdhocQueryType adhocQueryType = new AdhocQueryType(); // Act xdsbRegistryAdapterSpy.addFormatCode(adhocQueryType, XDSB_DOCUMENT_TYPE_CLINICAL_DOCUMENT, ""); List<SlotType1> slotList = adhocQueryType.getSlot(); for (SlotType1 slot : slotList) { List<String> values = slot.getValueList().getValue(); for (String value : values) { actualValue = value; } } // Assert assertNotNull(actualValue); assertEquals(expectedValue, actualValue); } @Test public void testAddFormatCode_Given_AdhocQueryType_XdsbDocumentType_PrivacyConsent() { // Arrange String actualValue = null; String expectedValue = XdsbRegistryAdapter.FORMAT_CODE_PRIVACY_CONSENT; AdhocQueryType adhocQueryType = new AdhocQueryType(); // Act xdsbRegistryAdapterSpy.addFormatCode(adhocQueryType, XDSB_DOCUMENT_TYPE_PRIVACY_CONSENT, ""); List<SlotType1> slotList = adhocQueryType.getSlot(); for (SlotType1 slot : slotList) { List<String> values = slot.getValueList().getValue(); for (String value : values) { actualValue = value; } } // Assert assertNotNull(actualValue); assertEquals(expectedValue, actualValue); } @Test public void testExtractXdsbDocumentReferenceListAsRetrieveDocumentSetRequest() throws Exception, Throwable { // Arrange AdhocQueryResponse responseMock = mock(AdhocQueryResponse.class); String marshalledXmlStringMock = "marshalledXmlStringMock"; XdsbDocumentReference ref1 = new XdsbDocumentReference( "41421263015.98411.41414.91230.401390172014139", "1.3.6.1.4.1.21367.2010.1.2.1040"); XdsbDocumentReference ref2 = new XdsbDocumentReference( "1513150391310.11184.4632.11139.05080551281557", "1.3.6.1.4.1.21367.2010.1.2.1040"); when(marshallerMock.marshal(responseMock)).thenReturn( marshalledXmlStringMock); when(documentXmlConverterMock.loadDocument(marshalledXmlStringMock)) .thenReturn( documentXmlConverter.loadDocument(fileReader .readFile("adhocQueryResponseClinicalDocument.xml"))); // Act RetrieveDocumentSetRequest actualResponse = xdsbRegistryAdapterSpy .extractXdsbDocumentReferenceListAsRetrieveDocumentSetRequest(responseMock); // Assert assertTrue(actualResponse.getDocumentRequest().contains(ref1)); assertTrue(actualResponse.getDocumentRequest().contains(ref2)); } @Test public void testGetPatientUniqueId() { // Arrange String patientIdMock = "patientIdMock"; String domainIdMock = "domainIdMock"; String expectedResponse = "'patientIdMock^^^&domainIdMock&ISO'"; // Act String actualResponse = xdsbRegistryAdapterSpy.getPatientUniqueId( patientIdMock, domainIdMock); // Assert assertEquals(expectedResponse, actualResponse); } @Test public void testExtractFormatCode() throws JAXBException, IOException { // Arrange String expectedResponse = "'2.16.840.1.113883.10.20.1^^HITSP'"; AdhocQueryRequest requestMock = marshaller.unmarshalFromXml( AdhocQueryRequest.class, fileReader.readFile("unitTestAdhocQueryRequest.xml")); // Act String actualResponse = xdsbRegistryAdapterSpy .extractFormatCode(requestMock); // Assert assertEquals(expectedResponse, actualResponse); } @Test public void testExtractPatientId() throws JAXBException, IOException { // Arrange String expectedResponse = "'1c5c59f0-5788-11e3-84b3-00155d3a2124^^^&2.16.840.1.113883.4.357&ISO'"; AdhocQueryRequest requestMock = marshaller.unmarshalFromXml( AdhocQueryRequest.class, fileReader.readFile("unitTestAdhocQueryRequest.xml")); // Act String actualResponse = xdsbRegistryAdapterSpy .extractPatientId(requestMock); // Assert assertEquals(expectedResponse, actualResponse); } @Test public void testExtractResponseOptionReturnType() throws JAXBException, IOException { // Arrange String expectedResponse = "LeafClass"; AdhocQueryRequest requestMock = marshaller.unmarshalFromXml( AdhocQueryRequest.class, fileReader.readFile("unitTestAdhocQueryRequest.xml")); // Act String actualResponse = xdsbRegistryAdapterSpy .extractResponseOptionReturnType(requestMock); // Assert assertEquals(expectedResponse, actualResponse); } @Test public void testExtractDocumentEntryStatus() throws JAXBException, IOException { // Arrange String expectedResponse = "('urn:oasis:names:tc:ebxml-regrep:StatusType:Approved')"; AdhocQueryRequest requestMock = marshaller.unmarshalFromXml( AdhocQueryRequest.class, fileReader.readFile("unitTestAdhocQueryRequest.xml")); // Act String actualResponse = xdsbRegistryAdapterSpy .extractDocumentEntryStatus(requestMock); // Assert assertEquals(expectedResponse, actualResponse); } @Test public void testRegistryStoredQuery() throws Exception, Throwable { // Arrange String patientIdMock = "patientIdMock"; String domainIdMock = "domainIdMock"; String authorIdMock = "authorIdMock"; String messageIdMock = "messageIdMock"; XdsbDocumentType xdsbDocumentTypeMock = XdsbDocumentType.CLINICAL_DOCUMENT; boolean serviceTimeAwareMock = false; AdhocQueryResponse responseMock = new AdhocQueryResponse(); AdhocQueryResponse filteredResponseMock = new AdhocQueryResponse(); when(xdsbRegistryMock.registryStoredQuery(isA(AdhocQueryRequest.class))) .thenReturn(responseMock); when(responseFilterMock.filterByAuthor(responseMock, authorIdMock)) .thenReturn(filteredResponseMock); // Act AdhocQueryResponse actualResponse = xdsbRegistryAdapterSpy .registryStoredQuery(patientIdMock, domainIdMock, authorIdMock, xdsbDocumentTypeMock, serviceTimeAwareMock, messageIdMock); // Assert assertEquals(filteredResponseMock, actualResponse); } @Test public void testFindDeprecatedDocumentUniqueIds() throws Throwable { // Arrange String submissionSetPatientIdMock = "submissionSetPatientIdMock"; String submissionSetAuthorPersonMock = "submissionSetAuthorPersonMock"; AdhocQueryRequest findSubmissionSetsRequestMock = mock(AdhocQueryRequest.class); AdhocQueryResponse findSubmissionSetsResponseMock = mock(AdhocQueryResponse.class); AdhocQueryRequest getSubmissionSetAndContentsRequestMock = mock(AdhocQueryRequest.class); AdhocQueryResponse getSubmissionSetAndContentsResponseMock = mock(AdhocQueryResponse.class); List<String> extractSubmissionSetUniqueIdsMock = new LinkedList<String>(); String extractSubmissionSetUniqueIdMock = "extractSubmissionSetUniqueIdMock"; extractSubmissionSetUniqueIdsMock.add(extractSubmissionSetUniqueIdMock); String deprecatedDocumentUniqueIdMock = "deprecatedDocumentUniqueIdMock"; when( xdsbRegistryAdapterSpy.createFindSubmissionSetsRequest( submissionSetPatientIdMock, submissionSetAuthorPersonMock)).thenReturn( findSubmissionSetsRequestMock); when( xdsbRegistryMock .registryStoredQuery(findSubmissionSetsRequestMock)) .thenReturn(findSubmissionSetsResponseMock); doReturn(extractSubmissionSetUniqueIdsMock) .when(xdsbRegistryAdapterSpy).extractSubmissionSetUniqueIds( findSubmissionSetsResponseMock); when( xdsbRegistryAdapterSpy .createGetSubmissionSetAndContentsRequest(extractSubmissionSetUniqueIdMock, "")) .thenReturn(getSubmissionSetAndContentsRequestMock); when( xdsbRegistryMock .registryStoredQuery(getSubmissionSetAndContentsRequestMock)) .thenReturn(getSubmissionSetAndContentsResponseMock); doReturn(deprecatedDocumentUniqueIdMock).when(xdsbRegistryAdapterSpy) .extractDeprecatedDocumentUniqueId( getSubmissionSetAndContentsResponseMock, ""); // Act List<String> result = xdsbRegistryAdapterSpy .findDeprecatedDocumentUniqueIds(submissionSetPatientIdMock, submissionSetAuthorPersonMock, ""); // Assert assertTrue(result.contains(deprecatedDocumentUniqueIdMock)); } @Test public void testFindSubmissionSets() throws JAXBException, XdsbRegistryAdapterException { // Arrange String submissionSetPatientIdMock = "submissionSetPatientIdMock"; String submissionSetAuthorPersonMock = "submissionSetAuthorPersonMock"; AdhocQueryRequest findSubmissionSetsRequestMock = mock(AdhocQueryRequest.class); AdhocQueryResponse findSubmissionSetsResponseMock = mock(AdhocQueryResponse.class); when( xdsbRegistryAdapterSpy.createFindSubmissionSetsRequest( submissionSetPatientIdMock, submissionSetAuthorPersonMock)).thenReturn( findSubmissionSetsRequestMock); when( xdsbRegistryMock .registryStoredQuery(findSubmissionSetsRequestMock)) .thenReturn(findSubmissionSetsResponseMock); // Act AdhocQueryResponse actualResponse = xdsbRegistryAdapterSpy .findSubmissionSets(submissionSetPatientIdMock, submissionSetAuthorPersonMock); // Assert assertEquals(findSubmissionSetsResponseMock, actualResponse); } @Test public void testGetSubmissionSetAndContents() throws JAXBException, XdsbRegistryAdapterException { // Arrange String submissionSetPatientIdMock = "submissionSetPatientIdMock"; AdhocQueryRequest getSubmissionSetAndContentsRequestMock = mock(AdhocQueryRequest.class); AdhocQueryResponse getSubmissionSetAndContentsResponseMock = mock(AdhocQueryResponse.class); when( xdsbRegistryAdapterSpy .createGetSubmissionSetAndContentsRequest(submissionSetPatientIdMock, "")) .thenReturn(getSubmissionSetAndContentsRequestMock); when( xdsbRegistryMock .registryStoredQuery(getSubmissionSetAndContentsRequestMock)) .thenReturn(getSubmissionSetAndContentsResponseMock); // Act AdhocQueryResponse actualResponse = xdsbRegistryAdapterSpy .getSubmissionSetAndContents(submissionSetPatientIdMock, ""); // Assert assertEquals(getSubmissionSetAndContentsResponseMock, actualResponse); } @Test public void testExtractSubmissionSetUniqueIds() throws Throwable { // Arrange AdhocQueryResponse responseMock = mock(AdhocQueryResponse.class); String responseXmlMock = "responseXmlMock"; Document documentMock = mock(Document.class); NodeList nodeListMock = mock(NodeList.class); Node nodeMock = mock(Node.class); String nodeValueMock = "nodeValueMock"; when(marshallerMock.marshal(responseMock)).thenReturn(responseXmlMock); when(documentXmlConverterMock.loadDocument(responseXmlMock)) .thenReturn(documentMock); when(documentAccessorMock.getNodeList(eq(documentMock), anyString())) .thenReturn(nodeListMock); when(nodeListMock.getLength()).thenReturn(1); when(nodeListMock.item(0)).thenReturn(nodeMock); when(nodeMock.getNodeValue()).thenReturn(nodeValueMock); // Act List<String> submissionSetUniqueIds = xdsbRegistryAdapterSpy .extractSubmissionSetUniqueIds(responseMock); // Assert assertTrue(submissionSetUniqueIds.contains(nodeValueMock)); } @Test public void testExtractDeprecatedDocumentUniqueId() throws Throwable { // Arrange AdhocQueryResponse responseMock = mock(AdhocQueryResponse.class); String responseXmlMock = "responseXmlMock"; Document documentMock = mock(Document.class); Node nodeMock = mock(Node.class); String nodeValueMock = "nodeValueMock"; when(marshallerMock.marshal(responseMock)).thenReturn(responseXmlMock); when(documentXmlConverterMock.loadDocument(responseXmlMock)) .thenReturn(documentMock); when(documentAccessorMock.getNode(eq(documentMock), anyString())) .thenReturn(nodeMock); when(nodeMock.getNodeValue()).thenReturn(nodeValueMock); // Act String deprecatedDocumentUniqueId = xdsbRegistryAdapterSpy .extractDeprecatedDocumentUniqueId(responseMock, ""); // Assert assertEquals(nodeValueMock, deprecatedDocumentUniqueId); } }