/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.resolver;
import java.util.HashMap;
import org.apache.commons.lang.StringUtils;
import org.jdom.Element;
import org.junit.Before;
import org.junit.Test;
import com.enonic.cms.framework.util.JDOMUtil;
import com.enonic.cms.framework.xml.XMLDocument;
import com.enonic.cms.core.resolver.deviceclass.UserAgentTestEnums;
import static org.junit.Assert.*;
/**
* Created by rmy - Date: Apr 8, 2009
*/
public class ResolverHttpRequestXMLCreatorTest
extends ResolverHttpRequestInputXMLCreator
{
ResolverHttpRequestInputXMLCreator httpRequestInputXMLCreator;
ResolverHttpRequestInput resolverHttpRequestInput;
XMLDocument xmlDoc;
private final static int NUMBER_OF_COOKIES = 5;
private final static int NUMBER_OF_PARAMETERS = 10;
@Before
public void setUp()
{
resolverHttpRequestInput = new ResolverHttpRequestInput();
httpRequestInputXMLCreator = new ResolverHttpRequestInputXMLCreator();
}
@Test
public void testNull()
{
xmlDoc = httpRequestInputXMLCreator.buildResolverInputXML( null );
assertEquals( "request", getRootElementName() );
assertEquals( 1, getNumberOfElements( xmlDoc.getAsJDOMDocument().getRootElement() ) );
}
@Test
public void testFullResolverInput()
{
setupFullRequest();
xmlDoc = httpRequestInputXMLCreator.buildResolverInputXML( resolverHttpRequestInput );
Element rootElement = xmlDoc.getAsJDOMDocument().getRootElement();
assertEquals( 34, getNumberOfElements( rootElement ) );
assertEquals( 3, findElementsNumberOfChildren( rootElement, ResolverHttpRequestInputXMLCreator.ACCEPT_ROOT_ELEMENT_NAME ) );
assertEquals( NUMBER_OF_COOKIES,
findElementsNumberOfChildren( rootElement, ResolverHttpRequestInputXMLCreator.COOKIES_ROOT_ELEMENT_NAME ) );
assertEquals( NUMBER_OF_PARAMETERS,
findElementsNumberOfChildren( rootElement, ResolverHttpRequestInputXMLCreator.PARAMETERS_ROOT_ELEMENT_NAME ) );
}
@Test
public void testMissingCookies()
{
setupFullRequest();
resolverHttpRequestInput.setCookies( new HashMap<String, String>() );
xmlDoc = httpRequestInputXMLCreator.buildResolverInputXML( resolverHttpRequestInput );
Element rootElement = xmlDoc.getAsJDOMDocument().getRootElement();
assertEquals( 29, getNumberOfElements( rootElement ) );
assertEquals( 1, getNumberOfElements( findElement( rootElement, "cookies" ) ) );
}
@Test
public void testNoParameters()
{
setupFullRequest();
resolverHttpRequestInput.setParameters( new HashMap<String, String>() );
xmlDoc = httpRequestInputXMLCreator.buildResolverInputXML( resolverHttpRequestInput );
Element rootElement = xmlDoc.getAsJDOMDocument().getRootElement();
assertEquals( 24, getNumberOfElements( rootElement ) );
assertEquals( 0, findElementsNumberOfChildren( rootElement, ResolverHttpRequestInputXMLCreator.PARAMETERS_ROOT_ELEMENT_NAME ) );
}
@Test
public void testMissingIP()
{
setupFullRequest();
resolverHttpRequestInput.setIp( null );
xmlDoc = httpRequestInputXMLCreator.buildResolverInputXML( resolverHttpRequestInput );
Element rootElement = xmlDoc.getAsJDOMDocument().getRootElement();
assertTrue( "Ip should be empty",
StringUtils.isEmpty( findElement( rootElement, ResolverHttpRequestInputXMLCreator.IP_ELEMENT_NAME ).getValue() ) );
}
@Test
public void testNoAcceptLanguages()
{
addUserAgent();
addReferrer();
addIp();
addProtocol();
addServerAndPort();
xmlDoc = httpRequestInputXMLCreator.buildResolverInputXML( resolverHttpRequestInput );
Element rootElement = xmlDoc.getAsJDOMDocument().getRootElement();
assertEquals( 0, findElementsNumberOfChildren( rootElement, ResolverHttpRequestInputXMLCreator.ACCEPT_ROOT_ELEMENT_NAME ) );
}
@Test
public void testNoHeaders()
{
addIp();
addProtocol();
addServerAndPort();
xmlDoc = httpRequestInputXMLCreator.buildResolverInputXML( resolverHttpRequestInput );
Element rootElement = xmlDoc.getAsJDOMDocument().getRootElement();
assertEquals( 0, findElementsNumberOfChildren( rootElement, ResolverHttpRequestInputXMLCreator.HEADERS_ROOT_ELEMENT_NAME ) );
}
private int findElementsNumberOfChildren( Element rootElement, String elementName )
{
return getNumberOfElements( findElement( rootElement, elementName ) ) - 1;
}
private void setupFullRequest()
{
addHttpHeaders();
addUserAgent();
addReferrer();
addIp();
addProtocol();
addServerAndPort();
addUri();
addResourcePath();
addParameters( NUMBER_OF_PARAMETERS );
addAcceptLanguages();
addCookies( NUMBER_OF_COOKIES );
}
private void addHttpHeaders()
{
resolverHttpRequestInput.addHttpHeader( "header1", "value1" );
resolverHttpRequestInput.addHttpHeader( "header2", "value2" );
resolverHttpRequestInput.addHttpHeader( "header3", "value3" );
}
private void addUri()
{
resolverHttpRequestInput.setUri( "http://localhost:8080/test/site/1?param1=value1" );
}
private void addResourcePath()
{
resolverHttpRequestInput.setResourcePath( "/test/site/1" );
}
private void addCookies( int numberOfCookies )
{
for ( int i = 1; i <= numberOfCookies; i++ )
{
resolverHttpRequestInput.addCookie( "cookie" + i, "value" + i );
}
}
private void addProtocol()
{
resolverHttpRequestInput.setProtocol( "protocol" );
}
private void addIp()
{
resolverHttpRequestInput.setIp( "remoteAddress" );
}
private void addServerAndPort()
{
resolverHttpRequestInput.setVirtualHost( "serverName" );
resolverHttpRequestInput.setPort( 0 );
}
private void addReferrer()
{
resolverHttpRequestInput.setReferrer( "referrer" );
}
private void addUserAgent()
{
resolverHttpRequestInput.setUserAgent( UserAgentTestEnums.IPHONE.userAgent );
}
private void addParameters( int numberOfParameters )
{
for ( int i = 0; i < numberOfParameters; i++ )
{
resolverHttpRequestInput.addParameter( "param" + i, "value" + i );
}
}
private void addAcceptLanguages()
{
resolverHttpRequestInput.addAcceptLanguage( "us-en", null );
resolverHttpRequestInput.addAcceptLanguage( "no", "0.5" );
resolverHttpRequestInput.addAcceptLanguage( "gb-en", "0.8" );
}
private String getRootElementName()
{
return xmlDoc.getAsJDOMDocument().getRootElement().getName();
}
private int getNumberOfElements( Element element )
{
int numberOfElements = 1;
Element[] elements = JDOMUtil.getElements( element );
if ( elements != null )
{
for ( Element e : elements )
{
numberOfElements = numberOfElements + getNumberOfElements( e );
}
}
return numberOfElements;
}
private Element findElement( Element root, String elementName )
{
if ( root.getName().equals( elementName ) )
{
return root;
}
Element[] elements = JDOMUtil.getElements( root );
if ( elements != null )
{
for ( Element e : elements )
{
Element found = findElement( e, elementName );
if ( found != null )
{
return found;
}
}
}
return null;
}
}