/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.resolver.deviceclass; import org.junit.Before; import org.junit.Test; import org.springframework.mock.web.MockHttpServletRequest; import com.enonic.cms.framework.xml.XMLDocument; import com.enonic.cms.framework.xml.XMLDocumentImpl; import com.enonic.cms.core.resolver.ResolverContext; import com.enonic.cms.core.resolver.ScriptResolverResult; import com.enonic.cms.core.resolver.deviceclass.mock.DeviceClassResolverXMLCreatorMock; import com.enonic.cms.core.resource.ResourceFile; import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; import static org.junit.Assert.*; /** * Created by rmy - Date: Apr 14, 2009 */ public class DeviceClassXsltScriptResolverTest { private MockHttpServletRequest request; private DeviceClassXsltScriptResolver deviceClassXsltScriptResolver; private ResourceFile resourceFile; private DeviceClassResolverXMLCreatorMock deviceClassResolverXMLCreator; @Before public void setUp() { resourceFile = createMock( ResourceFile.class ); request = new MockHttpServletRequest(); request.setRequestURI( "/site/0/Frontpage" ); deviceClassXsltScriptResolver = new DeviceClassXsltScriptResolver(); } // @Test public void testScriptResolvedDeviceClassIphone() throws Exception { setupResourceAndXsltManager(); deviceClassResolverXMLCreator = new DeviceClassResolverXMLCreatorMock( UserAgentTestEnums.IPHONE ); deviceClassXsltScriptResolver.setResolverInputXMLCreator( deviceClassResolverXMLCreator ); ResolverContext context = new ResolverContext( request, null ); ScriptResolverResult result = deviceClassXsltScriptResolver.resolveValue( context, resourceFile ); String deviceClass = (String) result.getResolverReturnValues().get( DeviceClassXsltScriptResolver.DEVICE_CLASS_RETURN_VALUE_KEY ); assertEquals( "DeviceClass should be resolved from script", "iphone", deviceClass ); } // @Test public void testScriptResolvedDeviceClassAndroid() throws Exception { setupResourceAndXsltManager(); deviceClassResolverXMLCreator = new DeviceClassResolverXMLCreatorMock( UserAgentTestEnums.ANDROID ); deviceClassXsltScriptResolver.setResolverInputXMLCreator( deviceClassResolverXMLCreator ); ResolverContext context = new ResolverContext( request, null ); ScriptResolverResult result = deviceClassXsltScriptResolver.resolveValue( context, resourceFile ); String deviceClass = (String) result.getResolverReturnValues().get( DeviceClassXsltScriptResolver.DEVICE_CLASS_RETURN_VALUE_KEY ); assertEquals( "DeviceClass should be resolved from script", "android", deviceClass ); } // @Test public void testScriptResolvedDeviceClassScreen() throws Exception { setupResourceAndXsltManager(); deviceClassResolverXMLCreator = new DeviceClassResolverXMLCreatorMock( UserAgentTestEnums.FIREFOX3 ); deviceClassXsltScriptResolver.setResolverInputXMLCreator( deviceClassResolverXMLCreator ); ResolverContext context = new ResolverContext( request, null ); ScriptResolverResult result = deviceClassXsltScriptResolver.resolveValue( context, resourceFile ); String deviceClass = (String) result.getResolverReturnValues().get( DeviceClassXsltScriptResolver.DEVICE_CLASS_RETURN_VALUE_KEY ); assertEquals( "DeviceClass should be resolved from script", "screen", deviceClass ); } private void setupResourceAndXsltManager() throws Exception { expect( resourceFile.getDataAsXml() ).andReturn( createXMLDocument() ).anyTimes(); replay( resourceFile ); // SaxonProcessorManager xsltProcessorManager = new SaxonProcessorManager(); // XsltProcessorManagerAccessor.setProcessorManager( xsltProcessorManager ); } private XMLDocument createXMLDocument() { XMLDocument xmlDoc = new XMLDocumentImpl( createDeviceClassResolverXslt() ); return xmlDoc; } private String createDeviceClassResolverXslt() { StringBuffer buffer = new StringBuffer(); buffer.append( "<?xml version=\"1.0\" encoding=\"utf-8\"?>" ); buffer.append( "<xsl:stylesheet exclude-result-prefixes=\"xs portal\" version=\"2.0\" xmlns=\"http://www.w3.org/1999/xhtml\"" ); buffer.append( " xmlns:portal=\"http://www.enonic.com/cms/xslt/portal\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"" ); buffer.append( " xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">" ); buffer.append( "<xsl:output indent=\"no\" media-type=\"text\" method=\"text\" omit-xml-declaration=\"yes\"/>" ); buffer.append( "<xsl:template match=\"/\">" ); buffer.append( "<xsl:variable name=\"userAgent\" select=\"lower-case(/context/request/user-agent)\"/>" + "<xsl:choose>" ); buffer.append( "<xsl:when test='matches($userAgent, \"iphone\")'>" + "iphone" + " </xsl:when>" ); buffer.append( "<xsl:when test='matches($userAgent, \"android\")'>" + "android" + " </xsl:when>" ); buffer.append( "<xsl:when test='matches($userAgent, \"opera mini\")'>" + "operamini" + " </xsl:when>" ); buffer.append( "<xsl:when test='matches($userAgent, \"blackberry\")'>" + "blackberry" + " </xsl:when>" ); buffer.append( "<xsl:when test='matches($userAgent, \"palm os|palm|hiptop|avantgo|plucker|xiino|blazer|elaine\")'> palm" + " </xsl:when>" ); buffer.append( "<xsl:when test='matches($userAgent, \"windows ce; ppc;|windows ce; smartphone;|windows ce; iemobile\")'>" ); buffer.append( " windowsmobile" + " </xsl:when>" ); buffer.append( "<xsl:when test='matches($userAgent, \"up.browser|up.link|mmp|symbian|smartphone|midp|wap|vodafone|o2|pocket|kindle|mobile|pda|psp|treo\")'>" ); buffer.append( " generichandheld" + "</xsl:when>" + "<xsl:otherwise>" + "screen" ); buffer.append( "</xsl:otherwise>" + "</xsl:choose>" + "</xsl:template>" + "</xsl:stylesheet>" + "" ); return buffer.toString(); } }