/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.content.contentdata.custom; import org.jdom.Document; import org.joda.time.DateMidnight; import org.junit.Before; import org.junit.Test; import com.enonic.cms.framework.xml.XMLDocumentFactory; import com.enonic.cms.core.content.contentdata.custom.stringbased.HtmlAreaDataEntry; import com.enonic.cms.core.content.contentdata.custom.stringbased.TextDataEntry; import com.enonic.cms.core.content.contenttype.ContentHandlerEntity; 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.ContentTypeEntity; import static org.junit.Assert.*; /** * Mar 22, 2010 */ public class CustomContentDataModifierTest { private ContentHandlerEntity contentHandler; private ContentTypeConfig config; @Before public void before() { contentHandler = new ContentHandlerEntity(); contentHandler.setClassName( ContentHandlerName.CUSTOM.getHandlerClassShortName() ); ContentTypeEntity contentType = new ContentTypeEntity(); contentType.setContentHandler( contentHandler ); contentType.setData( createPersonContentTypeXml() ); config = contentType.getContentTypeConfig(); } @Test public void modify_existing_with_empty_ccd_do_not_change_anything() { // setup CustomContentData existing = new CustomContentData( config ); existing.add( new TextDataEntry( config.getInputConfig( "person-no" ), "1001" ) ); existing.add( new TextDataEntry( config.getInputConfig( "name" ), "Jørund Vier Skriubakken" ) ); // exercise CustomContentData newContentData = new CustomContentData( config ); CustomContentDataModifier modifier = new CustomContentDataModifier( existing ); CustomContentData modifiedContentData = modifier.modify( newContentData ); // verify assertEquals( "1001", ( (TextDataEntry) modifiedContentData.getEntry( "person-no" ) ).getValue() ); assertEquals( "Jørund Vier Skriubakken", ( (TextDataEntry) modifiedContentData.getEntry( "name" ) ).getValue() ); } @Test public void modify_existing_input_changes_only_that_input() { // setup CustomContentData existing = new CustomContentData( config ); existing.add( new TextDataEntry( config.getInputConfig( "person-no" ), "1001" ) ); existing.add( new TextDataEntry( config.getInputConfig( "name" ), "Jørund Vier Skriubakken" ) ); // exercise CustomContentData newContentData = new CustomContentData( config ); newContentData.add( new TextDataEntry( config.getInputConfig( "name" ), "Qhawe Bekhaizizwe Skriubakken" ) ); CustomContentDataModifier modifier = new CustomContentDataModifier( existing ); CustomContentData modifiedContentData = modifier.modify( newContentData ); // verify assertEquals( "1001", ( (TextDataEntry) modifiedContentData.getEntry( "person-no" ) ).getValue() ); assertEquals( "Qhawe Bekhaizizwe Skriubakken", ( (TextDataEntry) modifiedContentData.getEntry( "name" ) ).getValue() ); } @Test public void modified_gets_new_group_data_entry_when_new_has_one_entry() { CustomContentData existing = new CustomContentData( config ); existing.add( new TextDataEntry( config.getInputConfig( "name" ), "Jørund Vier Skriubakken" ) ); // exercise CustomContentData newContentData = new CustomContentData( config ); GroupDataEntry birth = new GroupDataEntry( "Events", "contentdata/events/event", 1 ); birth.setConfig( config.getSetConfig( "Events" ) ); birth.add( new TextDataEntry( config.getInputConfig( "event-name" ), "Birth" ) ); birth.add( new DateDataEntry( config.getInputConfig( "event-date" ), new DateMidnight( 1976, 4, 19 ).toDate() ) ); newContentData.add( birth ); CustomContentDataModifier modifier = new CustomContentDataModifier( existing ); modifier.addBlockGroupToPurge( "Events" ); CustomContentData modifiedContentData = modifier.modify( newContentData ); // verify GroupDataEntry modified = modifiedContentData.getGroupDataEntry( "Events", 1 ); assertNotNull( modified ); assertEquals( "Birth", ( (TextDataEntry) modified.getEntry( "event-name" ) ).getValue() ); assertNull( modifiedContentData.getGroupDataEntry( "Events", 2 ) ); } @Test public void modified_gets_new_group_data_entry_when_new_has_two_entries() { CustomContentData existing = new CustomContentData( config ); existing.add( new TextDataEntry( config.getInputConfig( "name" ), "Jørund Vier Skriubakken" ) ); // exercise CustomContentData newContentData = new CustomContentData( config ); GroupDataEntry newBirth = new GroupDataEntry( "Events", "contentdata/events/event", 1 ); newBirth.setConfig( config.getSetConfig( "Events" ) ); newBirth.add( new TextDataEntry( config.getInputConfig( "event-name" ), "Birth" ) ); newBirth.add( new DateDataEntry( config.getInputConfig( "event-date" ), new DateMidnight( 1976, 4, 19 ).toDate() ) ); newContentData.add( newBirth ); GroupDataEntry newMarriage = new GroupDataEntry( "Events", "contentdata/events/event", 2 ); newMarriage.setConfig( config.getSetConfig( "Events" ) ); newMarriage.add( new TextDataEntry( config.getInputConfig( "event-name" ), "Marriage" ) ); newMarriage.add( new DateDataEntry( config.getInputConfig( "event-date" ), new DateMidnight( 2008, 2, 14 ).toDate() ) ); newContentData.add( newMarriage ); CustomContentDataModifier modifier = new CustomContentDataModifier( existing ); modifier.addBlockGroupToPurge( "Events" ); CustomContentData modifiedContentData = modifier.modify( newContentData ); // verify GroupDataEntry first = modifiedContentData.getGroupDataEntry( "Events", 1 ); assertEquals( "Birth", ( (TextDataEntry) first.getEntry( "event-name" ) ).getValue() ); GroupDataEntry second = modifiedContentData.getGroupDataEntry( "Events", 2 ); assertEquals( "Marriage", ( (TextDataEntry) second.getEntry( "event-name" ) ).getValue() ); assertNull( modifiedContentData.getGroupDataEntry( "Events", 3 ) ); } @Test public void modify_with_existing_group_data_entries_and_changed_existing_ones() { CustomContentData existing = new CustomContentData( config ); existing.add( new TextDataEntry( config.getInputConfig( "name" ), "Jørund Vier Skriubakken" ) ); GroupDataEntry birth = new GroupDataEntry( "Events", "contentdata/events/event", 1 ); birth.setConfig( config.getSetConfig( "Events" ) ); birth.add( new TextDataEntry( config.getInputConfig( "event-name" ), "Birth" ) ); birth.add( new DateDataEntry( config.getInputConfig( "event-date" ), new DateMidnight( 1956, 4, 19 ).toDate() ) ); existing.add( birth ); GroupDataEntry marriage = new GroupDataEntry( "Events", "contentdata/events/event", 2 ); marriage.setConfig( config.getSetConfig( "Events" ) ); marriage.add( new TextDataEntry( config.getInputConfig( "event-name" ), "Birth" ) ); marriage.add( new DateDataEntry( config.getInputConfig( "event-date" ), new DateMidnight( 2001, 4, 19 ).toDate() ) ); existing.add( marriage ); // exercise CustomContentData newContentData = new CustomContentData( config ); GroupDataEntry newBirth = new GroupDataEntry( "Events", "contentdata/events/event", 1 ); newBirth.setConfig( config.getSetConfig( "Events" ) ); newBirth.add( new TextDataEntry( config.getInputConfig( "event-name" ), "Birth" ) ); newBirth.add( new DateDataEntry( config.getInputConfig( "event-date" ), new DateMidnight( 1976, 4, 19 ).toDate() ) ); newContentData.add( newBirth ); GroupDataEntry newMarriage = new GroupDataEntry( "Events", "contentdata/events/event", 2 ); newMarriage.setConfig( config.getSetConfig( "Events" ) ); newMarriage.add( new TextDataEntry( config.getInputConfig( "event-name" ), "Marriage" ) ); newMarriage.add( new DateDataEntry( config.getInputConfig( "event-date" ), new DateMidnight( 2008, 2, 14 ).toDate() ) ); newContentData.add( newMarriage ); CustomContentDataModifier modifier = new CustomContentDataModifier( existing ); modifier.addBlockGroupToPurge( "Events" ); CustomContentData modifiedContentData = modifier.modify( newContentData ); // verify GroupDataEntry first = modifiedContentData.getGroupDataEntry( "Events", 1 ); assertEquals( new DateMidnight( 1976, 4, 19 ).toDate(), ( (DateDataEntry) first.getEntry( "event-date" ) ).getValue() ); GroupDataEntry second = modifiedContentData.getGroupDataEntry( "Events", 2 ); assertEquals( new DateMidnight( 2008, 2, 14 ).toDate(), ( (DateDataEntry) second.getEntry( "event-date" ) ).getValue() ); assertNull( modifiedContentData.getGroupDataEntry( "Events", 3 ) ); } @Test public void modify_with_existing_group_data_entries_and_second_entry_changed() { CustomContentData existing = new CustomContentData( config ); existing.add( new TextDataEntry( config.getInputConfig( "name" ), "Jørund Vier Skriubakken" ) ); GroupDataEntry birth = new GroupDataEntry( "Events", "contentdata/events/event", 1 ); birth.setConfig( config.getSetConfig( "Events" ) ); birth.add( new TextDataEntry( config.getInputConfig( "event-name" ), "Birth" ) ); birth.add( new DateDataEntry( config.getInputConfig( "event-date" ), new DateMidnight( 1956, 4, 19 ).toDate() ) ); existing.add( birth ); GroupDataEntry marriage = new GroupDataEntry( "Events", "contentdata/events/event", 2 ); marriage.setConfig( config.getSetConfig( "Events" ) ); marriage.add( new TextDataEntry( config.getInputConfig( "event-name" ), "Marriage" ) ); marriage.add( new DateDataEntry( config.getInputConfig( "event-date" ), new DateMidnight( 2001, 2, 14 ).toDate() ) ); existing.add( marriage ); // exercise CustomContentData newContentData = new CustomContentData( config ); GroupDataEntry newMarriage = new GroupDataEntry( "Events", "contentdata/events/event", 2 ); newMarriage.setConfig( config.getSetConfig( "Events" ) ); newMarriage.add( new TextDataEntry( config.getInputConfig( "event-name" ), "Marriage" ) ); newMarriage.add( new DateDataEntry( config.getInputConfig( "event-date" ), new DateMidnight( 2008, 2, 14 ).toDate() ) ); newContentData.add( newMarriage ); CustomContentDataModifier modifier = new CustomContentDataModifier( existing ); CustomContentData modifiedContentData = modifier.modify( newContentData ); // verify GroupDataEntry first = modifiedContentData.getGroupDataEntry( "Events", 1 ); assertEquals( new DateMidnight( 1956, 4, 19 ).toDate(), ( (DateDataEntry) first.getEntry( "event-date" ) ).getValue() ); GroupDataEntry second = modifiedContentData.getGroupDataEntry( "Events", 2 ); assertEquals( new DateMidnight( 2008, 2, 14 ).toDate(), ( (DateDataEntry) second.getEntry( "event-date" ) ).getValue() ); assertNull( modifiedContentData.getGroupDataEntry( "Events", 3 ) ); } @Test public void missing_last_group_data_entry_removed_when_setup_to_purge() { // setup CustomContentData existing = new CustomContentData( config ); existing.add( new TextDataEntry( config.getInputConfig( "name" ), "Jørund Vier Skriubakken" ) ); GroupDataEntry birth = new GroupDataEntry( "Events", "contentdata/events/event", 1 ); birth.setConfig( config.getSetConfig( "Events" ) ); birth.add( new TextDataEntry( config.getInputConfig( "event-name" ), "Birth" ) ); birth.add( new DateDataEntry( config.getInputConfig( "event-date" ), new DateMidnight( 1976, 4, 19 ).toDate() ) ); existing.add( birth ); GroupDataEntry marriage = new GroupDataEntry( "Events", "contentdata/events/event", 2 ); marriage.setConfig( config.getSetConfig( "Events" ) ); marriage.add( new TextDataEntry( config.getInputConfig( "event-name" ), "Marriage" ) ); marriage.add( new DateDataEntry( config.getInputConfig( "event-date" ), new DateMidnight( 2008, 2, 14 ).toDate() ) ); existing.add( marriage ); CustomContentData newContentData = new CustomContentData( config ); newContentData.add( new TextDataEntry( config.getInputConfig( "name" ), "Jørund Vier Skriubakken" ) ); GroupDataEntry newBirth = new GroupDataEntry( "Events", "contentdata/events/event", 1 ); newBirth.setConfig( config.getSetConfig( "Events" ) ); newBirth.add( new TextDataEntry( config.getInputConfig( "event-name" ), "Birth" ) ); newBirth.add( new DateDataEntry( config.getInputConfig( "event-date" ), new DateMidnight( 1976, 4, 19 ).toDate() ) ); newContentData.add( newBirth ); // exercise CustomContentDataModifier modifier = new CustomContentDataModifier( existing ); modifier.addBlockGroupToPurge( "Events" ); CustomContentData modifiedContentData = modifier.modify( newContentData ); // verify GroupDataEntry modified = modifiedContentData.getGroupDataEntry( "Events", 1 ); assertEquals( "Birth", ( (TextDataEntry) modified.getEntry( "event-name" ) ).getValue() ); assertNull( modifiedContentData.getGroupDataEntry( "Events", 2 ) ); } @Test public void missing_middle_group_data_entry_removed_when_setup_to_purge() { // setup CustomContentData existing = new CustomContentData( config ); existing.add( new TextDataEntry( config.getInputConfig( "name" ), "Jørund Vier Skriubakken" ) ); GroupDataEntry birth = new GroupDataEntry( "Events", "contentdata/events/event", 1 ); birth.setConfig( config.getSetConfig( "Events" ) ); birth.add( new TextDataEntry( config.getInputConfig( "event-name" ), "Birth" ) ); birth.add( new DateDataEntry( config.getInputConfig( "event-date" ), new DateMidnight( 1976, 4, 19 ).toDate() ) ); existing.add( birth ); GroupDataEntry confirmation = new GroupDataEntry( "Events", "contentdata/events/event", 2 ); confirmation.setConfig( config.getSetConfig( "Events" ) ); confirmation.add( new TextDataEntry( config.getInputConfig( "event-name" ), "Confirmation" ) ); confirmation.add( new DateDataEntry( config.getInputConfig( "event-date" ), new DateMidnight( 1991, 4, 4 ).toDate() ) ); existing.add( confirmation ); GroupDataEntry marriage = new GroupDataEntry( "Events", "contentdata/events/event", 3 ); marriage.setConfig( config.getSetConfig( "Events" ) ); marriage.add( new TextDataEntry( config.getInputConfig( "event-name" ), "Marriage" ) ); marriage.add( new DateDataEntry( config.getInputConfig( "event-date" ), new DateMidnight( 2008, 2, 14 ).toDate() ) ); existing.add( marriage ); CustomContentData newContentData = new CustomContentData( config ); newContentData.add( new TextDataEntry( config.getInputConfig( "name" ), "Jørund Vier Skriubakken" ) ); GroupDataEntry newBirth = new GroupDataEntry( "Events", "contentdata/events/event", 1 ); newBirth.setConfig( config.getSetConfig( "Events" ) ); newBirth.add( new TextDataEntry( config.getInputConfig( "event-name" ), "Birth" ) ); newBirth.add( new DateDataEntry( config.getInputConfig( "event-date" ), new DateMidnight( 1976, 4, 19 ).toDate() ) ); newContentData.add( newBirth ); GroupDataEntry newMarriage = new GroupDataEntry( "Events", "contentdata/events/event", 3 ); newMarriage.setConfig( config.getSetConfig( "Events" ) ); newMarriage.add( new TextDataEntry( config.getInputConfig( "event-name" ), "Marriage" ) ); newMarriage.add( new DateDataEntry( config.getInputConfig( "event-date" ), new DateMidnight( 2008, 2, 14 ).toDate() ) ); newContentData.add( newMarriage ); // exercise CustomContentDataModifier modifier = new CustomContentDataModifier( existing ); modifier.addBlockGroupToPurge( "Events" ); CustomContentData modifiedContentData = modifier.modify( newContentData ); // verify GroupDataEntry actualEvent1 = modifiedContentData.getGroupDataEntry( "Events", 1 ); assertEquals( "Birth", ( (TextDataEntry) actualEvent1.getEntry( "event-name" ) ).getValue() ); GroupDataEntry actualEvent2 = modifiedContentData.getGroupDataEntry( "Events", 2 ); assertNotNull( actualEvent2 ); assertEquals( "Marriage", ( (TextDataEntry) actualEvent2.getEntry( "event-name" ) ).getValue() ); assertNull( modifiedContentData.getGroupDataEntry( "Events", 3 ) ); } @Test public void missing_first_group_data_entry_removed_when_setup_to_purge() { // setup CustomContentData existing = new CustomContentData( config ); existing.add( new TextDataEntry( config.getInputConfig( "name" ), "Jørund Vier Skriubakken" ) ); GroupDataEntry birth = new GroupDataEntry( "Events", "contentdata/events/event", 1 ); birth.setConfig( config.getSetConfig( "Events" ) ); birth.add( new TextDataEntry( config.getInputConfig( "event-name" ), "Birth" ) ); birth.add( new DateDataEntry( config.getInputConfig( "event-date" ), new DateMidnight( 1976, 4, 19 ).toDate() ) ); existing.add( birth ); GroupDataEntry confirmation = new GroupDataEntry( "Events", "contentdata/events/event", 2 ); confirmation.setConfig( config.getSetConfig( "Events" ) ); confirmation.add( new TextDataEntry( config.getInputConfig( "event-name" ), "Confirmation" ) ); confirmation.add( new DateDataEntry( config.getInputConfig( "event-date" ), new DateMidnight( 1991, 4, 4 ).toDate() ) ); existing.add( confirmation ); GroupDataEntry marriage = new GroupDataEntry( "Events", "contentdata/events/event", 3 ); marriage.setConfig( config.getSetConfig( "Events" ) ); marriage.add( new TextDataEntry( config.getInputConfig( "event-name" ), "Marriage" ) ); marriage.add( new DateDataEntry( config.getInputConfig( "event-date" ), new DateMidnight( 2008, 2, 14 ).toDate() ) ); existing.add( marriage ); CustomContentData newContentData = new CustomContentData( config ); newContentData.add( new TextDataEntry( config.getInputConfig( "name" ), "Jørund Vier Skriubakken" ) ); GroupDataEntry newConfirmation = new GroupDataEntry( "Events", "contentdata/events/event", 2 ); newConfirmation.setConfig( config.getSetConfig( "Events" ) ); newConfirmation.add( new TextDataEntry( config.getInputConfig( "event-name" ), "Confirmation" ) ); newConfirmation.add( new DateDataEntry( config.getInputConfig( "event-date" ), new DateMidnight( 1991, 4, 4 ).toDate() ) ); newContentData.add( newConfirmation ); GroupDataEntry newMarriage = new GroupDataEntry( "Events", "contentdata/events/event", 3 ); newMarriage.setConfig( config.getSetConfig( "Events" ) ); newMarriage.add( new TextDataEntry( config.getInputConfig( "event-name" ), "Marriage" ) ); newMarriage.add( new DateDataEntry( config.getInputConfig( "event-date" ), new DateMidnight( 2008, 2, 14 ).toDate() ) ); newContentData.add( newMarriage ); // exercise CustomContentDataModifier modifier = new CustomContentDataModifier( existing ); modifier.addBlockGroupToPurge( "Events" ); CustomContentData modifiedContentData = modifier.modify( newContentData ); // verify GroupDataEntry actualEvent1 = modifiedContentData.getGroupDataEntry( "Events", 1 ); GroupDataEntry actualEvent2 = modifiedContentData.getGroupDataEntry( "Events", 2 ); assertNotNull( actualEvent1 ); assertNotNull( actualEvent2 ); assertEquals( "Confirmation", ( (TextDataEntry) actualEvent1.getEntry( "event-name" ) ).getValue() ); assertEquals( "Marriage", ( (TextDataEntry) actualEvent2.getEntry( "event-name" ) ).getValue() ); assertNull( modifiedContentData.getGroupDataEntry( "Events", 3 ) ); } //@Test public void htmlarea_equals() { // setup content type ContentTypeConfigBuilder ctyconf = new ContentTypeConfigBuilder( "MyContent", "title" ); ctyconf.startBlock( "MyContent" ); ctyconf.addInput( "title", "text", "contentdata/title", "Title", true ); ctyconf.addInput( "htmlarea", "htmlarea", "contentdata/htmlarea", "Htmlarea", false ); ctyconf.endBlock(); Document configAsJDOMDocument = XMLDocumentFactory.create( ctyconf.toString() ).getAsJDOMDocument(); ContentTypeEntity contentType = new ContentTypeEntity(); contentType.setContentHandler( contentHandler ); contentType.setData( configAsJDOMDocument ); config = contentType.getContentTypeConfig(); CustomContentData existingContentData = new CustomContentData( config ); existingContentData.add( new TextDataEntry( config.getInputConfig( "title" ), "One" ) ); existingContentData.add( new HtmlAreaDataEntry( config.getInputConfig( "htmlarea" ), null ) ); // exercise CustomContentData newContentData = new CustomContentData( config ); newContentData.add( new TextDataEntry( config.getInputConfig( "title" ), "One" ) ); newContentData.add( new HtmlAreaDataEntry( config.getInputConfig( "htmlarea" ), "" ) ); CustomContentDataModifier modifier = new CustomContentDataModifier( existingContentData ); CustomContentData modifiedContentData = modifier.modify( newContentData ); // verify HtmlAreaDataEntry existingHtmlArea = (HtmlAreaDataEntry) existingContentData.getEntry( "htmlarea" ); HtmlAreaDataEntry newHtmlArea = (HtmlAreaDataEntry) newContentData.getEntry( "htmlarea" ); HtmlAreaDataEntry modifiedHtmlArea = (HtmlAreaDataEntry) modifiedContentData.getEntry( "htmlarea" ); assertNotNull( modifiedHtmlArea ); assertEquals( existingContentData, newContentData ); assertEquals( newContentData, modifiedContentData ); } private Document createPersonContentTypeXml() { StringBuffer xml = new StringBuffer(); xml.append( "<moduledata>" ); xml.append( "<config name='PersonType' version='1.0'>" ); xml.append( " <form>" ); xml.append( " <title name='name'/>" ); xml.append( " <block name='Person'>" ); xml.append( " <input name='person-no' required='true' type='text'>" ); xml.append( " <display>Person number</display>" ); xml.append( " <xpath>contentdata/person-no</xpath>" ); xml.append( " </input>" ); xml.append( " <input name='name' required='true' type='text'>" ); xml.append( " <display>Name</display>" ); xml.append( " <xpath>contentdata/name</xpath>" ); xml.append( " </input>" ); xml.append( " </block>" ); xml.append( " <block name='Events' group='contentdata/events/event'>" ); xml.append( " <input name='event-name' required='true' type='text'>" ); xml.append( " <display>Name</display>" ); xml.append( " <xpath>name</xpath>" ); xml.append( " </input>" ); xml.append( " <input name='event-date' required='true' type='date'>" ); xml.append( " <display>Date</display>" ); xml.append( " <xpath>date</xpath>" ); xml.append( " </input>" ); xml.append( " </block>" ); xml.append( " </form>" ); xml.append( "</config>" ); xml.append( "</moduledata>" ); return XMLDocumentFactory.create( xml.toString() ).getAsJDOMDocument(); } }