package org.deegree.securityproxy.service.commons.responsefilter.capabilities;
import static java.util.Arrays.asList;
import static org.deegree.securityproxy.service.commons.responsefilter.capabilities.XmlTestUtils.asXml;
import static org.deegree.securityproxy.service.commons.responsefilter.capabilities.XmlTestUtils.expectedXml;
import static org.deegree.securityproxy.service.commons.responsefilter.capabilities.XmlTestUtils.mockResponse;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.xmlmatchers.XmlMatchers.hasXPath;
import static org.xmlmatchers.XmlMatchers.isEquivalentTo;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.StartElement;
import org.deegree.securityproxy.filter.StatusCodeResponseBodyWrapper;
import org.deegree.securityproxy.service.commons.responsefilter.capabilities.element.ElementDecisionMaker;
import org.deegree.securityproxy.service.commons.responsefilter.capabilities.element.ElementPathStep;
import org.deegree.securityproxy.service.commons.responsefilter.capabilities.element.ElementRule;
import org.deegree.securityproxy.service.commons.responsefilter.capabilities.text.AttributeModifier;
import org.junit.Test;
import org.springframework.util.xml.SimpleNamespaceContext;
/**
* @author <a href="mailto:goltz@lat-lon.de">Lyn Goltz</a>
* @author last edited by: $Author: lyn $
*
* @version $Revision: $, $Date: $
*/
public class XmlFilterTest {
private static final String EXTENDED_NS_URI = "http://extended.de";
private final XmlFilter capabilitiesFilter = new XmlFilter();
@Test
public void testFilterXmlWithoutFilter()
throws Exception {
ByteArrayOutputStream filteredCapabilities = new ByteArrayOutputStream();
StatusCodeResponseBodyWrapper response = mockResponse( "simpleResponse.xml", filteredCapabilities );
capabilitiesFilter.filterXml( response, null );
assertThat( asXml( filteredCapabilities ), isEquivalentTo( expectedXml( "simpleResponse.xml" ) ) );
}
@Test
public void testFilterXmlSimpleFiltered()
throws Exception {
ByteArrayOutputStream filteredCapabilities = new ByteArrayOutputStream();
StatusCodeResponseBodyWrapper response = mockResponse( "simpleResponse.xml", filteredCapabilities );
capabilitiesFilter.filterXml( response, createDecisionMaker( "f" ) );
assertThat( asXml( filteredCapabilities ), isEquivalentTo( expectedXml( "simpleFiltered.xml" ) ) );
}
@Test
public void testFilterXmlSimpleFilteredWithNamespace()
throws Exception {
ByteArrayOutputStream filteredCapabilities = new ByteArrayOutputStream();
StatusCodeResponseBodyWrapper response = mockResponse( "simpleResponse.xml", filteredCapabilities );
capabilitiesFilter.filterXml( response, createDecisionMaker( "e", "http://simple.de" ) );
assertThat( asXml( filteredCapabilities ), isEquivalentTo( expectedXml( "simpleFilteredByNamespace.xml" ) ) );
}
@Test
public void testFilterXmlSimpleFilteredWithNamespaceAndText()
throws Exception {
ByteArrayOutputStream filteredCapabilities = new ByteArrayOutputStream();
StatusCodeResponseBodyWrapper response = mockResponse( "simpleResponse.xml", filteredCapabilities );
capabilitiesFilter.filterXml( response, createDecisionMaker( "d", "http://simple1.de", "dtext" ) );
assertThat( asXml( filteredCapabilities ),
isEquivalentTo( expectedXml( "simpleFilteredByNamespaceAndText.xml" ) ) );
}
@Test
public void testFilterXmlSimpleFilteredWithNamespaceAndTextAndttribute()
throws Exception {
ByteArrayOutputStream filteredCapabilities = new ByteArrayOutputStream();
StatusCodeResponseBodyWrapper response = mockResponse( "simpleResponse.xml", filteredCapabilities );
capabilitiesFilter.filterXml( response, createDecisionMaker( "d", "http://simple1.de", "2nddtext" ) );
assertThat( asXml( filteredCapabilities ),
isEquivalentTo( expectedXml( "simpleFilteredByNamespaceAndTextWithAttribute.xml" ) ) );
}
@Test
public void testFilterXmlExtendedFiltered()
throws Exception {
ByteArrayOutputStream filteredCapabilities = new ByteArrayOutputStream();
StatusCodeResponseBodyWrapper response = mockResponse( "extendedResponse.xml", filteredCapabilities );
ElementRule subRule = new ElementRule( "i", EXTENDED_NS_URI, "idH" );
capabilitiesFilter.filterXml( response, createDecisionMaker( "f", EXTENDED_NS_URI, subRule ) );
assertThat( asXml( filteredCapabilities ), isEquivalentTo( expectedXml( "extendedResponse.xml" ) ) );
}
@Test
public void testFilterXmlExtendedFilteredFromSubelement()
throws Exception {
ByteArrayOutputStream filteredCapabilities = new ByteArrayOutputStream();
StatusCodeResponseBodyWrapper response = mockResponse( "extendedResponse.xml", filteredCapabilities );
ElementRule subRule = new ElementRule( "g", EXTENDED_NS_URI, "idG" );
capabilitiesFilter.filterXml( response, createDecisionMaker( "f", EXTENDED_NS_URI, subRule ) );
assertThat( asXml( filteredCapabilities ), isEquivalentTo( expectedXml( "extendedFilteredBySubelement.xml" ) ) );
}
@Test
public void testFilterXmlExtendedFilteredByNestedSubelement()
throws Exception {
ByteArrayOutputStream filteredCapabilities = new ByteArrayOutputStream();
StatusCodeResponseBodyWrapper response = mockResponse( "extendedResponse.xml", filteredCapabilities );
ElementRule subRule = new ElementRule( "l", EXTENDED_NS_URI, "idL" );
capabilitiesFilter.filterXml( response, createDecisionMaker( "f", EXTENDED_NS_URI, subRule ) );
assertThat( asXml( filteredCapabilities ),
isEquivalentTo( expectedXml( "extendedFilteredByNestedSubelement.xml" ) ) );
}
@Test
public void testFilterXmlExtendedFilteredByPath()
throws Exception {
ByteArrayOutputStream filteredCapabilities = new ByteArrayOutputStream();
StatusCodeResponseBodyWrapper response = mockResponse( "extendedResponse.xml", filteredCapabilities );
List<ElementPathStep> path = createPath();
capabilitiesFilter.filterXml( response, createDecisionMaker( "k", EXTENDED_NS_URI, "idK2", path ) );
assertThat( asXml( filteredCapabilities ), isEquivalentTo( expectedXml( "extendedResponseByPath.xml" ) ) );
}
@Test
public void testFilterXmlExtendedFilteredByPathWithAttribute()
throws Exception {
ByteArrayOutputStream filteredCapabilities = new ByteArrayOutputStream();
StatusCodeResponseBodyWrapper response = mockResponse( "extendedResponse.xml", filteredCapabilities );
List<ElementPathStep> path = createPathWithAttribute();
capabilitiesFilter.filterXml( response, createDecisionMaker( "k", EXTENDED_NS_URI, "idK1", path ) );
assertThat( asXml( filteredCapabilities ),
isEquivalentTo( expectedXml( "extendedResponseByPathWithAttributes.xml" ) ) );
}
@Test
public void testFilterXmlExtendedFilteredByTwoRules()
throws Exception {
ByteArrayOutputStream filteredCapabilities = new ByteArrayOutputStream();
StatusCodeResponseBodyWrapper response = mockResponse( "extendedResponse.xml", filteredCapabilities );
ElementRule elementRule1 = new ElementRule( "d", EXTENDED_NS_URI, "dtext" );
ElementRule elementRule2 = new ElementRule( "k", EXTENDED_NS_URI, "idK2" );
XmlModificationManager decisionMaker = createDecisionMaker( elementRule1, elementRule2 );
capabilitiesFilter.filterXml( response, decisionMaker );
assertThat( asXml( filteredCapabilities ), isEquivalentTo( expectedXml( "extendedResponseByTwoRules.xml" ) ) );
}
@Test
public void testFilterXmlWithModificationNeededShouldModifyAttribute()
throws Exception {
ByteArrayOutputStream filteredCapabilities = new ByteArrayOutputStream();
StatusCodeResponseBodyWrapper response = mockResponse( "simpleResponse.xml", filteredCapabilities );
String newAttributeValue = "newAttValue";
XmlModificationManager xmlModifier = mockXmlModifier( newAttributeValue );
capabilitiesFilter.filterXml( response, xmlModifier );
SimpleNamespaceContext nsContext = new SimpleNamespaceContext();
nsContext.bindNamespaceUri( "sp1", "http://simple1.de" );
assertThat( asXml( filteredCapabilities ), hasXPath( "/A/B/sp1:d/@datt", is( newAttributeValue ), nsContext ) );
}
@Test
public void testFilterXmlWithModificationNotNeededShouldNotModifyAttribute()
throws Exception {
ByteArrayOutputStream filteredCapabilities = new ByteArrayOutputStream();
StatusCodeResponseBodyWrapper response = mockResponse( "simpleResponse.xml", filteredCapabilities );
XmlModificationManager xmlModifier = mockXmlModifier( null );
capabilitiesFilter.filterXml( response, xmlModifier );
SimpleNamespaceContext nsContext = new SimpleNamespaceContext();
nsContext.bindNamespaceUri( "sp1", "http://simple1.de" );
assertThat( asXml( filteredCapabilities ), hasXPath( "/A/B/sp1:d/@datt", is( "d_att_ext" ), nsContext ) );
}
private List<ElementPathStep> createPath() {
List<ElementPathStep> path = new ArrayList<ElementPathStep>();
path.add( new ElementPathStep( new QName( EXTENDED_NS_URI, "A" ) ) );
path.add( new ElementPathStep( new QName( EXTENDED_NS_URI, "B" ) ) );
path.add( new ElementPathStep( new QName( EXTENDED_NS_URI, "e" ) ) );
path.add( new ElementPathStep( new QName( EXTENDED_NS_URI, "f" ) ) );
path.add( new ElementPathStep( new QName( EXTENDED_NS_URI, "f" ) ) );
path.add( new ElementPathStep( new QName( EXTENDED_NS_URI, "j" ) ) );
return path;
}
private List<ElementPathStep> createPathWithAttribute() {
List<ElementPathStep> path = new ArrayList<ElementPathStep>();
path.add( new ElementPathStep( new QName( EXTENDED_NS_URI, "A" ) ) );
path.add( new ElementPathStep( new QName( EXTENDED_NS_URI, "B" ) ) );
path.add( new ElementPathStep( new QName( EXTENDED_NS_URI, "e" ) ) );
path.add( new ElementPathStep( new QName( EXTENDED_NS_URI, "f" ) ) );
path.add( new ElementPathStep( new QName( EXTENDED_NS_URI, "f" ), new QName( "att" ), "zwei" ) );
path.add( new ElementPathStep( new QName( EXTENDED_NS_URI, "j" ) ) );
return path;
}
@SuppressWarnings("unchecked")
private XmlModificationManager mockXmlModifier( String newAttributeValue )
throws XMLStreamException {
AttributeModifier attributeModifier = mock( AttributeModifier.class );
when(
attributeModifier.determineNewAttributeValue( any( BufferingXMLEventReader.class ),
any( StartElement.class ), any( Attribute.class ),
any( ( LinkedList.class ) ) ) ).thenReturn( newAttributeValue );
return new XmlModificationManager( attributeModifier );
}
private XmlModificationManager createDecisionMaker( String nameToFilter ) {
return createDecisionMaker( nameToFilter, null );
}
private XmlModificationManager createDecisionMaker( String nameToFilter, String namespace ) {
return createDecisionMaker( nameToFilter, namespace, (String) null );
}
private XmlModificationManager createDecisionMaker( String nameToFilter, String namespace, String text ) {
ElementRule rule = new ElementRule( nameToFilter, namespace, text );
ElementDecisionMaker decisionMaker = new ElementDecisionMaker( rule );
return new XmlModificationManager( decisionMaker );
}
private XmlModificationManager createDecisionMaker( String nameToFilter, String namespace, ElementRule subRule ) {
ElementRule rule = new ElementRule( nameToFilter, namespace, subRule );
ElementDecisionMaker decisionMaker = new ElementDecisionMaker( rule );
return new XmlModificationManager( decisionMaker );
}
private XmlModificationManager createDecisionMaker( String nameToFilter, String namespace, String text,
List<ElementPathStep> path ) {
ElementRule rule = new ElementRule( nameToFilter, namespace, text, path );
ElementDecisionMaker decisionMaker = new ElementDecisionMaker( rule );
return new XmlModificationManager( decisionMaker );
}
private XmlModificationManager createDecisionMaker( ElementRule... elementRules ) {
List<ElementRule> rules = asList( elementRules );
ElementDecisionMaker decisionMaker = new ElementDecisionMaker( rules );
return new XmlModificationManager( decisionMaker );
}
}