/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.portal.datasource.el; import org.joda.time.DateTime; import org.junit.Test; import com.enonic.cms.core.portal.PortalInstanceKey; import com.enonic.cms.core.structure.SiteKey; import com.enonic.cms.core.structure.menuitem.MenuItemEntity; import com.enonic.cms.core.structure.menuitem.MenuItemKey; import com.enonic.cms.core.structure.portlet.PortletKey; import com.enonic.cms.core.time.MockTimeService; import com.enonic.cms.core.time.TimeService; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertNull; import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.fail; public class ExpressionFunctionsTest { private ExpressionFunctions expressionFunctions = new ExpressionFunctions(); @Test public void test_select() throws Exception { String result1 = expressionFunctions.select( "abc", null ); String result2 = expressionFunctions.select( "abc", "" ); String result3 = expressionFunctions.select( "abc", " " ); String result4 = expressionFunctions.select( "abd", "abc" ); String result5 = expressionFunctions.select( " ", "abc" ); String result6 = expressionFunctions.select( " ", null ); String result7 = expressionFunctions.select( "", "abc" ); String result8 = expressionFunctions.select( "", null ); String result9 = expressionFunctions.select( null, "abc" ); assertEquals( "abc", result1 ); assertEquals( "abc", result2 ); assertEquals( "abc", result3 ); assertEquals( "abd", result4 ); assertEquals( "abc", result5 ); assertNull( result6 ); assertEquals( "abc", result7 ); assertNull( result8 ); assertEquals( "abc", result9 ); } @Test public void test_replace() throws Exception { String testString = "Dette �r 1 tilfeldig �vre tekststring med rare tegn � tall som 1.234e12!"; String result1 = expressionFunctions.replace( testString, "\\s", "TEST" ); String result2 = expressionFunctions.replace( testString, "\\s+", "TEST" ); String result3 = expressionFunctions.replace( testString, "\\d", "tall" ); assertTrue( result1.contains( "�rTEST1TESTTESTTESTtilfeldig" ) ); assertTrue( result2.contains( "�rTEST1TESTtilfeldig" ) ); assertTrue( result3.endsWith( "som tall.talltalltalletalltall!" ) ); String result4 = expressionFunctions.replace( testString, "�vre", "nedre" ); assertTrue( result4.contains( "tilfeldig nedre tekststring" ) ); int index = result4.indexOf( "nedre" ); assertTrue( index > 1 ); index = result4.indexOf( "nedre", index + 1 ); assertEquals( -1, index ); } @Test public void test_build_freetext_query() throws Exception { String result0a = expressionFunctions.buildFreetextQuery( "freetext", "", "AND" ); assertEquals( "", result0a ); String result0b = expressionFunctions.buildFreetextQuery( "", "", "or" ); assertEquals( "", result0b ); String result1 = expressionFunctions.buildFreetextQuery( "freetext", "Lagavullin", "AND" ); assertEquals( "freetext CONTAINS \"Lagavullin\"", result1 ); String result2 = expressionFunctions.buildFreetextQuery( "freetext", "Lagavullin", "or" ); assertEquals( "freetext CONTAINS \"Lagavullin\"", result2 ); String result3 = expressionFunctions.buildFreetextQuery( "contentdata/article/text", "Vertical Site", "anD" ); assertEquals( "contentdata/article/text CONTAINS \"Vertical\" AND contentdata/article/text CONTAINS \"Site\"", result3 ); String result4 = expressionFunctions.buildFreetextQuery( "data/*", "Jan J�rund J�rgen Jens Jarle", "Or" ); assertEquals( "data/* CONTAINS \"Jan\" OR data/* CONTAINS \"J�rund\" OR " + "data/* CONTAINS \"J�rgen\" OR data/* CONTAINS \"Jens\" OR data/* CONTAINS \"Jarle\"", result4 ); String result5 = expressionFunctions.buildFreetextQuery( "data/*", "CMS 4.3.4", "and" ); assertEquals( "data/* CONTAINS \"CMS\" AND data/* CONTAINS \"4.3.4\"", result5 ); String result6 = expressionFunctions.buildFreetextQuery( "data/*", "3.14", "or" ); assertEquals( "data/* CONTAINS \"3.14\"", result6 ); String result7 = expressionFunctions.buildFreetextQuery( "data/*", "12345 Colorado Blvd, San Diego, CA 92111", "And" ); assertEquals( "data/* CONTAINS \"12345\" AND data/* CONTAINS \"Colorado\" AND " + "data/* CONTAINS \"Blvd,\" AND data/* CONTAINS \"San\" AND " + "data/* CONTAINS \"Diego,\" AND data/* CONTAINS \"CA\" AND data/* CONTAINS \"92111\"", result7 ); String result8 = expressionFunctions.buildFreetextQuery( "data/*", "2+2 < {Four*}", "or" ); assertEquals( "data/* CONTAINS \"2+2\" OR data/* CONTAINS \"<\" OR data/* CONTAINS \"{Four*}\"", result8 ); String result9 = expressionFunctions.buildFreetextQuery( "data/*", "(a+2)=b || ^(&ptr<1.2e2)", "and" ); assertEquals( "data/* CONTAINS \"(a+2)=b\" AND data/* CONTAINS \"||\" AND data/* CONTAINS \"^(&ptr<1.2e2)\"", result9 ); } @Test public void test_build_freetext_query_with_quotes() throws Exception { String result1 = expressionFunctions.buildFreetextQuery( "freetext", "Enonic's", "and" ); assertEquals( "freetext CONTAINS \"Enonic's\"", result1 ); String result2 = expressionFunctions.buildFreetextQuery( "freetext", "Enonic's \"Vertical Site\"", "anD" ); assertEquals( "freetext CONTAINS \"Enonic's\" AND freetext CONTAINS \"Vertical Site\"", result2 ); String result3 = expressionFunctions.buildFreetextQuery( "data/text", "�l \"La humla suse", "Or" ); assertEquals( "data/text CONTAINS \"�l\" OR data/text CONTAINS \"La humla suse\"", result3 ); String result4 = expressionFunctions.buildFreetextQuery( "data/*", "\"Hei du\" \"Hadde bra!", "and" ); assertEquals( "data/* CONTAINS \"Hei du\" AND data/* CONTAINS \"Hadde bra!\"", result4 ); } @Test public void test_build_freetext_query_error_handling() throws Exception { try { expressionFunctions.buildFreetextQuery( "freetext", "Ja, ha!", "NOT" ); fail( "An exception should have been thrown." ); } catch ( IllegalArgumentException e ) { // Successful: assertEquals( "Illegal operator: NOT", e.getMessage() ); } try { expressionFunctions.buildFreetextQuery( "freetext", "Jo, da!", "rubbish" ); fail( "An exception should have been thrown." ); } catch ( IllegalArgumentException e ) { // Successful: assertEquals( "Illegal operator: rubbish", e.getMessage() ); } try { expressionFunctions.buildFreetextQuery( null, "Oh, yeah!", "and" ); fail( "An exception should have been thrown." ); } catch ( IllegalArgumentException e ) { // Successful! } try { expressionFunctions.buildFreetextQuery( " ", "Oh, yeah!", "or" ); fail( "An exception should have been thrown." ); } catch ( IllegalArgumentException e ) { // Successful! } } @Test public void test_get_page_key() { ExpressionFunctions eFuncs = new ExpressionFunctions(); ExpressionContext context = new ExpressionContext(); MenuItemEntity menuItem = new MenuItemEntity(); final int key = 123; menuItem.setKey( new MenuItemKey( key ) ); context.setMenuItem( menuItem ); eFuncs.setContext( context ); assertEquals( "123", eFuncs.getPageKey() ); } @Test public void test_get_portlet_window_key() { ExpressionFunctions eFuncs = new ExpressionFunctions(); ExpressionContext context = new ExpressionContext(); final int menuKey = 123; final int portletKey = 246; PortalInstanceKey portalInstanceKey = PortalInstanceKey.createWindow( new MenuItemKey( menuKey ), new PortletKey( portletKey ), new SiteKey( 0 ) ); context.setPortalInstanceKey( portalInstanceKey ); eFuncs.setContext( context ); assertEquals( "123:246", eFuncs.getWindowKey() ); } @Test public void test_current_date() { TimeService timeService = new MockTimeService( new DateTime( 2010, 5, 28, 12, 30, 5, 4 ) ); ExpressionFunctions expressionFunctions = new ExpressionFunctions(); expressionFunctions.setTimeService( timeService ); assertEquals( "28.05.2010 12:30", expressionFunctions.currentDate( "dd.MM.yyyy HH:mm" ) ); } @Test public void test_period_hours_minutes() { TimeService timeService = new MockTimeService( new DateTime( 2010, 5, 28, 12, 30, 5, 4 ) ); ExpressionFunctions expressionFunctions = new ExpressionFunctions(); expressionFunctions.setTimeService( timeService ); assertEquals( "PT2H", expressionFunctions.periodHoursMinutes( 2, 0 ) ); assertEquals( "PT2H5M", expressionFunctions.periodHoursMinutes( 2, 5 ) ); assertEquals( "PT-2H5M", expressionFunctions.periodHoursMinutes( -2, 5 ) ); assertEquals( "PT-2H-5M", expressionFunctions.periodHoursMinutes( -2, -5 ) ); assertEquals( "PT2H61M", expressionFunctions.periodHoursMinutes( 2, 61 ) ); } @Test public void test_current_date_plus_offset() { TimeService timeService = new MockTimeService( new DateTime( 2010, 5, 28, 12, 30, 0, 4 ) ); ExpressionFunctions ef = new ExpressionFunctions(); ef.setTimeService( timeService ); assertEquals( "28.05.2010 14:35", ef.currentDatePlusOffset( "dd.MM.yyyy HH:mm", "PT2H5M" ) ); assertEquals( "28.05.2010 10:25", ef.currentDatePlusOffset( "dd.MM.yyyy HH:mm", "PT-2H-5M" ) ); assertEquals( "28.05.2010 14:35", ef.currentDatePlusOffset( "dd.MM.yyyy HH:mm", ef.periodHoursMinutes( 2, 5 ) ) ); assertEquals( "28.05.2010 10:25", ef.currentDatePlusOffset( "dd.MM.yyyy HH:mm", ef.periodHoursMinutes( -2, -5 ) ) ); } @Test public void test_current_date_minus_offset() { TimeService timeService = new MockTimeService( new DateTime( 2010, 5, 28, 12, 30, 0, 4 ) ); ExpressionFunctions ef = new ExpressionFunctions(); ef.setTimeService( timeService ); assertEquals( "28.05.2010 10:25", ef.currentDateMinusOffset( "dd.MM.yyyy HH:mm", "PT2H5M" ) ); assertEquals( "28.05.2010 14:35", ef.currentDateMinusOffset( "dd.MM.yyyy HH:mm", "PT-2H-5M" ) ); assertEquals( "28.05.2010 10:25", ef.currentDateMinusOffset( "dd.MM.yyyy HH:mm", ef.periodHoursMinutes( 2, 5 ) ) ); assertEquals( "28.05.2010 14:35", ef.currentDateMinusOffset( "dd.MM.yyyy HH:mm", ef.periodHoursMinutes( -2, -5 ) ) ); } @Test public void test_is_blank() { ExpressionFunctions ef = new ExpressionFunctions(); assertEquals( true, ef.isblank( null ) ); assertEquals( true, ef.isblank( "" ) ); assertEquals( true, ef.isblank( " " ) ); assertEquals( true, ef.isblank( " " ) ); assertEquals( false, ef.isblank( "s" ) ); assertEquals( false, ef.isblank( " s " ) ); } @Test public void test_is_not_blank() { ExpressionFunctions ef = new ExpressionFunctions(); assertEquals( false, ef.isnotblank( null ) ); assertEquals( false, ef.isnotblank( "" ) ); assertEquals( false, ef.isnotblank( " " ) ); assertEquals( false, ef.isnotblank( " " ) ); assertEquals( true, ef.isnotblank( "s" ) ); assertEquals( true, ef.isnotblank( " s " ) ); } @Test public void test_is_empty() { ExpressionFunctions ef = new ExpressionFunctions(); assertEquals( true, ef.isempty( null ) ); assertEquals( true, ef.isempty( "" ) ); assertEquals( false, ef.isempty( " " ) ); assertEquals( false, ef.isempty( " " ) ); assertEquals( false, ef.isempty( "s" ) ); assertEquals( false, ef.isempty( " s " ) ); } @Test public void test_is_not_empty() { ExpressionFunctions ef = new ExpressionFunctions(); assertEquals( false, ef.isnotempty( null ) ); assertEquals( false, ef.isnotempty( "" ) ); assertEquals( true, ef.isnotempty( " " ) ); assertEquals( true, ef.isnotempty( " " ) ); assertEquals( true, ef.isnotempty( "s" ) ); assertEquals( true, ef.isnotempty( " s " ) ); } @Test public void test_get_escaped_URL_empty() { ExpressionFunctions ef = new ExpressionFunctions(); assertEquals( "", ef.urlEncode( "" ) ); } @Test public void test_get_escaped_URL_without_parameters() { ExpressionFunctions ef = new ExpressionFunctions(); assertEquals( "http%3A%2F%2Flocalhost%3A8080", ef.urlEncode( "http://localhost:8080" ) ); } @Test public void urlEncode_url_with_fragment() { ExpressionFunctions ef = new ExpressionFunctions(); assertEquals( "http%3A%2F%2Flocalhost%3A8080%23fragment", ef.urlEncode( "http://localhost:8080#fragment" ) ); } @Test public void urlEncode_query_parameter_with_space() { ExpressionFunctions ef = new ExpressionFunctions(); assertEquals( "my+Parameter%3Dmy+Value", ef.urlEncode( "my Parameter=my Value" ) ); } @Test public void urlEncode_query_parameter_with_plus() { ExpressionFunctions ef = new ExpressionFunctions(); assertEquals( "my%2BParameter%3Dmy%2BValue", ef.urlEncode( "my+Parameter=my+Value" ) ); } @Test public void urlEncode_string_with_plus() { ExpressionFunctions ef = new ExpressionFunctions(); assertEquals( "my%2BValue", ef.urlEncode( "my+Value" ) ); } @Test public void urlEncode_string_with_space() { ExpressionFunctions ef = new ExpressionFunctions(); assertEquals( "my+Value", ef.urlEncode( "my Value" ) ); } @Test public void urlEncode_string_with_reserved_characters() { ExpressionFunctions ef = new ExpressionFunctions(); assertEquals( "reservedChars%3D%24%26%2B%2C%2F%3A%3B%3D%3F%40", ef.urlEncode( "reservedChars=$&+,/:;=?@" ) ); } @Test public void urlEncode_string_with_unsafe_characters() { ExpressionFunctions ef = new ExpressionFunctions(); assertEquals( "unsafeChars%3D%24%26%2B%2C%2F%3A%3B%3D%3F%40", ef.urlEncode( "unsafeChars=$&+,/:;=?@" ) ); } @Test public void urlEncode_string_with_line_break() { ExpressionFunctions ef = new ExpressionFunctions(); assertEquals( "query%3Dline%0Abreak", ef.urlEncode( "query=line\nbreak" ) ); } }