/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.search.builder; import java.util.ArrayList; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.List; import java.util.Set; import org.apache.commons.lang.StringUtils; import org.junit.Test; import junit.framework.Assert; import com.enonic.cms.core.content.ContentEntity; import com.enonic.cms.core.content.ContentKey; import com.enonic.cms.core.content.ContentLocationSpecification; import com.enonic.cms.core.content.ContentLocations; import com.enonic.cms.core.content.category.CategoryKey; import com.enonic.cms.core.content.contenttype.ContentTypeKey; import com.enonic.cms.core.content.index.BigText; import com.enonic.cms.core.search.query.ContentDocument; import com.enonic.cms.core.structure.SiteEntity; 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.menuitem.section.SectionContentEntity; import com.enonic.cms.core.structure.menuitem.section.SectionContentKey; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.fail; /** * Created by IntelliJ IDEA. * User: rmh * Date: 11/23/11 * Time: 11:54 AM */ public class ContentIndexDataFactoryTest extends IndexFieldNameConstants { ContentIndexDataFactory contentIndexDataFactory = new ContentIndexDataFactory(); @Test public void testMetadata() throws Exception { ContentDocument content = createTestContent(); ContentIndexData indexData = contentIndexDataFactory.create( content ); final String indexDataAsString = indexData.getContentDataAsJsonString(); System.out.println( indexDataAsString ); final String[] expectedFields = new String[]{"key", "key.number", "categorykey", "categorykey.number", "title", "contenttypekey", "priority", "publishfrom", "status", "title", "language"}; for ( String field : expectedFields ) { assertTrue( "Missing required field: " + field, indexDataAsString.contains( field ) ); } } @Test public void testUserFields() throws Exception { ContentDocument content = createTestContent(); ContentIndexData indexData = contentIndexDataFactory.create( content ); verifyFieldName( indexData, "data_person_age" ); verifyFieldName( indexData, "data_person_age.number" ); verifyFieldName( indexData, "data_person_description" ); } protected void verifyFieldName( ContentIndexData contentIndexData, String fieldName ) { for ( ContentIndexDataElement contentIndexDataElement : contentIndexData.getContentIndexDataElements() ) { final Set<ContentIndexDataFieldAndValue> contentIndexDataFieldAndValues = ContentIndexDataFieldValueSetFactory.create( contentIndexDataElement ); final Set<ContentIndexDataFieldAndValue> allFieldAndValuesForElement = contentIndexDataFieldAndValues; for ( ContentIndexDataFieldAndValue value : allFieldAndValuesForElement ) { if ( value.getFieldName().equals( fieldName ) ) { return; } } } fail( "ContentData did not contain : " + fieldName ); } @Test public void testNumericValues() throws Exception { ContentDocument content = createTestContent(); ContentIndexData indexData = contentIndexDataFactory.create( content, false ); final String indexDataAsString = indexData.getContentDataAsJsonString(); System.out.println( indexDataAsString ); final List<String> keysAsList = getKeysAsList( indexDataAsString ); verifyFieldExists( keysAsList, "key" ); verifyFieldExists( keysAsList, "status" ); verifyFieldExists( keysAsList, "priority" ); verifyFieldExists( keysAsList, "data_person_age" ); } private void verifyFieldExists( List<String> keysAsList, String keyName ) { Assert.assertTrue( "Missing key: " + keyName, keysAsList.contains( keyName ) ); } private void verifyFieldDoesNotExists( List<String> keysAsList, String keyName ) { Assert.assertFalse( "Redundant key: " + keyName, keysAsList.contains( keyName ) ); } @Test public void testAttachmentData() throws Exception { ContentDocument content = createTestContent(); final String binaryText = "This is a binary text"; content.setBinaryExtractedText( new BigText( binaryText ) ); ContentIndexData indexData = contentIndexDataFactory.create( content ); final Set<ContentIndexDataElement> binaryDataElements = indexData.getBinaryDataElements(); assertEquals( 2, binaryDataElements.size() ); final String indexDataAsString = indexData.getBinaryDataAsJsonString(); final List<String> keysAsList = getKeysAsList( indexDataAsString ); verifyFieldExists( keysAsList, "key" ); verifyFieldExists( keysAsList, "key.number" ); verifyFieldExists( keysAsList, "attachment" ); } @Test public void testContentLocations() throws Exception { ContentDocument contentDocument = createTestContent(); ContentEntity content = new ContentEntity(); content.setKey( new ContentKey( "1" ) ); SiteEntity site = new SiteEntity(); site.setKey( 1 ); site.setName( "site1" ); SectionContentEntity sectionContent1 = createSectionContent( site, content, 1, true ); SectionContentEntity sectionContent2 = createSectionContent( site, content, 2, true ); SectionContentEntity sectionContent3 = createSectionContent( site, content, 3, false ); content.addSectionContent( sectionContent1 ); content.addSectionContent( sectionContent2 ); content.addSectionContent( sectionContent3 ); ContentLocationSpecification spec = new ContentLocationSpecification(); spec.setSiteKey( new SiteKey( 1 ) ); spec.setIncludeInactiveLocationsInSection( true ); contentDocument.setContentLocations( content.getLocations( spec ) ); assertEquals( 3, contentDocument.getContentLocations().numberOfLocations() ); ContentIndexData indexData = contentIndexDataFactory.create( contentDocument ); final Set<ContentIndexDataElement> contentData = indexData.getContentIndexDataElements(); verifyFieldName( indexData, CONTENTLOCATION_APPROVED_FIELDNAME ); verifyFieldName( indexData, CONTENTLOCATION_UNAPPROVED_FIELDNAME ); } private SectionContentEntity createSectionContent( SiteEntity site, ContentEntity content, int sectionKey, boolean approved ) { MenuItemEntity menuItem = new MenuItemEntity(); menuItem.setSite( site ); menuItem.setKey( new MenuItemKey( sectionKey ) ); menuItem.setName( "menu" + sectionKey ); SectionContentEntity sectionContent = new SectionContentEntity(); sectionContent.setKey( new SectionContentKey( sectionKey ) ); sectionContent.setContent( content ); sectionContent.setMenuItem( menuItem ); sectionContent.setApproved( approved ); return sectionContent; } private List<String> getKeysAsList( String indexData ) { final String[] split = StringUtils.split( indexData, "," ); List<String> keys = new ArrayList<String>(); for ( int i = 0; i < split.length; i++ ) { final String keyValue = split[i]; final String cleaned = keyValue.replace( "\"", "" ).replace( "{", "" ).replace( "}", "" ); final String[] keyValueArray = StringUtils.split( cleaned, ":" ); keys.add( keyValueArray[0] ); } return keys; } private ContentDocument createTestContent() throws Exception { final GregorianCalendar date = new GregorianCalendar( 2011, Calendar.JANUARY, 10 ); ContentDocument content = new ContentDocument( new ContentKey( 1 ) ); content.setCategoryKey( new CategoryKey( 2 ) ); content.setCategoryName( "MyCategory" ); content.setContentTypeKey( new ContentTypeKey( 3 ) ); content.setContentTypeName( "MyContentType" ); content.setCreated( date.getTime() ); content.setTimestamp( date.getTime() ); content.setModified( date.getTime() ); content.setTitle( "MyTitle" ); content.setStatus( 2 ); content.setPriority( 1 ); content.setLanguageCode( "en" ); content.setModifierKey( "10" ); content.setModifierName( "ModifierName" ); content.setModifierQualifiedName( "ModifierQName" ); content.setOwnerKey( "11" ); content.setOwnerName( "OwnerName" ); content.setOwnerQualifiedName( "OwnerQName" ); content.setAssigneeKey( "12" ); content.setAssigneeName( "AssigneeName" ); content.setAssigneeQualifiedName( "AssigneeQName" ); content.setAssignerKey( "14" ); content.setAssignerName( "AssignerName" ); content.setAssignerQualifiedName( "AssignerQName" ); date.add( Calendar.MONTH, 1 ); content.setAssignmentDueDate( date.getTime() ); content.setPublishFrom( date.getTime() ); date.add( Calendar.MONTH, 1 ); content.setPublishTo( date.getTime() ); content.setContentLocations( new ContentLocations( new ContentEntity() ) ); content.addUserDefinedField( "data/person/age", "38" ); content.addUserDefinedField( "data/person/gender", "male" ); content.addUserDefinedField( "data/person/description", "description 38" ); content.addUserDefinedField( "data/person/age", "28" ); content.addUserDefinedField( "data/person/gender", "male" ); content.addUserDefinedField( "data/person/description", "description 28" ); content.addUserDefinedField( "data/person/age", "10" ); content.addUserDefinedField( "data/person/gender", "male" ); content.addUserDefinedField( "data/person/description", "description 10" ); return content; } }