package org.deegree.securityproxy.wfs;
import org.deegree.securityproxy.authorization.logging.AuthorizationReport;
import org.deegree.securityproxy.exception.ServiceExceptionWrapper;
import org.deegree.securityproxy.filter.StatusCodeResponseBodyWrapper;
import org.deegree.securityproxy.request.OwsRequest;
import org.deegree.securityproxy.request.parser.OwsRequestParser;
import org.deegree.securityproxy.responsefilter.ResponseFilterException;
import org.deegree.securityproxy.responsefilter.ResponseFilterManager;
import org.deegree.securityproxy.responsefilter.logging.ResponseFilterReport;
import org.junit.Before;
import org.junit.Test;
import org.springframework.security.core.Authentication;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static java.util.Arrays.asList;
import static java.util.Collections.emptyList;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
/**
* Tests for {@link WfsServiceManager}.
*
* @author <a href="stenger@lat-lon.de">Dirk Stenger</a>
* @author last edited by: $Author: stenger $
* @version $Revision: $, $Date: $
*/
public class WfsServiceManagerTest {
private final OwsRequestParser parser = mockOwsRequestParser();
private final ServiceExceptionWrapper serviceExceptionWrapper = mockServiceExceptionWrapper();
private final ResponseFilterReport response = mockResponseFilterReport();
private final Map<String, String[]> additionalKeyValuePairs = createAdditionalKeyValuePairs();
private WfsServiceManager wfsServiceManager;
@Before
public void resetMocks() {
reset( serviceExceptionWrapper );
List<ResponseFilterManager> filterManagers = emptyList();
wfsServiceManager = new WfsServiceManager( parser, filterManagers, serviceExceptionWrapper,
additionalKeyValuePairs );
}
@Test
public void testParse()
throws Exception {
HttpServletRequest request = mockHttpServletRequest();
wfsServiceManager.parse( request );
verify( parser ).parse( request );
}
@Test
public void testAuthorize()
throws Exception {
Authentication authentication = mockAuthentication();
OwsRequest owsRequest = mockOwsRequest();
AuthorizationReport report = wfsServiceManager.authorize( authentication, owsRequest );
assertThat( report.isAuthorized(), is( true ) );
assertThat( report.getAdditionalKeyValuePairs(), is( additionalKeyValuePairs ) );
}
@Test
public void testIsResponseFilterEnabledWithoutFilterManagers()
throws Exception {
OwsRequest owsRequest = mockOwsRequest();
boolean isEnabled = wfsServiceManager.isResponseFilterEnabled( owsRequest );
assertThat( isEnabled, is( false ) );
}
@Test
public void testFilterResponseWithoutFilterManagers()
throws Exception {
StatusCodeResponseBodyWrapper wrappedResponse = mockStatusCodeResponseBodyWrapper();
Authentication authentication = mockAuthentication();
OwsRequest owsRequest = mockOwsRequest();
ResponseFilterReport responseFilterReport = wfsServiceManager.filterResponse( wrappedResponse, authentication,
owsRequest );
assertThat( responseFilterReport, notNullValue() );
}
@Test
public void testIsResponseFilterEnabledWithFilterManager()
throws Exception {
OwsRequest owsRequest = mockOwsRequest();
boolean isEnabled = createWfsServiceMangerWithFilterManagers().isResponseFilterEnabled( owsRequest );
assertThat( isEnabled, is( true ) );
}
@Test
public void testFilterResponseWithFilterManager()
throws Exception {
StatusCodeResponseBodyWrapper wrappedResponse = mockStatusCodeResponseBodyWrapper();
Authentication authentication = mockAuthentication();
OwsRequest owsRequest = mockOwsRequest();
ResponseFilterReport responseFilterReport = createWfsServiceMangerWithFilterManagers().filterResponse( wrappedResponse,
authentication,
owsRequest );
assertThat( responseFilterReport, is( response ) );
}
@Test
public void testRetrieveServiceExceptionWrapper()
throws Exception {
ServiceExceptionWrapper retrievedServiceExceptionWrapper = wfsServiceManager.retrieveServiceExceptionWrapper();
assertThat( retrievedServiceExceptionWrapper, is( serviceExceptionWrapper ) );
}
@Test
public void testIsServiceTypeSupportedWithWfsServiceParameterShouldReturnTrue()
throws Exception {
HttpServletRequest request = mockHttpServletRequestWithWfsServiceParameter();
boolean isSupported = wfsServiceManager.isServiceTypeSupported( null, request );
assertThat( isSupported, is( true ) );
}
@Test
public void testIsServiceTypeSupportedWithWcsServiceParameterShouldReturnFalse()
throws Exception {
HttpServletRequest request = mockHttpServletRequestWithWcsServiceParameter();
boolean isSupported = wfsServiceManager.isServiceTypeSupported( null, request );
assertThat( isSupported, is( false ) );
}
@Test
public void testIsServiceTypeSupportedWithNoServiceParameterShouldReturnFalse()
throws Exception {
HttpServletRequest request = mockHttpServletRequest();
boolean isSupported = wfsServiceManager.isServiceTypeSupported( null, request );
assertThat( isSupported, is( false ) );
}
@Test
public void testIsServiceTypeSupportedWithStringServiceParameterShouldReturnTrue()
throws Exception {
HttpServletRequest request = mockHttpServletRequest();
boolean isSupported = wfsServiceManager.isServiceTypeSupported( "wfs", request );
assertThat( isSupported, is( true ) );
}
@Test
public void testIsServiceTypeSupportedWithStringServiceParameterShouldReturnFalse()
throws Exception {
HttpServletRequest request = mockHttpServletRequestWithWfsServiceParameter();
boolean isSupported = wfsServiceManager.isServiceTypeSupported( "wms", request );
assertThat( isSupported, is( false ) );
}
private OwsRequestParser mockOwsRequestParser() {
return mock( OwsRequestParser.class );
}
private HttpServletRequest mockHttpServletRequest() {
return mock( HttpServletRequest.class );
}
private OwsRequest mockOwsRequest() {
return mock( OwsRequest.class );
}
private Authentication mockAuthentication() {
return mock( Authentication.class );
}
private StatusCodeResponseBodyWrapper mockStatusCodeResponseBodyWrapper() {
return mock( StatusCodeResponseBodyWrapper.class );
}
private HttpServletRequest mockHttpServletRequestWithWcsServiceParameter() {
return mockHttpServletRequestWithServiceParameter( "wcs" );
}
private HttpServletRequest mockHttpServletRequestWithWfsServiceParameter() {
return mockHttpServletRequestWithServiceParameter( "wfs" );
}
private HttpServletRequest mockHttpServletRequestWithServiceParameter( String serviceValue ) {
HttpServletRequest request = mock( HttpServletRequest.class );
Map<String, String[]> kvpMap = createKvpMapWithServiceParameter( serviceValue );
doReturn( kvpMap ).when( request ).getParameterMap();
doReturn( "GET" ).when( request ).getMethod();
return request;
}
private Map<String, String[]> createKvpMapWithServiceParameter( String serviceValue ) {
Map<String, String[]> kvpMap = new HashMap<String, String[]>();
String[] serviceTypes = { serviceValue };
kvpMap.put( "service", serviceTypes );
return kvpMap;
}
private WfsServiceManager createWfsServiceMangerWithFilterManagers()
throws IllegalArgumentException, ResponseFilterException {
List<ResponseFilterManager> filterManagers = asList( mockEnabledResponseFilterManager(),
mockDisabledResponseFilterManager() );
return new WfsServiceManager( parser, filterManagers, serviceExceptionWrapper, additionalKeyValuePairs );
}
private ResponseFilterManager mockEnabledResponseFilterManager()
throws IllegalArgumentException, ResponseFilterException {
ResponseFilterManager responseFilterManager = mock( ResponseFilterManager.class );
doReturn( true ).when( responseFilterManager ).canBeFiltered( any( OwsRequest.class ) );
doReturn( response ).when( responseFilterManager ).filterResponse( any( StatusCodeResponseBodyWrapper.class ),
any( OwsRequest.class ),
any( Authentication.class ) );
return responseFilterManager;
}
private ResponseFilterManager mockDisabledResponseFilterManager() {
ResponseFilterManager responseFilterManager = mock( ResponseFilterManager.class );
doReturn( false ).when( responseFilterManager ).canBeFiltered( any( OwsRequest.class ) );
return responseFilterManager;
}
private Map<String, String[]> createAdditionalKeyValuePairs() {
Map<String, String[]> additionalKeyValuePairs = new HashMap<String, String[]>();
additionalKeyValuePairs.put( "key1", new String[] { "value1" } );
return additionalKeyValuePairs;
}
private ServiceExceptionWrapper mockServiceExceptionWrapper() {
return mock( ServiceExceptionWrapper.class );
}
private ResponseFilterReport mockResponseFilterReport() {
return mock( ResponseFilterReport.class );
}
}