/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.resolver.deviceclass; import java.util.Calendar; import java.util.Properties; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.enonic.cms.core.resolver.BaseResolverTest; import com.enonic.cms.core.resolver.ResolverContext; import com.enonic.cms.core.resolver.ScriptResolverResult; import com.enonic.cms.core.resolver.ScriptResolverService; import com.enonic.cms.core.resource.ResourceFile; import com.enonic.cms.core.resource.ResourceKey; import com.enonic.cms.core.structure.SiteEntity; import com.enonic.cms.core.structure.SiteKey; import com.enonic.cms.core.structure.SiteProperties; import com.enonic.cms.core.structure.SitePropertiesService; import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.isA; import static org.easymock.EasyMock.replay; import static org.junit.Assert.*; /** * Created by rmy - Date: Apr 2, 2009 */ public class DeviceClassResolverServiceImplTest extends BaseResolverTest { private DeviceClassResolverServiceImpl deviceClassResolverService; private ResourceFile resourceFileMock; private ScriptResolverService deviceClassResolverServiceMock; private SitePropertiesService sitePropertiesServiceMock; private static final String DEVICE_CLASS_SESSION_VALUE = "fromSession"; private static final SiteKey siteKey = new SiteKey( 0 ); private static final String RESOLVED_DEVICE_NAME = "resolvedDeviceName"; private static final String NASTY_COOKIE_VALUE = "\u00c6\u00d8\u00c5\u00e6\u00f8\u00e5"; private static final Calendar CALENDER_INSTANSE = Calendar.getInstance(); @Before public void setUp() { deviceClassResolverServiceMock = createMock( ScriptResolverService.class ); sitePropertiesServiceMock = createMock( SitePropertiesService.class ); deviceClassResolverService = new DeviceClassResolverServiceImpl(); deviceClassResolverService.setDeviceClassScriptResolver( deviceClassResolverServiceMock ); deviceClassResolverService.setSitePropertiesService( sitePropertiesServiceMock ); deviceClassResolverService.setResourceService( resourceServiceMock ); deviceClassResolverService.setForceResolverValueService( forcedResolverValueService ); deviceClassResolverService.setCacheResolverValueService( cacheResolverValueService ); } @Test public void testForcedDeviceClass() { setForcedDeviceClassScenario(); // Session variable there, but cookie should have precedence setUpCachedValue( DEVICE_CLASS_SESSION_VALUE ); ResolverContext context = new ResolverContext( request, createSite( true ) ); String deviceClass = deviceClassResolverService.getDeviceClass( context ); assertEquals( "Cookie-injected deviceClass should be used", NASTY_COOKIE_VALUE, deviceClass ); } @Test public void resolveDevice() { setNoForceNoCacheScenario(); setUpResolveDeviceScenario( true, true ); Properties props = new Properties( ); props.put( "cms.site.deviceClassification.cache", "true"); SiteProperties siteProperties = new SiteProperties( new SiteKey(0), props ); expect( sitePropertiesServiceMock.getSiteProperties( new SiteKey( 0 ) )).andReturn( siteProperties ).times( 1 ); replay( sitePropertiesServiceMock ); ResolverContext context = new ResolverContext( request, createSite( true ) ); String deviceClass = deviceClassResolverService.getDeviceClass( context ); assertEquals( RESOLVED_DEVICE_NAME, deviceClass ); } @Test public void testNotForcedNotCachedNoScript() { setNoForceNoCacheScenario(); setUpResolveDeviceScenario( false, false ); SiteEntity site = createSite( false ); ResolverContext context = new ResolverContext( request, site ); String deviceClass = deviceClassResolverService.getDeviceClass( context ); assertEquals( null, deviceClass ); } @Test public void testDefaultDeviceClass() { Properties props = new Properties( ); props.put( "cms.site.deviceClassification.cache", "true"); SiteProperties siteProperties = new SiteProperties( new SiteKey(0), props ); setUpGetResourceFileMock( true, true ); expect( deviceClassResolverServiceMock.resolveValue( isA( ResolverContext.class ), isA( ResourceFile.class ) ) ).andReturn( createScriptResolverReturnValue( "" ) ).times( 1 ); replay( deviceClassResolverServiceMock ); expect( sitePropertiesServiceMock.getSiteProperties( new SiteKey( 0 ) )).andReturn( siteProperties ).times( 1 ); replay( sitePropertiesServiceMock ); SiteEntity site = createSite( true ); ResolverContext context = new ResolverContext( request, site ); String deviceClass = deviceClassResolverService.getDeviceClass( context ); assertEquals( DeviceClassResolverServiceImpl.DEFAULT_DEVICE_CLASS, deviceClass ); } @After public void verifyDeviceClassResolverServiceMock() { //verify(deviceClassResolverServiceMock); // verify(resourceServiceMock); } private SiteEntity createSite( boolean hasDeviceClassResolverScript ) { SiteEntity site = new SiteEntity(); site.setKey( siteKey.toInt() ); site.setName( "name" ); if ( hasDeviceClassResolverScript ) { site.setDeviceClassResolver( ResourceKey.from( "deviceClassResolverScript" ) ); } return site; } private void setNoForceNoCacheScenario() { setUpForcedResolverValue( null ); setUpCachedValue( null ); } private void setForcedDeviceClassScenario() { setUpForcedResolverValue( NASTY_COOKIE_VALUE ); setUpResolveDeviceClassMock( true, false ); replay( deviceClassResolverServiceMock ); replay( resourceServiceMock ); } private void setUpResolveDeviceScenario( boolean hasResolverScript, boolean timeStampChanged ) { setUpGetResourceFileMock( hasResolverScript, timeStampChanged ); setUpResolveDeviceClassMock( hasResolverScript, timeStampChanged ); replay( deviceClassResolverServiceMock ); replay( resourceServiceMock ); } private void setUpResolveDeviceClassMock( boolean hasResolverScript, boolean timeStampChanged ) { if ( timeStampChanged && hasResolverScript ) { expect( deviceClassResolverServiceMock.resolveValue( isA( ResolverContext.class ), isA( ResourceFile.class ) ) ).andReturn( createScriptResolverReturnValue( RESOLVED_DEVICE_NAME ) ).times( 1 ); } } private ScriptResolverResult createScriptResolverReturnValue( String deviceClass ) { ScriptResolverResult result = new ScriptResolverResult(); result.getResolverReturnValues().put( DeviceClassXsltScriptResolver.DEVICE_CLASS_RETURN_VALUE_KEY, deviceClass ); return result; } private void setUpGetResourceFileMock( boolean hasResolverScript, boolean timeStampChanged ) { resourceFileMock = hasResolverScript ? createMock( ResourceFile.class ) : null; if ( hasResolverScript ) { expect( resourceServiceMock.getResourceFile( isA( ResourceKey.class ) ) ).andReturn( resourceFileMock ).times( 1 ); expect( resourceFileMock.getLastModified() ).andReturn( timeStampChanged ? Calendar.getInstance() : CALENDER_INSTANSE ).anyTimes(); replay( resourceFileMock ); } } }