package gov.samhsa.acs.trypolicy;
import static gov.samhsa.consent2share.commonunit.matcher.ArgumentMatchers.matching;
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.argThat;
import static org.mockito.Matchers.isA;
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.brms.domain.SubjectPurposeOfUse;
import gov.samhsa.acs.brms.domain.XacmlResult;
import gov.samhsa.acs.common.dto.PdpRequestResponse;
import gov.samhsa.acs.common.dto.XacmlRequest;
import gov.samhsa.acs.common.dto.XacmlResponse;
import gov.samhsa.acs.common.tool.SimpleMarshallerImpl;
import gov.samhsa.acs.common.tool.exception.SimpleMarshallerException;
import gov.samhsa.acs.common.validation.exception.XmlDocumentReadFailureException;
import gov.samhsa.acs.contexthandler.ContextHandlerImpl;
import gov.samhsa.acs.documentsegmentation.dto.SegmentDocumentResponse;
import gov.samhsa.acs.documentsegmentation.exception.InvalidSegmentedClinicalDocumentException;
import gov.samhsa.acs.dss.ws.schema.DSSRequest;
import gov.samhsa.acs.dss.ws.schema.DSSResponse;
import gov.samhsa.acs.dss.wsclient.DSSWebServiceClient;
import gov.samhsa.acs.trypolicy.exception.TryPolicyException;
import java.util.ArrayList;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentMatcher;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import ch.qos.logback.audit.AuditException;
@RunWith(MockitoJUnitRunner.class)
public class PolicyTryingImplTest {
@Mock
private ContextHandlerImpl contextHandler;
@Mock
private SimpleMarshallerImpl marshaller;
@Mock
private DSSWebServiceClient documentSegmentation;
private PolicyTryingImpl sut;
@Before
public void setup() {
sut = new PolicyTryingImpl(contextHandler, marshaller,
documentSegmentation);
}
@Test
public void testTryPolicy() throws SimpleMarshallerException,
InvalidSegmentedClinicalDocumentException,
XmlDocumentReadFailureException, AuditException, TryPolicyException {
// Arrange
final String c32Xml = "c32Xml";
final String xacmlPolicy = "xacmlPolicy";
final String purposeOfUse = "TREATMENT";
final PdpRequestResponse pdpRequestResponse = mock(PdpRequestResponse.class);
final XacmlRequest xacmlRequest = mock(XacmlRequest.class);
final XacmlResponse xacmlResponse = mock(XacmlResponse.class);
when(xacmlRequest.getPurposeOfUse()).thenReturn(
SubjectPurposeOfUse.HEALTHCARE_TREATMENT.getPurpose());
when(xacmlResponse.getPdpObligation()).thenReturn(
new ArrayList<String>());
when(
contextHandler.makeDecisionForTryingPolicy(xacmlPolicy,
purposeOfUse)).thenReturn(pdpRequestResponse);
when(pdpRequestResponse.getXacmlRequest()).thenReturn(xacmlRequest);
when(pdpRequestResponse.getXacmlResponse()).thenReturn(xacmlResponse);
final String enforcementPolicies = "String enforcementPolicies";
// when(marshaller.marshall(isA(XacmlResult.class))).thenReturn(enforcementPolicies);
when(
marshaller
.marshal(argThat(new IsXacmlResultWithCorrectProperties(
xacmlRequest, xacmlResponse)))).thenReturn(
enforcementPolicies);
final SegmentDocumentResponse segmentDocumentResponse = mock(SegmentDocumentResponse.class);
final String segmentedC32 = "segmentedC32";
when(segmentDocumentResponse.getTryPolicyDocumentXml()).thenReturn(
segmentedC32);
final DSSResponse response = mock(DSSResponse.class);
when(response.getTryPolicyDocumentXml()).thenReturn(segmentedC32);
when(documentSegmentation.segmentDocument(isA(DSSRequest.class)))
.thenReturn(response);
// Act
final String result = sut.tryPolicy(c32Xml, xacmlPolicy, purposeOfUse);
// Assert
assertEquals("Not return expected result", segmentedC32, result);
verify(documentSegmentation, times(1)).segmentDocument(
argThat(matching((DSSRequest r) -> r.getDocumentXml().equals(
c32Xml)
&& r.getEnforcementPoliciesXml().equals(
enforcementPolicies)
&& r.isAudited() == false
&& r.isAuditFailureByPass() == true)));
}
private class IsXacmlResultWithCorrectProperties extends
ArgumentMatcher<XacmlResult> {
/** The xacml request. */
private final XacmlRequest xacmlRequest;
/** The xacml response. */
private final XacmlResponse xacmlResponse;
/**
* Instantiates a new checks if is xacml result with correct properties.
*
* @param xacmlRequest
* the xacml request
* @param xacmlResponse
* the xacml response
*/
public IsXacmlResultWithCorrectProperties(XacmlRequest xacmlRequest,
XacmlResponse xacmlResponse) {
this.xacmlRequest = xacmlRequest;
this.xacmlResponse = xacmlResponse;
}
/*
* (non-Javadoc)
*
* @see org.mockito.ArgumentMatcher#matches(java.lang.Object)
*/
@Override
public boolean matches(Object argument) {
final XacmlResult xacmlResult = (XacmlResult) argument;
if (xacmlResult.getHomeCommunityId() == xacmlRequest
.getHomeCommunityId()
&& xacmlResult.getSubjectPurposeOfUse().getPurpose() == xacmlRequest
.getPurposeOfUse()
&& xacmlResult.getPdpDecision() == xacmlResponse
.getPdpDecision()
&& xacmlResult.getPdpObligations() == xacmlResponse
.getPdpObligation()) {
return true;
}
return false;
}
}
}