/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.itest.portal.datasource.expressionfunctions; import java.util.Properties; import javax.servlet.http.Cookie; import org.joda.time.DateTime; import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mock.web.MockHttpServletRequest; import com.enonic.cms.core.RequestParameters; import com.enonic.cms.core.portal.VerticalSession; import com.enonic.cms.core.portal.datasource.el.ExpressionContext; import com.enonic.cms.core.portal.datasource.el.ExpressionFunctionsExecutor; import com.enonic.cms.core.portal.datasource.el.ExpressionFunctionsFactory; import com.enonic.cms.core.security.user.UserEntity; import com.enonic.cms.core.structure.SiteEntity; import com.enonic.cms.core.structure.SiteProperties; import com.enonic.cms.core.time.MockTimeService; import com.enonic.cms.itest.AbstractSpringTest; import com.enonic.cms.itest.util.DomainFixture; import static org.junit.Assert.*; public class ExpressionFunctionsExecutorTest extends AbstractSpringTest { @Autowired private DomainFixture fixture; private MockTimeService timeService; private UserEntity defaultUser; private ExpressionContext expressionContext; private ExpressionFunctionsFactory efFactory; private ExpressionFunctionsExecutor efExecutor; @Before public void before() { fixture.initSystemData(); defaultUser = fixture.createAndStoreNormalUserWithUserGroup( "testuser", "testuser", "testuserstore" ); defaultUser.setEmail( "email@email.com" ); timeService = new MockTimeService(); expressionContext = new ExpressionContext(); expressionContext.setUser( defaultUser ); SiteEntity site = new SiteEntity(); site.setKey( 0 ); expressionContext.setSite( site ); efFactory = new ExpressionFunctionsFactory(); efFactory.setTimeService( timeService ); efFactory.setContext( expressionContext ); efExecutor = new ExpressionFunctionsExecutor(); efExecutor.setExpressionContext( expressionContext ); final Properties siteProperties = new Properties(); siteProperties.setProperty( "cms.test", "overridden" ); siteProperties.setProperty( "cms.site.test", "site" ); efExecutor.setSiteProperties( new SiteProperties( site.getKey(), siteProperties ) ); final Properties rootProperties = new Properties(); rootProperties.setProperty( "cms.test", "root" ); siteProperties.setProperty( "cms.root.test", "root" ); efExecutor.setRootProperties( rootProperties ); } @Test public void testUserGetEmailReturnsLoggedInUserEmail() throws Exception { String evaluated = efExecutor.evaluate( "${user.email}" ); assertEquals( "email@email.com", evaluated ); } @Test public void testSingleValue() throws Exception { MockHttpServletRequest request = new MockHttpServletRequest(); request.addParameter( "brands", "bmw" ); efExecutor.setHttpRequest( request ); efExecutor.setRequestParameters( new RequestParameters( request.getParameterMap() ) ); assertEquals( "bmw", efExecutor.evaluate( "${param.brands}" ) ); assertEquals( "bmw", efExecutor.evaluate( "${param['brands']}" ) ); assertEquals( "true", efExecutor.evaluate( "${param.brands == 'bmw'}" ) ); } @Test public void testCookieValue() throws Exception { MockHttpServletRequest request = new MockHttpServletRequest(); request.setCookies( new Cookie( "param1", "value1" ), new Cookie( "param2", "value2" ), new Cookie( "param3", "value3" ) ); efExecutor.setHttpRequest( request ); assertEquals( "value1", efExecutor.evaluate( "${cookie.param1}" ) ); assertEquals( "value2", efExecutor.evaluate( "${cookie.param2}" ) ); assertEquals( "value3", efExecutor.evaluate( "${cookie.param3}" ) ); assertEquals( null, efExecutor.evaluate( "${cookie.param4}" ) ); } @Test public void testSessionValue() throws Exception { final VerticalSession verticalSession = new VerticalSession(); verticalSession.setAttribute( "param1", "value1" ); verticalSession.setAttribute( "param2", "value2" ); verticalSession.setAttribute( "param3", "value3" ); efExecutor.setVerticalSession( verticalSession ); assertEquals( "value1", efExecutor.evaluate( "${session.param1}" ) ); assertEquals( "value2", efExecutor.evaluate( "${session.param2}" ) ); assertEquals( "value3", efExecutor.evaluate( "${session.param3}" ) ); assertEquals( null, efExecutor.evaluate( "${session.param4}" ) ); } @Test public void testMultipleValue() throws Exception { MockHttpServletRequest request = new MockHttpServletRequest(); request.addParameter( "brands", "bmw" ); request.addParameter( "cars", "skoda" ); request.addParameter( "cars", "lexus" ); request.addParameter( "cars", "volvo" ); request.addParameter( "third", new String[]{"audi", "kia", "opel"} ); efExecutor.setHttpRequest( request ); efExecutor.setRequestParameters( new RequestParameters( request.getParameterMap() ) ); assertEquals( "skoda,lexus,volvo", efExecutor.evaluate( "${params.cars}" ) ); assertEquals( "3", efExecutor.evaluate( "${params.cars.length}" ) ); assertEquals( "3", efExecutor.evaluate( "${params['cars'].length}" ) ); assertEquals( "skoda", efExecutor.evaluate( "${params.cars[0]}" ) ); assertEquals( "skoda", efExecutor.evaluate( "${params['cars'][0]}" ) ); assertEquals( "volvo", efExecutor.evaluate( "${params.cars[2]}" ) ); assertEquals( "volvo", efExecutor.evaluate( "${params['cars'][2]}" ) ); assertEquals( "false", efExecutor.evaluate( "${params.cars == 'skoda'}" ) ); assertEquals( "true", efExecutor.evaluate( "${params.cars[0] == 'skoda'}" ) ); assertEquals( "true", efExecutor.evaluate( "${params['cars'][2] == 'volvo'}" ) ); assertEquals( "3", efExecutor.evaluate( "${params.third.length}" ) ); assertEquals( "3", efExecutor.evaluate( "${params['third'].length}" ) ); assertEquals( "audi", efExecutor.evaluate( "${params.third[0]}" ) ); assertEquals( "audi", efExecutor.evaluate( "${params['third'][0]}" ) ); assertEquals( "opel", efExecutor.evaluate( "${params.third[2]}" ) ); assertEquals( "opel", efExecutor.evaluate( "${params['third'][2]}" ) ); assertEquals( "false", efExecutor.evaluate( "${params.third == 'audi'}" ) ); assertEquals( "true", efExecutor.evaluate( "${params.third != 'audi'}" ) ); assertEquals( "true", efExecutor.evaluate( "${params.third[0] == 'audi'}" ) ); assertEquals( "true", efExecutor.evaluate( "${params.third[2] == 'opel'}" ) ); } @Test public void testSingleValue_asParams() { MockHttpServletRequest request = new MockHttpServletRequest(); request.addParameter( "brands", "bmw" ); efExecutor.setHttpRequest( request ); efExecutor.setRequestParameters( new RequestParameters( request.getParameterMap() ) ); assertEquals( "1", efExecutor.evaluate( "${params.brands.length}" ) ); assertEquals( "1", efExecutor.evaluate( "${params['brands'].length}" ) ); assertEquals( "bmw", efExecutor.evaluate( "${params.brands[0]}" ) ); assertEquals( "bmw", efExecutor.evaluate( "${params['brands'][0]}" ) ); assertEquals( "true", efExecutor.evaluate( "${params.brands[0] == 'bmw'}" ) ); } @Test public void testSingleParameterEvaulation() throws Exception { MockHttpServletRequest request = new MockHttpServletRequest(); request.addParameter( "subCat", "18" ); request.addParameter( "sub-cat", "27" ); efExecutor.setHttpRequest( request ); efExecutor.setRequestParameters( new RequestParameters( request.getParameterMap() ) ); assertEquals( "18", efExecutor.evaluate( "${param.subCat}" ) ); assertEquals( "27", efExecutor.evaluate( "${param['sub-cat']}" ) ); } @Test public void testArrayOfParametersWithTheSameNameEvaulation() throws Exception { MockHttpServletRequest request = new MockHttpServletRequest(); request.addParameter( "brands", "bmw" ); request.addParameter( "brands", "volvo" ); request.addParameter( "brands", "skoda" ); efExecutor.setHttpRequest( request ); efExecutor.setRequestParameters( new RequestParameters( request.getParameterMap() ) ); String param = efExecutor.evaluate( "${params.brands}" ); assertEquals( "bmw,volvo,skoda", param ); param = efExecutor.evaluate( "${params.brands[0]}" ); assertEquals( "bmw", param ); param = efExecutor.evaluate( "${params.brands[1]}" ); assertEquals( "volvo", param ); param = efExecutor.evaluate( "${params.brands[2]}" ); assertEquals( "skoda", param ); String length = efExecutor.evaluate( "${params.brands.length}" ); assertEquals( "3", length ); } @Test public void testArrayOfParametersWithTheSameNameEvaulation_variableWithDash() throws Exception { MockHttpServletRequest request = new MockHttpServletRequest(); request.addParameter( "my-brands", "bmw" ); request.addParameter( "my-brands", "volvo" ); request.addParameter( "my-brands", "skoda" ); efExecutor.setHttpRequest( request ); efExecutor.setRequestParameters( new RequestParameters( request.getParameterMap() ) ); String param = efExecutor.evaluate( "${params['my-brands']}" ); assertEquals( "bmw,volvo,skoda", param ); param = efExecutor.evaluate( "${params['my-brands'][0]}" ); assertEquals( "bmw", param ); param = efExecutor.evaluate( "${params['my-brands'][1]}" ); assertEquals( "volvo", param ); param = efExecutor.evaluate( "${params['my-brands'][2]}" ); assertEquals( "skoda", param ); String length = efExecutor.evaluate( "${params['my-brands'].length}" ); assertEquals( "3", length ); } @Test public void testEvaluateCurrentDateWithTime() throws Exception { timeService.setTimeNow( new DateTime( 2010, 5, 28, 12, 30, 4, 2 ) ); String evaluated = efExecutor.evaluate( "@publishfrom >= ${currentDate( 'yyyy.MM.dd HH:mm' )}" ); assertEquals( "@publishfrom >= 2010.05.28 12:30", evaluated ); } @Test public void testEvaluateCurrentDateWithoutTime() throws Exception { timeService.setTimeNow( new DateTime( 2010, 5, 28, 12, 30, 4, 2 ) ); String evaluated = efExecutor.evaluate( "@publishfrom >= ${currentDate( 'yyyy.MM.dd' )}" ); assertEquals( "@publishfrom >= 2010.05.28", evaluated ); } @Test public void testEvaluateCurrentDateMinusOffset() throws Exception { timeService.setTimeNow( new DateTime( 2010, 5, 28, 12, 30, 4, 2 ) ); String evaluated = efExecutor.evaluate( "@publishfrom >= ${currentDateMinusOffset( 'yyyy.MM.dd HH:mm', periodHoursMinutes( 2, 35 ) )}" ); assertEquals( "@publishfrom >= 2010.05.28 09:55", evaluated ); evaluated = efExecutor.evaluate( "@publishfrom >= ${currentDateMinusOffset( 'yyyy.MM.dd HH:mm', 'PT2H35M' )}" ); assertEquals( "@publishfrom >= 2010.05.28 09:55", evaluated ); // .. and with negative periods evaluated = efExecutor.evaluate( "@publishfrom >= ${currentDateMinusOffset( 'yyyy.MM.dd HH:mm', periodHoursMinutes( -2, -35 ) )}" ); assertEquals( "@publishfrom >= 2010.05.28 15:05", evaluated ); evaluated = efExecutor.evaluate( "@publishfrom >= ${currentDateMinusOffset( 'yyyy.MM.dd HH:mm', 'PT-2H-35M' )}" ); assertEquals( "@publishfrom >= 2010.05.28 15:05", evaluated ); } @Test public void testEvaluateCurrentDatePlusOffset() throws Exception { timeService.setTimeNow( new DateTime( 2010, 5, 28, 12, 30, 4, 2 ) ); String evaluated = efExecutor.evaluate( "@publishfrom >= ${currentDatePlusOffset( 'yyyy.MM.dd HH:mm', periodHoursMinutes( 2, 5 ) )}" ); assertEquals( "@publishfrom >= 2010.05.28 14:35", evaluated ); evaluated = efExecutor.evaluate( "@publishfrom >= ${currentDatePlusOffset( 'yyyy.MM.dd HH:mm', 'PT2H5M' )}" ); assertEquals( "@publishfrom >= 2010.05.28 14:35", evaluated ); // .. and with negative periods evaluated = efExecutor.evaluate( "@publishfrom >= ${currentDatePlusOffset( 'yyyy.MM.dd HH:mm', periodHoursMinutes( -2, -5 ) )}" ); assertEquals( "@publishfrom >= 2010.05.28 10:25", evaluated ); evaluated = efExecutor.evaluate( "@publishfrom >= ${currentDatePlusOffset( 'yyyy.MM.dd HH:mm', 'PT-2H-5M' )}" ); assertEquals( "@publishfrom >= 2010.05.28 10:25", evaluated ); } @Test public void testEvaluatePositiveDurationHoursMinutes() throws Exception { timeService.setTimeNow( new DateTime( 2010, 5, 28, 12, 30, 4, 2 ) ); String evaluated = efExecutor.evaluate( "${periodHoursMinutes( 2, 5 )}" ); assertEquals( "PT2H5M", evaluated ); } @Test public void testEvaluateNegativeDurationHoursMinutes() throws Exception { timeService.setTimeNow( new DateTime( 2010, 5, 28, 12, 30, 4, 2 ) ); String evaluated = efExecutor.evaluate( "${periodHoursMinutes( -2, -5 )}" ); assertEquals( "PT-2H-5M", evaluated ); } @Test public void testPortalSiteKey() throws Exception { String evaluated = efExecutor.evaluate( "${portal.siteKey}" ); assertEquals( "0", evaluated ); } @Test public void testPortalSiteKeyValueDoesNotExists() throws Exception { String evaluated = efExecutor.evaluate( "${portal.siteKey1233}" ); assertEquals( null, evaluated ); } @Test public void testUrlEncode() throws Exception { RequestParameters requestParameters = new RequestParameters(); requestParameters.addParameterValue( "other", "&greeting=Hei ÆØÅ!" ); efExecutor.setRequestParameters( requestParameters ); String evaluated = efExecutor.evaluate( "${concat('https://test.test.no/api/', '/bestillKurs?api-key=testuser&api-secret=testuser', urlEncode(param.other))}" ); assertEquals( "https://test.test.no/api//bestillKurs?api-key=testuser&api-secret=testuser%26greeting%3DHei+%C3%86%C3%98%C3%85%21", evaluated ); } @Test public void testUrlEncodeEmpty() throws Exception { String evaluated = efExecutor.evaluate( "${concat('https://test.test.no/api/', '/bestillKurs?api-key=testuser&api-secret=testuser', urlEncode(param.other))}" ); assertEquals( "https://test.test.no/api//bestillKurs?api-key=testuser&api-secret=testuser", evaluated ); } @Test public void testPropertyFromSite() throws Exception { String evaluated = efExecutor.evaluate( "${properties['cms.site.test']}" ); assertEquals( "site", evaluated ); } @Test() public void testBadFunc() throws Exception { String evaluated = efExecutor.evaluate( "${concat(}" ); assertEquals( "ERROR: Found closing '}' at position 9 but most recent opening is '(' at position 8", evaluated ); } @Test public void testPropertiesFromSite() throws Exception { String evaluated = efExecutor.evaluate( "${concat(properties['cms.site.test'], properties['cms.site.test'])}" ); assertEquals( "sitesite", evaluated ); } @Test public void testPropertiesFromSite2() throws Exception { String evaluated = efExecutor.evaluate( "${concat(properties.cms.site.test, properties.cms.site.test)}" ); assertEquals( "sitesite", evaluated ); } @Test public void testProperties1FromSiteInUpperFunc() throws Exception { String evaluated = efExecutor.evaluate( "${upper(properties.cms.site.test)}" ); assertEquals( "SITE", evaluated ); } @Test public void testProperties2FromSiteInUpperFunc() throws Exception { String evaluated = efExecutor.evaluate( "${upper(properties['cms.site.test'])}" ); assertEquals( "SITE", evaluated ); } @Test public void testPropertyFromRoot() throws Exception { String evaluated = efExecutor.evaluate( "${properties['cms.root.test']}" ); assertEquals( "root", evaluated ); } @Test public void testOverriddenProperty() throws Exception { String evaluated = efExecutor.evaluate( "${properties['cms.test']}" ); assertEquals( "overridden", evaluated ); } @Test public void testContentQuery() throws Exception { String evaluated = efExecutor.evaluate( "data.sn = ${properties['cms.test']}" ); assertEquals( "data.sn = overridden", evaluated ); } @Test public void testMissedProperty() throws Exception { String evaluated = efExecutor.evaluate( "${properties['cms.test.none']}" ); assertEquals( null, evaluated ); } @Test public void testEvaluateNegativeDurationHoursMinutesComplex() throws Exception { MockHttpServletRequest request = new MockHttpServletRequest(); request.addParameter( "subCat", "-5" ); request.addParameter( "sub-cat", "-2" ); efExecutor.setHttpRequest( request ); efExecutor.setRequestParameters( new RequestParameters( request.getParameterMap() ) ); timeService.setTimeNow( new DateTime( 2010, 5, 28, 12, 30, 4, 2 ) ); String evaluated = efExecutor.evaluate( "${periodHoursMinutes( param['sub-cat'], param.subCat )}" ); assertEquals( "PT-2H-5M", evaluated ); } }