/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.itest.client; import java.io.IOException; import java.util.Date; import org.jdom.Document; import org.jdom.JDOMException; import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.mock.web.MockHttpServletRequest; import com.enonic.cms.framework.xml.XMLDocumentFactory; import com.enonic.cms.api.client.ClientException; import com.enonic.cms.api.client.model.CreateFileContentParams; import com.enonic.cms.api.client.model.GetBinaryParams; import com.enonic.cms.api.client.model.GetContentBinaryParams; import com.enonic.cms.api.client.model.content.file.FileBinaryInput; import com.enonic.cms.api.client.model.content.file.FileContentDataInput; import com.enonic.cms.api.client.model.content.file.FileDescriptionInput; import com.enonic.cms.api.client.model.content.file.FileNameInput; import com.enonic.cms.core.client.InternalClient; import com.enonic.cms.core.content.ContentEntity; import com.enonic.cms.core.content.ContentKey; import com.enonic.cms.core.content.ContentStatus; import com.enonic.cms.core.content.ContentVersionEntity; import com.enonic.cms.core.content.contentdata.legacy.LegacyFileContentData; import com.enonic.cms.core.content.contenttype.ContentHandlerName; import com.enonic.cms.core.security.PortalSecurityHolder; import com.enonic.cms.core.security.user.UserType; import com.enonic.cms.core.servlet.ServletRequestAccessor; import com.enonic.cms.itest.AbstractSpringTest; import com.enonic.cms.itest.util.AssertTool; import com.enonic.cms.itest.util.DomainFactory; import com.enonic.cms.itest.util.DomainFixture; import static org.junit.Assert.*; public class InternalClientImpl_getBinaryTest extends AbstractSpringTest { @Autowired private DomainFixture fixture; @Autowired @Qualifier("localClient") private InternalClient internalClient; @Before public void before() throws IOException, JDOMException { final DomainFactory factory = fixture.getFactory(); fixture.initSystemData(); StringBuilder contentTypeConfigXml = new StringBuilder(); contentTypeConfigXml.append( "<moduledata/>" ); final Document contentTypeConfig = XMLDocumentFactory.create( contentTypeConfigXml.toString() ).getAsJDOMDocument(); fixture.flushAndClearHibernateSession(); MockHttpServletRequest request = new MockHttpServletRequest(); request.setRemoteAddr( "127.0.0.1" ); ServletRequestAccessor.setRequest( request ); fixture.createAndStoreUserAndUserGroup( "creator", "creator fullname", UserType.NORMAL, "testuserstore" ); fixture.createAndStoreUserAndUserGroup( "getter", "getter fullname", UserType.NORMAL, "testuserstore" ); fixture.save( factory.createContentHandler( "File content", ContentHandlerName.FILE.getHandlerClassShortName() ) ); fixture.save( factory.createContentType( "MyContentType", ContentHandlerName.FILE.getHandlerClassShortName(), contentTypeConfig ) ); fixture.save( factory.createUnit( "MyUnit", "en" ) ); fixture.save( factory.createCategory( "MyCategory", null, "MyContentType", "MyUnit", "creator", "creator" ) ); fixture.save( factory.createCategoryAccessForUser( "MyCategory", "creator", "read,create,approve" ) ); fixture.save( factory.createCategoryAccessForUser( "MyCategory", "getter", "read,create" ) ); fixture.flushAndClearHibernateSession(); } @Test public void getBinary() { PortalSecurityHolder.setImpersonatedUser( fixture.findUserByName( "creator" ).getKey() ); ContentKey contentKey = createFileContent( "Dummy name", new byte[]{1, 2, 3}, ContentStatus.APPROVED, "MyCategory" ); fixture.flushAndClearHibernateSession(); ContentEntity persistedContent = fixture.findContentByKey( contentKey ); ContentVersionEntity persistedVersion = persistedContent.getMainVersion(); LegacyFileContentData contentData = (LegacyFileContentData) persistedVersion.getContentData(); // exercise PortalSecurityHolder.setImpersonatedUser( fixture.findUserByName( "getter" ).getKey() ); GetBinaryParams params = new GetBinaryParams(); params.binaryKey = contentData.resolveBinaryDataKey().toInt(); Document binaryDoc = internalClient.getBinary( params ); // verify AssertTool.assertSingleXPathValueEquals( "/binary/filename", binaryDoc, "Dummy name" ); AssertTool.assertSingleXPathValueEquals( "/binary/binarykey", binaryDoc, "" + contentData.resolveBinaryDataKey() ); AssertTool.assertSingleXPathValueEquals( "/binary/contentkey", binaryDoc, "" + persistedContent.getKey() ); AssertTool.assertSingleXPathValueEquals( "/binary/size", binaryDoc, "" + 3 ); } @Test public void getContentBinary() { PortalSecurityHolder.setImpersonatedUser( fixture.findUserByName( "creator" ).getKey() ); ContentKey contentKey = createFileContent( "Dummy name", new byte[]{1, 2, 3}, ContentStatus.APPROVED, "MyCategory" ); fixture.flushAndClearHibernateSession(); ContentEntity persistedContent = fixture.findContentByKey( contentKey ); ContentVersionEntity persistedVersion = persistedContent.getMainVersion(); LegacyFileContentData contentData = (LegacyFileContentData) persistedVersion.getContentData(); // exercise PortalSecurityHolder.setImpersonatedUser( fixture.findUserByName( "getter" ).getKey() ); GetContentBinaryParams params = new GetContentBinaryParams(); params.contentKey = contentKey.toInt(); params.label = "source"; Document binaryDoc = internalClient.getContentBinary( params ); // verify AssertTool.assertSingleXPathValueEquals( "/binary/filename", binaryDoc, "Dummy name" ); AssertTool.assertSingleXPathValueEquals( "/binary/binarykey", binaryDoc, "" + contentData.resolveBinaryDataKey() ); AssertTool.assertSingleXPathValueEquals( "/binary/contentkey", binaryDoc, "" + persistedContent.getKey() ); AssertTool.assertSingleXPathValueEquals( "/binary/size", binaryDoc, "" + 3 ); } @Test public void getContentBinary_with_no_label() { PortalSecurityHolder.setImpersonatedUser( fixture.findUserByName( "creator" ).getKey() ); ContentKey contentKey = createFileContent( "Dummy name", new byte[]{1, 2, 3}, ContentStatus.APPROVED, "MyCategory" ); fixture.flushAndClearHibernateSession(); ContentEntity persistedContent = fixture.findContentByKey( contentKey ); ContentVersionEntity persistedVersion = persistedContent.getMainVersion(); LegacyFileContentData contentData = (LegacyFileContentData) persistedVersion.getContentData(); // exercise PortalSecurityHolder.setImpersonatedUser( fixture.findUserByName( "getter" ).getKey() ); GetContentBinaryParams params = new GetContentBinaryParams(); params.contentKey = contentKey.toInt(); Document binaryDoc = internalClient.getContentBinary( params ); // verify AssertTool.assertSingleXPathValueEquals( "/binary/filename", binaryDoc, "Dummy name" ); AssertTool.assertSingleXPathValueEquals( "/binary/binarykey", binaryDoc, "" + contentData.resolveBinaryDataKey() ); AssertTool.assertSingleXPathValueEquals( "/binary/contentkey", binaryDoc, "" + persistedContent.getKey() ); AssertTool.assertSingleXPathValueEquals( "/binary/size", binaryDoc, "" + 3 ); } @Test public void getContentBinary_with_non_existing_content_key_throws_exception() { // exercise PortalSecurityHolder.setImpersonatedUser( fixture.findUserByName( "getter" ).getKey() ); GetContentBinaryParams params = new GetContentBinaryParams(); params.contentKey = 123; params.label = "source"; try { internalClient.getContentBinary( params ); fail( "Expected exception" ); } catch ( Exception e ) { assertTrue( e instanceof ClientException ); assertTrue( e.getMessage().contains( "Attachment not found, contentKey: '123'" ) ); } } @Test public void getContentBinary_with_non_existing_label_throws_exception() { PortalSecurityHolder.setImpersonatedUser( fixture.findUserByName( "creator" ).getKey() ); ContentKey contentKey = createFileContent( "Dummy name", new byte[]{1, 2, 3}, ContentStatus.APPROVED, "MyCategory" ); fixture.flushAndClearHibernateSession(); // exercise PortalSecurityHolder.setImpersonatedUser( fixture.findUserByName( "getter" ).getKey() ); GetContentBinaryParams params = new GetContentBinaryParams(); params.contentKey = contentKey.toInt(); params.label = "nolabel"; try { internalClient.getContentBinary( params ); fail( "Expected exception" ); } catch ( Exception e ) { assertTrue( e instanceof ClientException ); assertTrue( e.getMessage().contains( "Attachment not found, contentKey: '" + contentKey + "'" ) ); } } @Test public void getBinary_with_non_existing_binary_key_throws_exception() { // exercise PortalSecurityHolder.setImpersonatedUser( fixture.findUserByName( "getter" ).getKey() ); GetBinaryParams params = new GetBinaryParams(); params.binaryKey = 123; try { internalClient.getBinary( params ); fail( "Expected exception" ); } catch ( Exception e ) { assertTrue( e instanceof ClientException ); assertTrue( e.getMessage().contains( "Attachment not found, binaryDataKey: '123'" ) ); } } private ContentKey createFileContent( String name, byte[] bytes, ContentStatus contentStatus, String categoryName ) { FileContentDataInput fileContentData = new FileContentDataInput(); fileContentData.binary = new FileBinaryInput( bytes, name ); fileContentData.description = new FileDescriptionInput( "Dummy description." ); fileContentData.name = new FileNameInput( name ); CreateFileContentParams params = new CreateFileContentParams(); params.categoryKey = fixture.findCategoryByName( categoryName ).getKey().toInt(); params.publishFrom = new Date(); params.publishTo = null; params.status = contentStatus.getKey(); params.fileContentData = fileContentData; int contentKey = internalClient.createFileContent( params ); return new ContentKey( contentKey ); } }