/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.itest.store.dao;
import java.util.Date;
import org.jdom.Document;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import com.enonic.cms.framework.xml.XMLDocumentFactory;
import com.enonic.cms.core.content.ContentKey;
import com.enonic.cms.core.content.ContentService;
import com.enonic.cms.core.content.ContentStatus;
import com.enonic.cms.core.content.category.CategoryEntity;
import com.enonic.cms.core.content.command.CreateContentCommand;
import com.enonic.cms.core.content.contentdata.custom.CustomContentData;
import com.enonic.cms.core.content.contentdata.custom.stringbased.TextDataEntry;
import com.enonic.cms.core.content.contenttype.ContentHandlerName;
import com.enonic.cms.core.content.contenttype.ContentTypeConfigBuilder;
import com.enonic.cms.core.content.contenttype.ContentTypeEntity;
import com.enonic.cms.core.content.contenttype.dataentryconfig.TextDataEntryConfig;
import com.enonic.cms.core.resource.ResourceKey;
import com.enonic.cms.core.security.user.UserKey;
import com.enonic.cms.core.structure.RunAsType;
import com.enonic.cms.core.structure.SiteEntity;
import com.enonic.cms.core.structure.menuitem.MenuItemEntity;
import com.enonic.cms.core.structure.page.template.PageTemplateEntity;
import com.enonic.cms.core.structure.page.template.PageTemplateType;
import com.enonic.cms.core.structure.portlet.PortletEntity;
import com.enonic.cms.itest.AbstractSpringTest;
import com.enonic.cms.itest.util.DomainFactory;
import com.enonic.cms.itest.util.DomainFixture;
import com.enonic.cms.store.dao.ResourceUsageDao;
import static org.junit.Assert.*;
public class ResourceUsageDaoTest
extends AbstractSpringTest
{
private DomainFactory factory;
@Autowired
private DomainFixture fixture;
@Autowired
private ResourceUsageDao resourceUsageDao;
@Autowired
private ContentService contentService;
@Before
public void setUp()
throws Exception
{
factory = fixture.getFactory();
// setup needed common data for each test
fixture.initSystemData();
fixture.save( factory.createContentHandler( "Custom content", ContentHandlerName.CUSTOM.getHandlerClassShortName() ) );
fixture.flushAndClearHibernateSession();
// Create an article conent type that will be used in the section:
ContentTypeConfigBuilder ctyconf = new ContentTypeConfigBuilder( "article", "heading" );
ctyconf.startBlock( "intro" );
ctyconf.addInput( "heading", "text", "contentdata/intro/heading", "heading", true );
ctyconf.addInput( "teaser", "text", "contentdata/intro/teaser", "teaser" );
ctyconf.endBlock();
Document configAsXmlBytes = XMLDocumentFactory.create( ctyconf.toString() ).getAsJDOMDocument();
final ContentTypeEntity contentTypeEntity =
factory.createContentType( "MenuItem", ContentHandlerName.CUSTOM.getHandlerClassShortName(), configAsXmlBytes );
contentTypeEntity.setDefaultCssKey( ResourceKey.from( "CONTENT_TYPE_CSS" ) );
fixture.save( contentTypeEntity );
fixture.flushAndClearHibernateSession();
// Create users that have all and no rights to work with the sections.
fixture.createAndStoreNormalUserWithUserGroup( "aru", "All rights user", "testuserstore" );
fixture.createAndStoreNormalUserWithUserGroup( "nru", "No rights user", "testuserstore" );
fixture.flushAndClearHibernateSession();
// Create a unit and a category in the archive to store the articles in, including access rights on the category.
fixture.save( factory.createUnit( "Archive" ) );
final CategoryEntity category = factory.createCategory( "Articles", null, "article", "Archive", "aru", "aru" );
category.setContentType( fixture.findContentTypeByName( "MenuItem" ) );
fixture.save( category );
fixture.save( factory.createCategoryAccessForUser( "Articles", "aru", "read, admin_browse, create, delete, approve" ) );
fixture.save( factory.createCategoryAccessForUser( "Articles", "nru", "read" ) );
}
@Test
public void testGetUsageCountMap()
throws Exception
{
// only CONTENT_TYPE_CSS , that is not associated with sites
assertEquals( 1, resourceUsageDao.getUsageCountMap().size() );
createSite( 1 );
assertEquals( 9, resourceUsageDao.getUsageCountMap().size() );
assertEquals( 1, resourceUsageDao.getUsageCountMap().get( ResourceKey.from( "CONTENT_OBJECT_STYLE" ) ).intValue() );
createSite( 2 );
assertEquals( 9, resourceUsageDao.getUsageCountMap().size() );
assertEquals( 2, resourceUsageDao.getUsageCountMap().get( ResourceKey.from( "CONTENT_OBJECT_STYLE" ) ).intValue() );
}
@Test
public void testGetUsedBy()
throws Exception
{
assertEquals( 0, resourceUsageDao.getUsedBy( ResourceKey.from( "CONTENT_OBJECT_STYLE" ) ).size() );
assertEquals( 0, resourceUsageDao.getUsedBy( ResourceKey.from( "CONTENT_OBJECT_BORDER" ) ).size() );
assertEquals( 1, resourceUsageDao.getUsedBy( ResourceKey.from( "CONTENT_TYPE_CSS" ) ).size() );
assertEquals( 0, resourceUsageDao.getUsedBy( ResourceKey.from( "PAGE_TEMPLATE_STYLE" ) ).size() );
assertEquals( 0, resourceUsageDao.getUsedBy( ResourceKey.from( "PAGE_TEMPLATE_CSS" ) ).size() );
assertEquals( 0, resourceUsageDao.getUsedBy( ResourceKey.from( "DEFAULT_CSS" ) ).size() );
assertEquals( 0, resourceUsageDao.getUsedBy( ResourceKey.from( "DEFAULT_LOCALIZATION_RESOURCE" ) ).size() );
assertEquals( 0, resourceUsageDao.getUsedBy( ResourceKey.from( "DEVICE_CLASS_RESOLVER" ) ).size() );
assertEquals( 0, resourceUsageDao.getUsedBy( ResourceKey.from( "LOCALE_RESOLVER" ) ).size() );
createSite( 1 );
assertEquals( 1, resourceUsageDao.getUsedBy( ResourceKey.from( "CONTENT_OBJECT_STYLE" ) ).size() );
assertEquals( 1, resourceUsageDao.getUsedBy( ResourceKey.from( "CONTENT_OBJECT_BORDER" ) ).size() );
assertEquals( 1, resourceUsageDao.getUsedBy( ResourceKey.from( "CONTENT_TYPE_CSS" ) ).size() );
assertEquals( 1, resourceUsageDao.getUsedBy( ResourceKey.from( "PAGE_TEMPLATE_STYLE" ) ).size() );
assertEquals( 1, resourceUsageDao.getUsedBy( ResourceKey.from( "PAGE_TEMPLATE_CSS" ) ).size() );
assertEquals( 1, resourceUsageDao.getUsedBy( ResourceKey.from( "DEFAULT_CSS" ) ).size() );
assertEquals( 1, resourceUsageDao.getUsedBy( ResourceKey.from( "DEFAULT_LOCALIZATION_RESOURCE" ) ).size() );
assertEquals( 1, resourceUsageDao.getUsedBy( ResourceKey.from( "DEVICE_CLASS_RESOLVER" ) ).size() );
assertEquals( 1, resourceUsageDao.getUsedBy( ResourceKey.from( "LOCALE_RESOLVER" ) ).size() );
createSite( 2 );
assertEquals( 2, resourceUsageDao.getUsedBy( ResourceKey.from( "CONTENT_OBJECT_STYLE" ) ).size() );
assertEquals( 2, resourceUsageDao.getUsedBy( ResourceKey.from( "CONTENT_OBJECT_BORDER" ) ).size() );
assertEquals( 1, resourceUsageDao.getUsedBy( ResourceKey.from( "CONTENT_TYPE_CSS" ) ).size() );
assertEquals( 2, resourceUsageDao.getUsedBy( ResourceKey.from( "PAGE_TEMPLATE_STYLE" ) ).size() );
assertEquals( 2, resourceUsageDao.getUsedBy( ResourceKey.from( "PAGE_TEMPLATE_CSS" ) ).size() );
assertEquals( 2, resourceUsageDao.getUsedBy( ResourceKey.from( "DEFAULT_CSS" ) ).size() );
assertEquals( 2, resourceUsageDao.getUsedBy( ResourceKey.from( "DEFAULT_LOCALIZATION_RESOURCE" ) ).size() );
assertEquals( 2, resourceUsageDao.getUsedBy( ResourceKey.from( "DEVICE_CLASS_RESOLVER" ) ).size() );
assertEquals( 2, resourceUsageDao.getUsedBy( ResourceKey.from( "LOCALE_RESOLVER" ) ).size() );
}
private void createSite( int n )
{
final Document xmlData = XMLDocumentFactory.create( "<menudata>" +
"<defaultcss key=\"DEFAULT_CSS\"/>" +
"<default-localization-resource>DEFAULT_LOCALIZATION_RESOURCE</default-localization-resource>" +
"<device-class-resolver>DEVICE_CLASS_RESOLVER</device-class-resolver>" +
"<locale-resolver>LOCALE_RESOLVER</locale-resolver>" +
"</menudata>" ).getAsJDOMDocument();
// Create a site and a section page for testing working with sections.
final SiteEntity site = factory.createSite( "The Newspaper " + n, new Date(), xmlData, "en" );
fixture.save( site );
fixture.flushAndClearHibernateSession();
fixture.save( createSection( "News " + n, "The Newspaper " + n, true ) );
fixture.save( factory.createMenuItemAccess( fixture.findMenuItemByName( "News " + n ), fixture.findUserByName( "aru" ),
"read, create, update, delete, add, publish" ) );
createContent( "c-1", "Articles" );
final PageTemplateEntity pageTemplateEntity =
factory.createPageTemplate( "my-page-template", PageTemplateType.CONTENT, "The Newspaper " + n,
ResourceKey.from( "PAGE_TEMPLATE_CSS" ) );
pageTemplateEntity.setCssKey( ResourceKey.from( "PAGE_TEMPLATE_STYLE" ) );
fixture.save( pageTemplateEntity );
fixture.flushAndClearHibernateSession();
final PortletEntity portlet = createPortlet( n, "name " + n );
portlet.setSite( site );
portlet.setStyleKey( ResourceKey.from( "CONTENT_OBJECT_STYLE" ) );
portlet.setBorderKey( ResourceKey.from( "CONTENT_OBJECT_BORDER" ) );
fixture.save( portlet );
fixture.flushAndClearHibernateSession();
}
private MenuItemEntity createSection( String name, String siteName, boolean isOrdered )
{
return factory.createSectionMenuItem( name, 0, null, name, siteName, "aru", "aru", "en", null, null, isOrdered, null, false, null );
}
private ContentKey createContent( String contentName, String categoryName )
{
final UserKey user = fixture.findUserByName( "aru" ).getKey();
CreateContentCommand createCommand = createCreateContentCommand( contentName, categoryName, ContentStatus.APPROVED, user );
return contentService.createContent( createCommand );
}
private CreateContentCommand createCreateContentCommand( String contentName, String categoryName, ContentStatus status,
UserKey creator )
{
ContentTypeEntity contentType = fixture.findContentTypeByName( "MenuItem" );
CustomContentData contentData = new CustomContentData( contentType.getContentTypeConfig() );
TextDataEntryConfig headingConfig = new TextDataEntryConfig( "heading", true, "Tittel", "contentdata/intro/heading" );
contentData.add( new TextDataEntry( headingConfig, "test title" ) );
CreateContentCommand createContentCommand = new CreateContentCommand();
createContentCommand.setCreator( creator );
createContentCommand.setLanguage( fixture.findLanguageByCode( "en" ) );
createContentCommand.setCategory( fixture.findCategoryByName( categoryName ) );
createContentCommand.setPriority( 0 );
createContentCommand.setStatus( status );
createContentCommand.setContentData( contentData );
createContentCommand.setContentName( contentName );
return createContentCommand;
}
private PortletEntity createPortlet( int key, String name )
{
PortletEntity portlet = new PortletEntity();
portlet.setKey( key );
portlet.setName( name );
portlet.setCreated( new Date() );
portlet.setRunAs( RunAsType.PERSONALIZED );
return portlet;
}
}