/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.content.contenttype;
import java.io.IOException;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.junit.Test;
import com.enonic.cms.framework.util.JDOMUtil;
import com.enonic.cms.core.content.contenttype.dataentryconfig.AbstractBaseDataEntryConfig;
import com.enonic.cms.core.content.contenttype.dataentryconfig.DataEntryConfig;
import com.enonic.cms.core.content.contenttype.dataentryconfig.DataEntryConfigType;
import com.enonic.cms.core.content.contenttype.dataentryconfig.DateDataEntryConfig;
import com.enonic.cms.core.content.contenttype.dataentryconfig.RelatedContentDataEntryConfig;
import com.enonic.cms.core.content.contenttype.dataentryconfig.TextDataEntryConfig;
import static org.junit.Assert.*;
public class ContentTypeConfigParserTest
{
@Test
public void testParseBasicConfig()
throws IOException, JDOMException
{
StringBuffer configXml = new StringBuffer();
configXml.append( "<config name=\"MyContentType\" version=\"1.0\">" );
configXml.append( " <form>" );
configXml.append( " <title name=\"test_title\"/>" );
configXml.append( " <block name=\"TestBlock1\">" );
configXml.append( " <help>This is some help text that should be ignored. Only used in XSL</help>" );
configXml.append( " <input name=\"test_title\" required=\"true\" type=\"text\">" );
configXml.append( " <display>Title</display>" );
configXml.append( " <xpath>contentdata/test/title</xpath>" );
configXml.append( " <help>This is just some help text that should be ignored.</help>" );
configXml.append( " </input>" );
configXml.append( " </block>" );
configXml.append( " </form>" );
configXml.append( "</config>" );
Element configEl = JDOMUtil.parseDocument( configXml.toString() ).getRootElement();
ContentTypeConfig config = ContentTypeConfigParser.parse( ContentHandlerName.CUSTOM, configEl );
assertNotNull( config );
assertEquals( "MyContentType", config.getName() );
assertEquals( "test_title", config.getForm().getTitleInputName() );
assertNotNull( config.getForm().getTitleInput() );
assertNotNull( config.getInputConfig( "test_title" ) );
}
@Test
public void testParseTextInputConfig()
throws IOException, JDOMException
{
StringBuffer configXml = new StringBuffer();
configXml.append( "<config name=\"MyContentType\" version=\"1.0\">" );
configXml.append( " <form>" );
configXml.append( " <title name=\"myText\"/>" );
configXml.append( " <block name=\"TestBlock1\">" );
configXml.append( " <input name=\"myText\" required=\"true\" type=\"text\">" );
configXml.append( " <display>My text</display>" );
configXml.append( " <xpath>contentdata/mytext</xpath>" );
configXml.append( " </input>" );
configXml.append( " </block>" );
configXml.append( " </form>" );
configXml.append( "</config>" );
Element configEl = JDOMUtil.parseDocument( configXml.toString() ).getRootElement();
ContentTypeConfig config = ContentTypeConfigParser.parse( ContentHandlerName.CUSTOM, configEl );
TextDataEntryConfig dataEntryConfig = (TextDataEntryConfig) config.getInputConfig( "myText" );
assertEquals( DataEntryConfigType.TEXT, dataEntryConfig.getType() );
assertEquals( "My text", dataEntryConfig.getDisplayName() );
assertEquals( "myText", dataEntryConfig.getName() );
assertEquals( "contentdata/mytext", dataEntryConfig.getRelativeXPath() );
assertTrue( dataEntryConfig.isRequired() );
}
@Test
public void testParseTextAreaInputConfig()
throws IOException, JDOMException
{
StringBuffer configXml = new StringBuffer();
configXml.append( "<config name=\"MyContentType\" version=\"1.0\">" );
configXml.append( " <form>" );
configXml.append( " <title name=\"myText\"/>" );
configXml.append( " <block name=\"TestBlock1\">" );
configXml.append( " <input name=\"myText\" required=\"true\" type=\"text\">" );
configXml.append( " <display>My text</display>" );
configXml.append( " <xpath>contentdata/mytext</xpath>" );
configXml.append( " </input>" );
configXml.append( " <input name=\"myTextArea\" required=\"false\" type=\"textarea\">" );
configXml.append( " <display>My textarea</display>" );
configXml.append( " <xpath>contentdata/mytextarea</xpath>" );
configXml.append( " </input>" );
configXml.append( " </block>" );
configXml.append( " </form>" );
configXml.append( "</config>" );
Element configEl = JDOMUtil.parseDocument( configXml.toString() ).getRootElement();
ContentTypeConfig config = ContentTypeConfigParser.parse( ContentHandlerName.CUSTOM, configEl );
AbstractBaseDataEntryConfig inputConfig = (AbstractBaseDataEntryConfig) config.getInputConfig( "myTextArea" );
assertEquals( DataEntryConfigType.TEXT_AREA, inputConfig.getType() );
assertEquals( "My textarea", inputConfig.getDisplayName() );
assertEquals( "myTextArea", inputConfig.getName() );
assertEquals( "contentdata/mytextarea", inputConfig.getRelativeXPath() );
assertFalse( inputConfig.isRequired() );
}
@Test
public void testParseRelatedContentInputConfig()
throws IOException, JDOMException
{
StringBuffer configXml = new StringBuffer();
configXml.append( "<config name=\"MyContentType\" version=\"1.0\">" );
configXml.append( " <form>" );
configXml.append( " <title name=\"myText\"/>" );
configXml.append( " <block name=\"TestBlock1\">" );
configXml.append( " <input name=\"myText\" required=\"true\" type=\"text\">" );
configXml.append( " <display>My text</display>" );
configXml.append( " <xpath>contentdata/mytext</xpath>" );
configXml.append( " </input>" );
configXml.append( " <input name=\"myRel\" required=\"false\" type=\"relatedcontent\">" );
configXml.append( " <display>My related</display>" );
configXml.append( " <xpath>contentdata/myrelated</xpath>" );
configXml.append( " </input>" );
configXml.append( " </block>" );
configXml.append( " </form>" );
configXml.append( "</config>" );
Element configEl = JDOMUtil.parseDocument( configXml.toString() ).getRootElement();
ContentTypeConfig config = ContentTypeConfigParser.parse( ContentHandlerName.CUSTOM, configEl );
RelatedContentDataEntryConfig dataEntryConfig = (RelatedContentDataEntryConfig) config.getInputConfig( "myRel" );
assertEquals( DataEntryConfigType.RELATEDCONTENT, dataEntryConfig.getType() );
assertEquals( "My related", dataEntryConfig.getDisplayName() );
assertEquals( "myRel", dataEntryConfig.getName() );
assertEquals( "contentdata/myrelated", dataEntryConfig.getRelativeXPath() );
assertEquals( "contentdata/myrelated", dataEntryConfig.getXpath() );
assertTrue( dataEntryConfig.isMultiple() );
assertFalse( dataEntryConfig.isRequired() );
}
@Test
public void testParseRelatedContentInputConfigThatIsMultiple()
throws IOException, JDOMException
{
StringBuffer configXml = new StringBuffer();
configXml.append( "<config name=\"MyContentType\" version=\"1.0\">" );
configXml.append( " <form>" );
configXml.append( " <title name=\"myText\"/>" );
configXml.append( " <block name=\"TestBlock1\">" );
configXml.append( " <input name=\"myText\" required=\"true\" type=\"text\">" );
configXml.append( " <display>My text</display>" );
configXml.append( " <xpath>contentdata/mytext</xpath>" );
configXml.append( " </input>" );
configXml.append( " <input name=\"myRel\" type=\"relatedcontent\" multiple=\"true\">" );
configXml.append( " <display>My related</display>" );
configXml.append( " <xpath>contentdata/myrelated</xpath>" );
configXml.append( " </input>" );
configXml.append( " </block>" );
configXml.append( " </form>" );
configXml.append( "</config>" );
Element configEl = JDOMUtil.parseDocument( configXml.toString() ).getRootElement();
ContentTypeConfig config = ContentTypeConfigParser.parse( ContentHandlerName.CUSTOM, configEl );
RelatedContentDataEntryConfig dataEntryConfig = (RelatedContentDataEntryConfig) config.getInputConfig( "myRel" );
assertEquals( DataEntryConfigType.RELATEDCONTENT, dataEntryConfig.getType() );
assertEquals( "My related", dataEntryConfig.getDisplayName() );
assertEquals( "myRel", dataEntryConfig.getName() );
assertEquals( "contentdata/myrelated", dataEntryConfig.getRelativeXPath() );
assertEquals( "contentdata/myrelated", dataEntryConfig.getXpath() );
assertTrue( dataEntryConfig.isMultiple() );
assertFalse( dataEntryConfig.isRequired() );
}
@Test
public void testParseGroupBlock()
throws IOException, JDOMException
{
StringBuffer configXml = new StringBuffer();
configXml.append( "<config name=\"MyContentType\" version=\"1.0\">" );
configXml.append( " <form>" );
configXml.append( " <title name=\"myText\"/>" );
configXml.append( " <block name=\"TestBlock1\">" );
configXml.append( " <input name=\"myText\" required=\"true\" type=\"text\">" );
configXml.append( " <display>My text</display>" );
configXml.append( " <xpath>contentdata/mytext</xpath>" );
configXml.append( " </input>" );
configXml.append( " <input name=\"myRel\" type=\"relatedcontent\" multiple=\"true\">" );
configXml.append( " <display>My related</display>" );
configXml.append( " <xpath>contentdata/myrelated</xpath>" );
configXml.append( " </input>" );
configXml.append( " </block>" );
configXml.append( " <block name=\"inner\" group=\"contentdata/inner\">" );
configXml.append( " <input name=\"myInnerText\" type=\"text\">" );
configXml.append( " <display>My related</display>" );
configXml.append( " <xpath>innertext</xpath>" );
configXml.append( " </input>" );
configXml.append( " </block>" );
configXml.append( " </form>" );
configXml.append( "</config>" );
Element configEl = JDOMUtil.parseDocument( configXml.toString() ).getRootElement();
ContentTypeConfig contentTypeConfig = ContentTypeConfigParser.parse( ContentHandlerName.CUSTOM, configEl );
CtySetConfig innerSetConfig = contentTypeConfig.getSetConfig( "inner" );
assertNotNull( innerSetConfig );
assertEquals( "contentdata/inner", innerSetConfig.getRelativeXPath() );
assertEquals( "contentdata/inner", innerSetConfig.getGroupXPath() );
assertNotNull( innerSetConfig.getInputConfig( "myInnerText" ) );
assertNotNull( innerSetConfig.getInputConfigByRelativeXPath( "innertext" ) );
RelatedContentDataEntryConfig dataEntryConfig = (RelatedContentDataEntryConfig) contentTypeConfig.getInputConfig( "myRel" );
assertEquals( DataEntryConfigType.RELATEDCONTENT, dataEntryConfig.getType() );
assertEquals( "My related", dataEntryConfig.getDisplayName() );
assertEquals( "myRel", dataEntryConfig.getName() );
assertEquals( "contentdata/myrelated", dataEntryConfig.getRelativeXPath() );
assertEquals( "contentdata/myrelated", dataEntryConfig.getXpath() );
assertTrue( dataEntryConfig.isMultiple() );
assertFalse( dataEntryConfig.isRequired() );
}
@Test
public void parse_throws_exception_when_referred_input_field_for_title_is_not_required()
throws IOException, JDOMException
{
StringBuffer configXml = new StringBuffer();
configXml.append( "<config name=\"MyContentType\" version=\"1.0\">" );
configXml.append( " <form>" );
configXml.append( " <title name=\"myUnrequired\"/>" );
configXml.append( " <block name=\"TestBlock1\">" );
configXml.append( " <input name=\"myUnrequired\" required=\"false\" type=\"text\">" );
configXml.append( " <display>My unrequired</display>" );
configXml.append( " <xpath>contentdata/myunrequired</xpath>" );
configXml.append( " </input>" );
configXml.append( " </block>" );
configXml.append( " </form>" );
configXml.append( "</config>" );
Element configEl = JDOMUtil.parseDocument( configXml.toString() ).getRootElement();
try
{
ContentTypeConfigParser.parse( ContentHandlerName.CUSTOM, configEl );
}
catch ( Throwable e )
{
assertNotNull( e );
assertTrue( e instanceof InvalidContentTypeConfigException );
assertEquals( "Referred input field for title 'myUnrequired' must be configured to be required.", e.getMessage() );
}
}
@Test
public void parse_throws_exception_when_referred_related_input_field_is_missing_name_attribute()
throws IOException, JDOMException
{
StringBuffer configXml = new StringBuffer();
configXml.append( "<config name=\"MyContentType\" version=\"1.0\">" );
configXml.append( " <form>" );
configXml.append( " <title name=\"myUnrequired\"/>" );
configXml.append( " <block name='TestBlock1'>" );
configXml.append( " <input name='myUnrequired' required='true' type='text'>" );
configXml.append( " <display>My unrequired</display>" );
configXml.append( " <xpath>contentdata/myunrequired</xpath>" );
configXml.append( " </input>" );
configXml.append( " </block>" );
configXml.append( " <block name='TestGroupBlock' group='contentdata/myrelateds'>" );
configXml.append( " <input name='myRelated' required='false' type='relatedcontent'>" );
configXml.append( " <display>My related</display>" );
configXml.append( " <xpath>myrelated</xpath>" );
configXml.append( " <contenttype key=''/>" );
configXml.append( " </input>" );
configXml.append( " </block>" );
configXml.append( " </form>" );
configXml.append( "</config>" );
Element configEl = JDOMUtil.parseDocument( configXml.toString() ).getRootElement();
try
{
ContentTypeConfigParser.parse( ContentHandlerName.CUSTOM, configEl );
}
catch ( Throwable e )
{
assertNotNull( e );
assertTrue( e instanceof InvalidContentTypeConfigException );
assertEquals( "Missing name attribute for contenttype element in input config 'myRelated' in position: 1", e.getMessage() );
}
}
@Test
public void testParseConfigWithTitleAsDate()
throws IOException, JDOMException
{
StringBuffer configXml = new StringBuffer();
configXml.append( "<config name=\"MyContentType\" version=\"1.0\">" );
configXml.append( " <form>" );
configXml.append( " <title name=\"dateField\"/>" );
configXml.append( " <block name=\"TestBlock\">" );
configXml.append( " <input name=\"dateField\" required=\"true\" type=\"date\">" );
configXml.append( " <display>DateField</display>" );
configXml.append( " <xpath>contentdata/datefield</xpath>" );
configXml.append( " </input>" );
configXml.append( " </block>" );
configXml.append( " </form>" );
configXml.append( "</config>" );
Element configEl = JDOMUtil.parseDocument( configXml.toString() ).getRootElement();
ContentTypeConfig config = ContentTypeConfigParser.parse( ContentHandlerName.CUSTOM, configEl );
DataEntryConfig dataEntryConfig = config.getInputConfig( "dateField" );
DataEntryConfig titleInput = config.getForm().getTitleInput();
assertEquals( DataEntryConfigType.DATE, dataEntryConfig.getType() );
assertEquals( DataEntryConfigType.DATE, titleInput.getType() );
assertEquals( titleInput, dataEntryConfig );
assertTrue( titleInput instanceof DateDataEntryConfig );
}
@Test
public void testParseConfigWithIllegalDataTypeForTitle()
throws IOException, JDOMException
{
StringBuffer configXml = new StringBuffer();
configXml.append( "<config name=\"MyContentType\" version=\"1.0\">" );
configXml.append( " <form>" );
configXml.append( " <title name=\"textAreaField\"/>" );
configXml.append( " <block name=\"TestBlock\">" );
configXml.append( " <input name=\"textAreaField\" required=\"true\" type=\"textarea\">" );
configXml.append( " <display>TextAreaField</display>" );
configXml.append( " <xpath>contentdata/textareafield</xpath>" );
configXml.append( " </input>" );
configXml.append( " </block>" );
configXml.append( " </form>" );
configXml.append( "</config>" );
Element configEl = JDOMUtil.parseDocument( configXml.toString() ).getRootElement();
try
{
ContentTypeConfigParser.parse( ContentHandlerName.CUSTOM, configEl );
fail( "This config is not legal and should have thrown an exception because the title field is of type textarea." );
}
catch ( Throwable e )
{
assertNotNull( e );
assertTrue( e instanceof InvalidContentTypeConfigException );
assertEquals( "Illegal datatype for title. The title element must be of type text, url, date, radiobutton or dropdown.",
e.getMessage() );
}
}
}