/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.content.contentdata.custom;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.junit.Before;
import org.junit.Test;
import com.enonic.cms.framework.util.JDOMUtil;
import com.enonic.cms.core.content.contentdata.custom.stringbased.SelectorDataEntry;
import com.enonic.cms.core.content.contentdata.custom.stringbased.TextAreaDataEntry;
import com.enonic.cms.core.content.contentdata.custom.stringbased.TextDataEntry;
import com.enonic.cms.core.content.contentdata.custom.stringbased.UrlDataEntry;
import com.enonic.cms.core.content.contenttype.ContentHandlerName;
import com.enonic.cms.core.content.contenttype.ContentTypeConfig;
import com.enonic.cms.core.content.contenttype.ContentTypeConfigBuilder;
import com.enonic.cms.core.content.contenttype.ContentTypeConfigParser;
import com.enonic.cms.core.content.contenttype.dataentryconfig.DataEntryConfig;
import com.enonic.cms.core.content.contenttype.dataentryconfig.TextAreaDataEntryConfig;
import com.enonic.cms.core.content.contenttype.dataentryconfig.TextDataEntryConfig;
import com.enonic.cms.core.content.contenttype.dataentryconfig.UrlDataEntryConfig;
import static org.junit.Assert.*;
public class CustomContentDataTest
{
private Element standardConfigEl;
@Before
public void before()
throws IOException, JDOMException
{
StringBuffer standardConfigXml = new StringBuffer();
standardConfigXml.append( "<config name=\"MyContentType\" version=\"1.0\">" );
standardConfigXml.append( " <form>" );
standardConfigXml.append( " <title name=\"myTitle\"/>" );
standardConfigXml.append( " <block name=\"TestBlock1\">" );
standardConfigXml.append( " <input name=\"myTitle\" required=\"true\" type=\"text\">" );
standardConfigXml.append( " <display>My title</display>" );
standardConfigXml.append( " <xpath>contentdata/mytitle</xpath>" );
standardConfigXml.append( " </input>" );
standardConfigXml.append( " <input name=\"myTextarea\" type=\"textarea\">" );
standardConfigXml.append( " <display>My textarea</display>" );
standardConfigXml.append( " <xpath>contentdata/mytextarea</xpath>" );
standardConfigXml.append( " <help>My text area help text</help>" );
standardConfigXml.append( " </input>" );
standardConfigXml.append( " <input name=\"myXml\" type=\"xml\">" );
standardConfigXml.append( " <display>My xml</display>" );
standardConfigXml.append( " <xpath>contentdata/myxml</xpath>" );
standardConfigXml.append( " </input>" );
standardConfigXml.append( " <input name=\"myHtmlareaDefault\" type=\"htmlarea\">" );
standardConfigXml.append( " <display>My htmlarea default</display>" );
standardConfigXml.append( " <xpath>contentdata/myhtmlareadefault</xpath>" );
standardConfigXml.append( " </input>" );
standardConfigXml.append( " <input name=\"myHtmlareaXhtml\" type=\"htmlarea\" mode=\"xhtml\">" );
standardConfigXml.append( " <display>My htmlarea xhtml</display>" );
standardConfigXml.append( " <xpath>contentdata/myhtmlareaxhtml</xpath>" );
standardConfigXml.append( " </input>" );
standardConfigXml.append( " <input name=\"myHtmlareaCdata\" type=\"htmlarea\" mode=\"cdata\">" );
standardConfigXml.append( " <display>My htmlarea cdata</display>" );
standardConfigXml.append( " <xpath>contentdata/myhtmlareacdata</xpath>" );
standardConfigXml.append( " </input>" );
standardConfigXml.append( " <input name=\"myUrl\" type=\"url\">" );
standardConfigXml.append( " <display>My url</display>" );
standardConfigXml.append( " <xpath>contentdata/myurl</xpath>" );
standardConfigXml.append( " </input>" );
standardConfigXml.append( " <input name=\"myDate\" type=\"date\">" );
standardConfigXml.append( " <display>My date</display>" );
standardConfigXml.append( " <xpath>contentdata/mydate</xpath>" );
standardConfigXml.append( " </input>" );
standardConfigXml.append( " <input name=\"myCheckbox\" type=\"checkbox\">" );
standardConfigXml.append( " <display>My checkbox</display>" );
standardConfigXml.append( " <xpath>contentdata/mycheckbox</xpath>" );
standardConfigXml.append( " </input>" );
standardConfigXml.append( " <input name=\"myRadiobutton\" type=\"radiobutton\">" );
standardConfigXml.append( " <display>My radio button</display>" );
standardConfigXml.append( " <xpath>contentdata/myradiobutton</xpath>" );
standardConfigXml.append( " <options>" );
standardConfigXml.append( " <option value=\"5\" checked=\"true\">Fem</option>" );
standardConfigXml.append( " <option value=\"10\">Ti</option>" );
standardConfigXml.append( " </options>" );
standardConfigXml.append( " </input>" );
standardConfigXml.append( " <input name=\"myDropdown\" type=\"dropdown\">" );
standardConfigXml.append( " <display>My dropdown</display>" );
standardConfigXml.append( " <xpath>contentdata/mydropdown</xpath>" );
standardConfigXml.append( " <options>" );
standardConfigXml.append( " <option value=\"1\" checked=\"true\">Toyota</option>" );
standardConfigXml.append( " <option value=\"2\">Opel</option>" );
standardConfigXml.append( " <option value=\"3\">Skoda</option>" );
standardConfigXml.append( " </options>" );
standardConfigXml.append( " </input>" );
standardConfigXml.append( " <input name=\"myRelatedSingle\" type=\"relatedcontent\" multiple=\"false\">" );
standardConfigXml.append( " <display>My related single</display>" );
standardConfigXml.append( " <xpath>contentdata/myrelatedsingle</xpath>" );
standardConfigXml.append( " <contenttype name=\"MyContentType\"/>" );
standardConfigXml.append( " </input>" );
standardConfigXml.append( " <input name=\"myRelatedMultiple\" type=\"relatedcontent\" multiple=\"true\">" );
standardConfigXml.append( " <display>My related multipe</display>" );
standardConfigXml.append( " <xpath>contentdata/myrelatedmultiple</xpath>" );
standardConfigXml.append( " </input>" );
standardConfigXml.append( " <input name=\"myFile\" type=\"file\">" );
standardConfigXml.append( " <display>My file</display>" );
standardConfigXml.append( " <xpath>contentdata/myfile</xpath>" );
standardConfigXml.append( " </input>" );
standardConfigXml.append( " <input name=\"myImage\" type=\"image\">" );
standardConfigXml.append( " <display>My image</display>" );
standardConfigXml.append( " <xpath>contentdata/myimage</xpath>" );
standardConfigXml.append( " </input>" );
standardConfigXml.append( " <input name=\"myBinaryfile\" type=\"uploadfile\">" );
standardConfigXml.append( " <display>My binaryfile</display>" );
standardConfigXml.append( " <xpath>contentdata/mybinaryfile</xpath>" );
standardConfigXml.append( " </input>" );
standardConfigXml.append( " <input name=\"myMchoiceInput\" type=\"multiplechoice\">" );
standardConfigXml.append( " <display>Question</display>" );
standardConfigXml.append( " <displayalternatives>Alternatives</displayalternatives>" );
standardConfigXml.append( " <newbuttontext>New alternative</newbuttontext>" );
standardConfigXml.append( " <column2text>Answer</column2text>" );
standardConfigXml.append( " <xpath>contentdata/question</xpath>" );
standardConfigXml.append( " </input>" );
standardConfigXml.append( " </block>" );
standardConfigXml.append( " <block name=\"JustAnotherBlock\">" );
standardConfigXml.append( " <input name=\"justAnotherTitle\" required=\"false\" type=\"text\">" );
standardConfigXml.append( " <display>Just Another title</display>" );
standardConfigXml.append( " <xpath>contentdata/justanothertitle</xpath>" );
standardConfigXml.append( " </input>" );
standardConfigXml.append( " <input name=\"justAnotherUrl\" required=\"false\" type=\"url\">" );
standardConfigXml.append( " <display>Just Another url</display>" );
standardConfigXml.append( " <xpath>contentdata/justanotherurl</xpath>" );
standardConfigXml.append( " </input>" );
standardConfigXml.append( " </block>" );
standardConfigXml.append( " </form>" );
standardConfigXml.append( "</config>" );
standardConfigEl = JDOMUtil.parseDocument( standardConfigXml.toString() ).getRootElement();
}
@Test
public void testAddDataEntryOfWrongType()
{
ContentTypeConfig config = ContentTypeConfigParser.parse( ContentHandlerName.CUSTOM, standardConfigEl );
CustomContentData contentData = new CustomContentData( config );
try
{
UrlDataEntryConfig urlDataConfig = new UrlDataEntryConfig( "myTitle", false, "My title", "contentdata/mytitle", 100 );
contentData.add( new UrlDataEntry( urlDataConfig, "Hallo" ) );
fail( "Expected IllegalArgumentException" );
}
catch ( IllegalArgumentException e )
{
// ok
}
}
@Test
public void testGetEntries()
{
ContentTypeConfig config = ContentTypeConfigParser.parse( ContentHandlerName.CUSTOM, standardConfigEl );
CustomContentData contentData = new CustomContentData( config );
TextDataEntryConfig titleConfig1 = new TextDataEntryConfig( "myTitle", true, "My title", "contentdata/mytitle" );
UrlDataEntryConfig urlDataConfig1 = new UrlDataEntryConfig( "myUrl", false, "My url", "contentdata/myurl", 100 );
TextDataEntryConfig titleConfig2 =
new TextDataEntryConfig( "justAnotherTitle", true, "Just another title", "contentdata/justanothertitle" );
UrlDataEntryConfig urlDataConfig2 =
new UrlDataEntryConfig( "justAnotherUrl", false, "Just another url", "contentdata/justanotherurl", 100 );
contentData.add( new TextDataEntry( titleConfig1, "Hallo" ) );
contentData.add( new UrlDataEntry( urlDataConfig1, "http://www.bg.no" ) );
contentData.add( new TextDataEntry( titleConfig2, "Just another hallo" ) );
contentData.add( new UrlDataEntry( urlDataConfig2, "http://www.justanother.no" ) );
List<DataEntry> entries = contentData.getEntries();
assertEquals( 4, entries.size() );
}
@Test
public void testAddTextDataEntry()
{
ContentTypeConfig config = ContentTypeConfigParser.parse( ContentHandlerName.CUSTOM, standardConfigEl );
CustomContentData contentData = new CustomContentData( config );
contentData.add( new TextDataEntry( config.getInputConfig( "myTitle" ), "Hallo" ) );
TextDataEntry dataEntry = (TextDataEntry) contentData.getEntry( "myTitle" );
assertNotNull( dataEntry );
assertEquals( "myTitle", dataEntry.getName() );
assertEquals( "Hallo", dataEntry.getValue() );
}
@Test
public void testAddRadiobuttonDataEntry()
{
ContentTypeConfig config = ContentTypeConfigParser.parse( ContentHandlerName.CUSTOM, standardConfigEl );
CustomContentData contentData = new CustomContentData( config );
contentData.add( new SelectorDataEntry( config.getInputConfig( "myRadiobutton" ), "10" ) );
SelectorDataEntry dataEntry = (SelectorDataEntry) contentData.getEntry( "myRadiobutton" );
assertNotNull( dataEntry );
assertEquals( "myRadiobutton", dataEntry.getName() );
assertEquals( "10", dataEntry.getValue() );
}
@Test
public void testAddMultipleChoiceDataEntry()
{
ContentTypeConfig config = ContentTypeConfigParser.parse( ContentHandlerName.CUSTOM, standardConfigEl );
CustomContentData contentData = new CustomContentData( config );
DataEntryConfig choiceConfig = config.getInputConfig( "myMchoiceInput" );
List<MultipleChoiceAlternative> alts = new LinkedList<MultipleChoiceAlternative>();
alts.add( new MultipleChoiceAlternative( "1996", true ) );
alts.add( new MultipleChoiceAlternative( "1998", false ) );
alts.add( new MultipleChoiceAlternative( "1999", false ) );
alts.add( new MultipleChoiceAlternative( "2000", false ) );
contentData.add( new MultipleChoiceDataEntry( choiceConfig, "Når ble Enonic grunnlagt?", alts ) );
MultipleChoiceDataEntry dataEntry = (MultipleChoiceDataEntry) contentData.getEntry( "myMchoiceInput" );
assertNotNull( dataEntry );
assertEquals( "myMchoiceInput", dataEntry.getName() );
assertEquals( "Når ble Enonic grunnlagt?", dataEntry.getText() );
assertEquals( 4, dataEntry.getAlternatives().size() );
}
@Test
public void testAddUrlDataEntry()
{
ContentTypeConfig config = ContentTypeConfigParser.parse( ContentHandlerName.CUSTOM, standardConfigEl );
CustomContentData contentData = new CustomContentData( config );
UrlDataEntryConfig urlDataConfig = new UrlDataEntryConfig( "myUrl", false, "My url", "contentdata/myurl", 100 );
contentData.add( new UrlDataEntry( urlDataConfig, "http://www.bg.no" ) );
UrlDataEntry dataEntry = (UrlDataEntry) contentData.getEntry( "myUrl" );
assertNotNull( dataEntry );
assertEquals( "myUrl", dataEntry.getName() );
assertEquals( "http://www.bg.no", dataEntry.getValue() );
}
@Test
public void testAddTwoEntries()
{
ContentTypeConfig config = ContentTypeConfigParser.parse( ContentHandlerName.CUSTOM, standardConfigEl );
CustomContentData contentData = new CustomContentData( config );
TextDataEntryConfig titleConfig = new TextDataEntryConfig( "myTitle", true, "My title", "contentdata/mytitle" );
TextAreaDataEntryConfig textAreaConfig =
new TextAreaDataEntryConfig( "myTextarea", false, "My text area", "contentdata/mytextarea" );
contentData.add( new TextDataEntry( titleConfig, "x" ) );
contentData.add( new TextAreaDataEntry( textAreaConfig, "x" ) );
DataEntry dataEntry1 = contentData.getEntry( "myTitle" );
assertNotNull( dataEntry1 );
assertEquals( "myTitle", dataEntry1.getName() );
DataEntry dataEntry2 = contentData.getEntry( "myTextarea" );
assertNotNull( dataEntry2 );
assertEquals( "myTextarea", dataEntry2.getName() );
}
@Test
public void validatingChecksGroupPositions()
throws IOException, JDOMException
{
ContentTypeConfigBuilder ctyBuilder = new ContentTypeConfigBuilder( "MyContentType", "myTitle" );
ctyBuilder.startBlock( "General" );
ctyBuilder.addInput( "myTitle", "text", "contentdata/mytitle", "My Title", true );
ctyBuilder.endBlock();
ctyBuilder.startBlock( "MyGroup", "contentdata/mygroup" );
ctyBuilder.addInput( "myGroupEntryRequiredField1", "text", "my-group-entry-field-1", "myGroupEntryRequiredField1", true );
ctyBuilder.addInput( "myGroupEntryRequiredField2", "text", "my-group-entry-field-2", "myGroupEntryRequiredField2", false );
ctyBuilder.endBlock();
Element configEl = JDOMUtil.parseDocument( ctyBuilder.toString() ).getRootElement().getChild( "config" );
ContentTypeConfig config = ContentTypeConfigParser.parse( ContentHandlerName.CUSTOM, configEl );
CustomContentData contentData = new CustomContentData( config );
contentData.add( new TextDataEntry( config.getInputConfig( "myTitle" ), "value 1" ) );
GroupDataEntry groupDataEntry = new GroupDataEntry( "MyGroup", "contentdata/mygroup", 1 );
groupDataEntry.setConfig( config.getSetConfig( "MyGroup" ) );
groupDataEntry.add( new TextDataEntry( config.getInputConfig( "myGroupEntryRequiredField1" ), "value 2" ) );
contentData.add( groupDataEntry );
contentData.validate();
}
}