/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.portal.datasource.handler.extension;
import java.util.Arrays;
import java.util.Locale;
import org.jdom.Document;
import org.jdom.Element;
import org.junit.Test;
import com.enonic.esl.xml.XMLTool;
import com.enonic.cms.api.plugin.ext.FunctionLibrary;
import com.enonic.cms.core.plugin.ext.FunctionLibraryExtensions;
import com.enonic.cms.core.portal.datasource.DataSourceException;
import com.enonic.cms.core.portal.datasource.handler.AbstractDataSourceHandlerTest;
public class InvokeExtensionHandlerTest
extends AbstractDataSourceHandlerTest<InvokeExtensionHandler>
{
public class Extension1
{
// Return the document as it is
public Document method1()
{
return new Document( new Element( "dummy" ) );
}
// Return the document as jdom document
public org.w3c.dom.Document method2()
{
return XMLTool.createDocument( "dummy" );
}
// Return <value>dummy</value>
public String method3()
{
return "dummy";
}
// Return <value>3</value>
public int method4()
{
return 3;
}
// Return <value>en</value>
public Object method5()
{
return Locale.ENGLISH;
}
}
public class Extension2
{
public String method1()
{
return "method1";
}
public String method1( final int param1 )
{
return "method1: " + param1;
}
public String method1( final int param1, final String param2 )
{
return "method1: " + param1 + ", " + param2;
}
public String method2( final int[] param1 )
{
return "method2: " + Arrays.toString( param1 );
}
public String method3( final boolean param1 )
{
return "method3: " + param1;
}
public String method4( final int param1, final String param2 )
{
return "method4: " + param1 + ", " + param2;
}
public String method4( final int param1, final int param2 )
{
return "method4: " + param1 + " - " + param2;
}
}
public InvokeExtensionHandlerTest()
{
super( InvokeExtensionHandler.class );
}
@Override
protected void initTest()
throws Exception
{
final FunctionLibrary lib1 = new FunctionLibrary();
lib1.setName( "lib1" );
lib1.setTarget( new Extension1() );
lib1.setTargetClass( Extension1.class );
final FunctionLibrary lib2 = new FunctionLibrary();
lib2.setName( "lib2" );
lib2.setTarget( new Extension2() );
lib2.setTargetClass( Extension2.class );
final FunctionLibraryExtensions extensions = new FunctionLibraryExtensions();
extensions.extensionAdded( lib1 );
extensions.extensionAdded( lib2 );
this.handler.setExtensions( extensions );
}
@Test(expected = DataSourceException.class)
public void testHandler_no_lib()
throws Exception
{
this.request.addParam( "name", "other.noSuchMethod" );
this.handler.handle( this.request );
}
@Test(expected = DataSourceException.class)
public void testHandler_no_method()
throws Exception
{
this.request.addParam( "name", "lib1.noSuchMethod" );
this.handler.handle( this.request );
}
@Test
public void testHandler_extension_returns_jdom_document()
throws Exception
{
this.request.addParam( "name", "lib1.method1" );
this.testHandle( "invokeExtension_document_result" );
}
@Test
public void testHandler_extension_returns_w3c_document()
throws Exception
{
this.request.addParam( "name", "lib1.method2" );
this.testHandle( "invokeExtension_document_result" );
}
@Test
public void testHandler_extension_returns_string()
throws Exception
{
this.request.addParam( "name", "lib1.method3" );
this.testHandle( "invokeExtension_string_result" );
}
@Test
public void testHandler_extension_returns_int()
throws Exception
{
this.request.addParam( "name", "lib1.method4" );
this.testHandle( "invokeExtension_int_result" );
}
@Test
public void testHandler_extension_returns_object()
throws Exception
{
this.request.addParam( "name", "lib1.method5" );
this.testHandle( "invokeExtension_object_result" );
}
@Test
public void testHandler_extension_no_parameters()
throws Exception
{
this.request.addParam( "name", "lib2.method1" );
this.testHandle( "invokeExtension_no_parameters" );
}
@Test
public void testHandler_extension_one_parameter()
throws Exception
{
this.request.addParam( "name", "lib2.method1" );
this.request.addParam( "param1", "33" );
this.testHandle( "invokeExtension_one_parameter" );
}
@Test
public void testHandler_extension_two_parameters()
throws Exception
{
this.request.addParam( "name", "lib2.method1" );
this.request.addParam( "param1", "33" );
this.request.addParam( "param2", "text" );
this.testHandle( "invokeExtension_two_parameters" );
}
@Test(expected = DataSourceException.class)
public void testHandler_extension_too_many_params()
throws Exception
{
this.request.addParam( "name", "lib2.method1" );
this.request.addParam( "param1", "33" );
this.request.addParam( "param2", "text" );
this.request.addParam( "param3", "one-too-many" );
this.handler.handle( this.request );
}
@Test(expected = DataSourceException.class)
public void testHandler_extension_non_unique_method()
throws Exception
{
this.request.addParam( "name", "lib2.method4" );
this.request.addParam( "param1", "33" );
this.request.addParam( "param2", "text" );
this.handler.handle( this.request );
}
@Test
public void testHandler_extension_array_parameters()
throws Exception
{
this.request.addParam( "name", "lib2.method2" );
this.request.addParam( "param1", "1,2,3,5,8,13,21,34" );
this.testHandle( "invokeExtension_array_parameter" );
}
@Test
public void testHandler_extension_boolean_parameter()
throws Exception
{
this.request.addParam( "name", "lib2.method3" );
this.request.addParam( "param1", "true" );
this.testHandle( "invokeExtension_boolean_parameter" );
}
}