/******************************************************************************* * Open Behavioral Health Information Technology Architecture (OBHITA.org) * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the <organization> nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ******************************************************************************/ package gov.samhsa.consent.pg; import static gov.samhsa.consent2share.commonunit.matcher.ArgumentMatchers.matching; import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.anyLong; import static org.mockito.Matchers.argThat; import static org.mockito.Matchers.eq; import static org.mockito.Matchers.isA; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import gov.samhsa.acs.common.param.Params; import gov.samhsa.acs.common.tool.XmlTransformer; import gov.samhsa.consent.ConsentBuilderImpl; import gov.samhsa.consent.ConsentDto; import gov.samhsa.consent.ConsentDtoFactory; import gov.samhsa.consent.ConsentGenException; import gov.samhsa.consent.PatientDto; import gov.samhsa.consent.XslResource; import java.util.Optional; 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.runners.MockitoJUnitRunner; import org.springframework.test.util.ReflectionTestUtils; @RunWith(MockitoJUnitRunner.class) public class ConsentBuilderImplTest { public static final String C2S_ACCOUNT_ORG = "C2S_ACCOUNT_ORG"; @InjectMocks ConsentBuilderImpl sut; @Mock ConsentDtoFactory consentDtoFactoryMock; @Mock XmlTransformer xmlTransformerMock; @Mock XacmlXslUrlProviderImpl xacmlXslUrlProviderImplMock; @Rule public ExpectedException thrown = ExpectedException.none(); @Before public void setup() { ReflectionTestUtils.setField(sut, "c2sAccountOrg", C2S_ACCOUNT_ORG); } @SuppressWarnings("unchecked") @Test public void testBuildConsent2Cdar2() throws ConsentGenException { // Arrange final long consentId = 1; final ConsentDto consentDtoMock = mock(ConsentDto.class); final String c2cdar2XslUrlMock = "c2cdar2XslUrlMock"; when(consentDtoFactoryMock.createConsentDto(anyLong())).thenReturn( consentDtoMock); final String cdar2Mock = "cdar2"; when(xacmlXslUrlProviderImplMock.getUrl(XslResource.CDAR2XSLNAME)) .thenReturn(c2cdar2XslUrlMock); when( xmlTransformerMock.transform(eq(consentDtoMock), eq(c2cdar2XslUrlMock), isA(Optional.class), isA(Optional.class))).thenReturn(cdar2Mock); // Act final String cdar2 = sut.buildConsent2Cdar2(consentId); // Assert assertEquals(cdar2Mock, cdar2); verify(xmlTransformerMock).transform( eq(consentDtoMock), eq(c2cdar2XslUrlMock), argThat(matching((Optional<Params> params) -> params .isPresent() == false)), isA(Optional.class)); } @SuppressWarnings("unchecked") @Test public void testBuildConsent2Cdar2_ConsentGenException() throws ConsentGenException { // Arrange thrown.expect(ConsentGenException.class); final long consentId = 1; final String c2cdar2XslUrlMock = "c2cdar2XslUrlMock"; final ConsentDto consentDtoMock = mock(ConsentDto.class); when(xacmlXslUrlProviderImplMock.getUrl(XslResource.CDAR2XSLNAME)) .thenReturn(c2cdar2XslUrlMock); when(consentDtoFactoryMock.createConsentDto(anyLong())).thenReturn( consentDtoMock); when( xmlTransformerMock.transform(eq(consentDtoMock), eq(c2cdar2XslUrlMock), isA(Optional.class), isA(Optional.class))).thenThrow( new RuntimeException("Error in saxon transform")); // Act sut.buildConsent2Cdar2(consentId); // Assert } @SuppressWarnings("unchecked") @Test public void testBuildConsent2Xacml() throws ConsentGenException { // Arrange final String eidMock = "eidMock"; final String mrnMock = "mrnMock"; final String c2xacmlXslUrlMock = "c2xacmlXslUrlMock"; final Long consentId = new Long(1); final ConsentDto consentDtoMock = mock(ConsentDto.class); final PatientDto patientDtoMock = mock(PatientDto.class); when(xacmlXslUrlProviderImplMock.getUrl(XslResource.XACMLXSLNAME)) .thenReturn(c2xacmlXslUrlMock); when(consentDtoFactoryMock.createConsentDto(consentId)).thenReturn( consentDtoMock); when(consentDtoMock.getPatientDto()).thenReturn(patientDtoMock); // when(patientDtoMock.getEnterpriseIdentifier()).thenReturn(eidMock); when(patientDtoMock.getMedicalRecordNumber()).thenReturn(mrnMock); final String xacmlMock = "xacml"; when( xmlTransformerMock.transform(eq(consentDtoMock), eq(c2xacmlXslUrlMock), isA(Optional.class), isA(Optional.class))).thenReturn(xacmlMock); // Act final String xacml = sut.buildConsent2Xacml(consentId); // Assert assertEquals(xacmlMock, xacml); verify(xmlTransformerMock).transform( eq(consentDtoMock), eq(c2xacmlXslUrlMock), argThat(matching((Optional<Params> params) -> params .isPresent() == true && params.get().toMap().size() == 1 && params.get().get(ConsentBuilderImpl.PARAM_MRN) .equals(mrnMock))), isA(Optional.class)); } @SuppressWarnings("unchecked") @Test public void testBuildConsent2Xacml_ConsentGenException() throws ConsentGenException { // Arrange final String eidMock = "eidMock"; final String mrnMock = "mrnMock"; final String c2xacmlXslUrlMock = "c2xacmlXslUrlMock"; thrown.expect(ConsentGenException.class); final Long consentId = new Long(1); final ConsentDto consentDtoMock = mock(ConsentDto.class); final PatientDto patientDtoMock = mock(PatientDto.class); when(xacmlXslUrlProviderImplMock.getUrl(XslResource.XACMLXSLNAME)) .thenReturn(c2xacmlXslUrlMock); when(consentDtoMock.getPatientDto()).thenReturn(patientDtoMock); // when(patientDtoMock.getEnterpriseIdentifier()).thenReturn(eidMock); when(patientDtoMock.getMedicalRecordNumber()).thenReturn(mrnMock); when(consentDtoFactoryMock.createConsentDto(consentId)).thenReturn( consentDtoMock); when( xmlTransformerMock.transform(eq(consentDtoMock), eq(c2xacmlXslUrlMock), isA(Optional.class), isA(Optional.class))).thenThrow( new RuntimeException("Error in saxon transform")); // Act sut.buildConsent2Xacml(consentId); // Assert } @SuppressWarnings("unchecked") @Test public void testBuildConsent2XacmlPdfConsentFrom() throws ConsentGenException { // Arrange final String mrnMock = "mrnMock"; final String eidMock = "eidMock"; final String polId = "C2S.PG-DEV.RmETWp:&2.16.840.1.113883.3.704.100.200.1.1.3.1&ISO:1578821153:1427467752:XM2UoY"; final String polIdNew = "C2S.PG-DEV.RmETWp:&2.16.840.1.113883.3.704.100.200.1.1.3.1&ISO:1427467752:C2S_ACCOUNT_ORG:XM2UoY"; final String c2xacmlpdfConsentFromXslUrlMock = "c2xacmlpdfConsentFromXslUrlMock"; final Long consentId = new Long(1); final ConsentDto consentDtoMock = mock(ConsentDto.class); final PatientDto patientDtoMock = mock(PatientDto.class); when( xacmlXslUrlProviderImplMock .getUrl(XslResource.XACMLPDFCONSENTFROMXSLNAME)) .thenReturn(c2xacmlpdfConsentFromXslUrlMock); when(consentDtoFactoryMock.createConsentDto(consentId)).thenReturn( consentDtoMock); when(consentDtoMock.getPatientDto()).thenReturn(patientDtoMock); when(consentDtoMock.getConsentReferenceid()).thenReturn(polId); // when(patientDtoMock.getEnterpriseIdentifier()).thenReturn(eidMock); when(patientDtoMock.getMedicalRecordNumber()).thenReturn(mrnMock); final String xacmlMock = "xacml"; when( xmlTransformerMock.transform(eq(consentDtoMock), eq(c2xacmlpdfConsentFromXslUrlMock), isA(Optional.class), isA(Optional.class))).thenReturn( xacmlMock); // Act final String xacml = sut.buildConsent2XacmlPdfConsentFrom(consentId); // Assert assertEquals(xacmlMock, xacml); verify(xmlTransformerMock).transform( eq(consentDtoMock), eq(c2xacmlpdfConsentFromXslUrlMock), argThat(matching((Optional<Params> params) -> params .isPresent() == true && params.get().toMap().size() == 2 && params.get().toMap() .get(ConsentBuilderImpl.PARAM_MRN) .equals(mrnMock) && params.get().toMap() .get(ConsentBuilderImpl.PARAM_POLICY_ID) .equals(polIdNew))), isA(Optional.class)); } @SuppressWarnings("unchecked") @Test public void testBuildConsent2XacmlPdfConsentFrom_ConsentGenException() throws ConsentGenException { // Arrange final String eidMock = "eidMock"; final String mrnMock = "mrnMock"; final String c2xacmlpdfConsentFromXslUrlMock = "c2xacmlpdfConsentFromXslUrlMock"; thrown.expect(ConsentGenException.class); final Long consentId = new Long(1); final ConsentDto consentDtoMock = mock(ConsentDto.class); final PatientDto patientDtoMock = mock(PatientDto.class); when( xacmlXslUrlProviderImplMock .getUrl(XslResource.XACMLPDFCONSENTFROMXSLNAME)) .thenReturn(c2xacmlpdfConsentFromXslUrlMock); when(consentDtoMock.getPatientDto()).thenReturn(patientDtoMock); // when(patientDtoMock.getEnterpriseIdentifier()).thenReturn(eidMock); when(patientDtoMock.getMedicalRecordNumber()).thenReturn(mrnMock); when(consentDtoFactoryMock.createConsentDto(consentId)).thenReturn( consentDtoMock); when( xmlTransformerMock.transform(eq(consentDtoMock), eq(c2xacmlpdfConsentFromXslUrlMock), isA(Optional.class), isA(Optional.class))).thenThrow( new RuntimeException("Error in saxon transform")); // Act sut.buildConsent2XacmlPdfConsentFrom(consentId); // Assert } @SuppressWarnings("unchecked") @Test public void testBuildConsent2XacmlPdfConsentTo() throws ConsentGenException { // Arrange final String eidMock = "eidMock"; final String mrnMock = "mrnMock"; final String polId = "C2S.PG-DEV.RmETWp:&2.16.840.1.113883.3.704.100.200.1.1.3.1&ISO:1578821153:1427467752:XM2UoY"; final String polIdNew = "C2S.PG-DEV.RmETWp:&2.16.840.1.113883.3.704.100.200.1.1.3.1&ISO:1578821153:C2S_ACCOUNT_ORG:XM2UoY"; final String c2xacmlpdfConsentToXslUrlMock = "c2xacmlpdfConsentToXslUrlMock"; final Long consentId = new Long(1); final ConsentDto consentDtoMock = mock(ConsentDto.class); final PatientDto patientDtoMock = mock(PatientDto.class); when( xacmlXslUrlProviderImplMock .getUrl(XslResource.XACMLPDFCONSENTTOXSLNAME)) .thenReturn(c2xacmlpdfConsentToXslUrlMock); when(consentDtoFactoryMock.createConsentDto(consentId)).thenReturn( consentDtoMock); when(consentDtoMock.getConsentReferenceid()).thenReturn(polId); when(consentDtoMock.getPatientDto()).thenReturn(patientDtoMock); // when(patientDtoMock.getEnterpriseIdentifier()).thenReturn(eidMock); when(patientDtoMock.getMedicalRecordNumber()).thenReturn(mrnMock); final String xacmlMock = "xacml"; when( xmlTransformerMock.transform(eq(consentDtoMock), eq(c2xacmlpdfConsentToXslUrlMock), isA(Optional.class), isA(Optional.class))).thenReturn(xacmlMock); // Act final String xacml = sut.buildConsent2XacmlPdfConsentTo(consentId); // Assert assertEquals(xacmlMock, xacml); verify(xmlTransformerMock).transform( eq(consentDtoMock), eq(c2xacmlpdfConsentToXslUrlMock), argThat(matching((Optional<Params> params) -> params .isPresent() == true && params.get().toMap().size() == 2 && params.get().toMap() .get(ConsentBuilderImpl.PARAM_MRN) .equals(mrnMock) && params.get().toMap() .get(ConsentBuilderImpl.PARAM_POLICY_ID) .equals(polIdNew))), isA(Optional.class)); } @SuppressWarnings("unchecked") @Test public void testBuildConsent2XacmlPdfConsentTo_ConsentGenException() throws ConsentGenException { // Arrange final String eidMock = "eidMock"; final String mrnMock = "mrnMock"; final String polId = "C2S.PG-DEV.RmETWp:&2.16.840.1.113883.3.704.100.200.1.1.3.1&ISO:1578821153:1427467752:XM2UoY"; final String c2xacmlpdfConsentToXslUrlMock = "c2xacmlpdfConsentToXslUrlMock"; thrown.expect(ConsentGenException.class); final Long consentId = new Long(1); final ConsentDto consentDtoMock = mock(ConsentDto.class); final PatientDto patientDtoMock = mock(PatientDto.class); when( xacmlXslUrlProviderImplMock .getUrl(XslResource.XACMLPDFCONSENTTOXSLNAME)) .thenReturn(c2xacmlpdfConsentToXslUrlMock); when(consentDtoMock.getPatientDto()).thenReturn(patientDtoMock); when(consentDtoMock.getConsentReferenceid()).thenReturn(polId); // when(patientDtoMock.getEnterpriseIdentifier()).thenReturn(eidMock); when(patientDtoMock.getMedicalRecordNumber()).thenReturn(mrnMock); when(consentDtoFactoryMock.createConsentDto(consentId)).thenReturn( consentDtoMock); when( xmlTransformerMock.transform(eq(consentDtoMock), eq(c2xacmlpdfConsentToXslUrlMock), isA(Optional.class), isA(Optional.class))).thenThrow( new RuntimeException("Error in saxon transform")); // Act sut.buildConsent2XacmlPdfConsentTo(consentId); // Assert } }