/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.resource;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.mockito.Mockito;
import java.util.List;
import com.enonic.cms.framework.util.MimeTypeResolver;
public class FileResourceServiceImplTest
{
@Rule
public TemporaryFolder tmpFolder = new TemporaryFolder();
private FileResourceServiceImpl fileService;
@Before
public void setUp()
throws Exception
{
final MimeTypeResolver mimeTypeResolver = Mockito.mock( MimeTypeResolver.class );
Mockito.when( mimeTypeResolver.getMimeType( "c.txt" ) ).thenReturn( "text/plain" );
this.fileService = new FileResourceServiceImpl();
this.fileService.setMimeTypeResolver( mimeTypeResolver );
this.fileService.setResourceRoot( this.tmpFolder.newFolder() );
}
@Test
public void testRootResource()
{
FileResource res = this.fileService.getResource( new FileResourceName( "/" ) );
Assert.assertNotNull( res );
Assert.assertTrue( res.isFolder() );
Assert.assertEquals( "/", res.getName().getPath() );
}
@Test
public void testCreateFolder()
{
Assert.assertTrue( this.fileService.createFolder( new FileResourceName( "/a/b/c" ) ) );
FileResource res = this.fileService.getResource( new FileResourceName( "/a/b/c" ) );
Assert.assertNotNull( res );
Assert.assertTrue( res.isFolder() );
Assert.assertEquals( "/a/b/c", res.getName().getPath() );
Assert.assertFalse( this.fileService.createFolder( new FileResourceName( "/a/b/c" ) ) );
res = this.fileService.getResource( new FileResourceName( "/a/b/c" ) );
Assert.assertNotNull( res );
}
@Test
public void testCreateFile()
{
Assert.assertTrue( this.fileService.createFile( new FileResourceName( "/a/b/c.txt" ), null ) );
FileResource res = this.fileService.getResource( new FileResourceName( "/a/b/c.txt" ) );
Assert.assertNotNull( res );
Assert.assertFalse( res.isFolder() );
Assert.assertEquals( "/a/b/c.txt", res.getName().getPath() );
Assert.assertEquals( "text/plain", res.getMimeType() );
Assert.assertEquals( 0, res.getSize() );
Assert.assertNotNull( res.getLastModified() );
Assert.assertFalse( this.fileService.createFile( new FileResourceName( "/a/b/c.txt" ), null ) );
res = this.fileService.getResource( new FileResourceName( "/a/b/c.txt" ) );
Assert.assertNotNull( res );
Assert.assertTrue( this.fileService.createFile( new FileResourceName( "/a/b/d.txt" ), FileResourceData.create( new byte[2] ) ) );
res = this.fileService.getResource( new FileResourceName( "/a/b/d.txt" ) );
Assert.assertNotNull( res );
Assert.assertEquals( 2, res.getSize() );
}
@Test
public void testGetResource()
{
FileResource res = this.fileService.getResource( new FileResourceName( "/a/b/c.txt" ) );
Assert.assertNull( res );
Assert.assertTrue( this.fileService.createFile( new FileResourceName( "/a/b/c.txt" ), null ) );
res = this.fileService.getResource( new FileResourceName( "/a/b/c.txt" ) );
Assert.assertNotNull( res );
}
@Test
public void testGetResourceData()
{
FileResourceData data = this.fileService.getResourceData( new FileResourceName( "/a/b/c.txt" ) );
Assert.assertNull( data );
Assert.assertTrue( this.fileService.createFile( new FileResourceName( "/a/b/c.txt" ), null ) );
data = this.fileService.getResourceData( new FileResourceName( "/a/b/c.txt" ) );
Assert.assertNotNull( data );
Assert.assertEquals( 0, data.getAsBytes().length );
Assert.assertTrue( this.fileService.createFile( new FileResourceName( "/a/b/d.txt" ), FileResourceData.create( "hello" ) ) );
data = this.fileService.getResourceData( new FileResourceName( "/a/b/d.txt" ) );
Assert.assertNotNull( data );
Assert.assertEquals( "hello", data.getAsString() );
Assert.assertEquals( 5, data.getSize() );
}
@Test
public void testSetResourceData()
{
Assert.assertFalse( this.fileService.setResourceData( new FileResourceName( "/a/b/c.txt" ), FileResourceData.create( "hello" ) ) );
Assert.assertTrue( this.fileService.createFile( new FileResourceName( "/a/b/c.txt" ), null ) );
Assert.assertTrue( this.fileService.setResourceData( new FileResourceName( "/a/b/c.txt" ), FileResourceData.create( "hello" ) ) );
FileResourceData data = this.fileService.getResourceData( new FileResourceName( "/a/b/c.txt" ) );
Assert.assertNotNull( data );
Assert.assertEquals( "hello", data.getAsString() );
Assert.assertEquals( 5, data.getSize() );
}
@Test
public void testGetChildren()
{
createSampleData();
List<FileResourceName> list = this.fileService.getChildren( new FileResourceName( "/some/unknown/path" ) );
Assert.assertNotNull( list );
Assert.assertEquals( 0, list.size() );
list = this.fileService.getChildren( new FileResourceName( "/" ) );
Assert.assertNotNull( list );
Assert.assertEquals( 1, list.size() );
Assert.assertEquals( list.get( 0 ).toString(), "/a" );
list = this.fileService.getChildren( new FileResourceName( "/a/b/c" ) );
Assert.assertNotNull( list );
Assert.assertEquals( 2, list.size() );
Assert.assertTrue( list.contains( new FileResourceName( "/a/b/c/other.txt" ) ) );
Assert.assertTrue( list.contains( new FileResourceName( "/a/b/c/sample.txt" ) ) );
list = this.fileService.getChildren( new FileResourceName( "/a/b/c/sample.txt" ) );
Assert.assertNotNull( list );
Assert.assertEquals( 0, list.size() );
}
@Test
public void testDeleteResource()
{
createSampleData();
Assert.assertFalse( this.fileService.deleteResource( new FileResourceName( "/some/unknown/path" ) ) );
Assert.assertEquals( 2, this.fileService.getChildren( new FileResourceName( "/a/b/c" ) ).size() );
Assert.assertTrue( this.fileService.deleteResource( new FileResourceName( "/a/b/c/sample.txt" ) ) );
Assert.assertEquals( 1, this.fileService.getChildren( new FileResourceName( "/a/b/c" ) ).size() );
Assert.assertTrue( this.fileService.deleteResource( new FileResourceName( "/a/b" ) ) );
Assert.assertEquals( 0, this.fileService.getChildren( new FileResourceName( "/a/b" ) ).size() );
Assert.assertTrue( this.fileService.deleteResource( new FileResourceName( "/" ) ) );
Assert.assertEquals( 0, this.fileService.getChildren( new FileResourceName( "/" ) ).size() );
}
@Test
public void testCopyResourceFile()
{
createSampleData();
Assert.assertFalse( this.fileService.copyResource( new FileResourceName( "/some/unknown/path" ), new FileResourceName( "/a" ) ) );
Assert.assertEquals( 2, this.fileService.getChildren( new FileResourceName( "/a/b/c" ) ).size() );
Assert.assertFalse(
this.fileService.copyResource( new FileResourceName( "/a/sample.txt" ), new FileResourceName( "/a/b/c/sample.txt" ) ) );
Assert.assertTrue(
this.fileService.copyResource( new FileResourceName( "/a/sample.txt" ), new FileResourceName( "/a/b/c/extra.txt" ) ) );
Assert.assertEquals( 3, this.fileService.getChildren( new FileResourceName( "/a/b/c" ) ).size() );
FileResourceData data = this.fileService.getResourceData( new FileResourceName( "/a/b/c/extra.txt" ) );
Assert.assertNotNull( data );
Assert.assertEquals( "/a/sample.txt", data.getAsString() );
}
@Test
public void copyResourceFolder_non_existing_fromFolder()
{
createSampleData();
Assert.assertFalse( this.fileService.copyResource( new FileResourceName( "/some/unknown/path" ), new FileResourceName( "/a" ) ) );
}
@Test
public void copyResourceFolder_copy_self_to_sub()
{
createSampleData();
Assert.assertTrue( this.fileService.copyResource( new FileResourceName( "/a" ), new FileResourceName( "/a/b/c" ) ) );
final FileResourceData resourceData = this.fileService.getResourceData( new FileResourceName( "/a/b/c/b/c/other.txt" ) );
Assert.assertNotNull( resourceData );
Assert.assertEquals( "/a/b/c/other.txt", resourceData.getAsString() );
}
@Test
public void copyResourceFolder_copy_sub_to_root()
{
createSampleData();
Assert.assertTrue( this.fileService.copyResource( new FileResourceName( "/a/b" ), new FileResourceName( "/z" ) ) );
Assert.assertEquals( "Should have 'a' and 'z' as children on root after copy", 2,
this.fileService.getChildren( new FileResourceName( "/" ) ).size() );
Assert.assertEquals( 2, this.fileService.getChildren( new FileResourceName( "/z/c" ) ).size() );
FileResourceData data = this.fileService.getResourceData( new FileResourceName( "/z/c/other.txt" ) );
Assert.assertNotNull( data );
Assert.assertEquals( "/a/b/c/other.txt", data.getAsString() );
}
@Test
public void moveResourceFile_non_existing_from_file()
{
createSampleData();
Assert.assertFalse( this.fileService.moveResource( new FileResourceName( "/some/unknown/path" ), new FileResourceName( "/a" ) ) );
}
@Test
public void moveResourceFile_move_to_existing_sub_of_self()
{
createSampleData();
fileService.createFolder( new FileResourceName( "/a/new" ) );
Assert.assertTrue(
this.fileService.moveResource( new FileResourceName( "/a/sample.txt" ), new FileResourceName( "/a/new/sample.txt" ) ) );
fileService.createFolder( new FileResourceName( "/a/new/new2" ) );
Assert.assertTrue( this.fileService.moveResource( new FileResourceName( "/a/new/sample.txt" ),
new FileResourceName( "/a/new/new2/sample.txt" ) ) );
}
@Test
public void moveResourceFile_not_allowed_to_move_to_nonexisting_folder()
{
createSampleData();
Assert.assertFalse(
this.fileService.moveResource( new FileResourceName( "/a/sample.txt" ), new FileResourceName( "/a/new/sample.txt" ) ) );
}
@Test
public void moveResourceFile_move_file_to_subfolder()
{
createSampleData();
Assert.assertTrue(
this.fileService.moveResource( new FileResourceName( "/a/sample.txt" ), new FileResourceName( "/a/b/c/extra.txt" ) ) );
Assert.assertEquals( 1, this.fileService.getChildren( new FileResourceName( "/a" ) ).size() );
Assert.assertEquals( 3, this.fileService.getChildren( new FileResourceName( "/a/b/c" ) ).size() );
FileResourceData data = this.fileService.getResourceData( new FileResourceName( "/a/b/c/extra.txt" ) );
Assert.assertNotNull( data );
Assert.assertEquals( "/a/sample.txt", data.getAsString() );
}
@Test
public void moveResourceFile_move_file_up()
{
createSampleData();
this.fileService.createFile( new FileResourceName( "/a/b/c/d/sample.txt" ), FileResourceData.create( "/a/b/c/d/sample.txt" ) );
Assert.assertTrue( this.fileService.moveResource( new FileResourceName( "a/b/c" ), new FileResourceName( "/a/c" ) ) );
Assert.assertTrue( this.fileService.getResource( new FileResourceName( "/a/c/sample.txt" ) ) != null );
Assert.assertTrue( this.fileService.getResource( new FileResourceName( "/a/c/d/sample.txt" ) ) != null );
Assert.assertTrue( this.fileService.getResource( new FileResourceName( "/a/b/c/d/sample.txt" ) ) == null );
}
@Test
public void moveResourceFile_move_to_self()
{
this.fileService.createFolder( new FileResourceName( "/d" ) );
Assert.assertFalse( this.fileService.moveResource( new FileResourceName( "/d" ), new FileResourceName( "/d" ) ) );
}
@Test
public void moveResourceFile_move_to_subfolder_of_self()
{
this.fileService.createFolder( new FileResourceName( "/d" ) );
Assert.assertFalse( this.fileService.moveResource( new FileResourceName( "/d" ), new FileResourceName( "/d/e" ) ) );
}
@Test
public void moveResourceFolder_non_existing_folder()
{
createSampleData();
Assert.assertFalse( this.fileService.moveResource( new FileResourceName( "/some/unknown/path" ), new FileResourceName( "/a" ) ) );
}
@Test
public void moveResourceFolder_move_to_sub_subfolder_of_self()
{
createSampleData();
Assert.assertFalse( this.fileService.moveResource( new FileResourceName( "/a" ), new FileResourceName( "/a/b/c" ) ) );
}
@Test
public void moveResourceFolder_move_to_new_name_same_level()
{
createSampleData();
Assert.assertTrue( this.fileService.moveResource( new FileResourceName( "/a/b" ), new FileResourceName( "/z" ) ) );
Assert.assertEquals( 1, this.fileService.getChildren( new FileResourceName( "/a" ) ).size() );
Assert.assertEquals( 2, this.fileService.getChildren( new FileResourceName( "/" ) ).size() );
Assert.assertEquals( 2, this.fileService.getChildren( new FileResourceName( "/z/c" ) ).size() );
FileResourceData data = this.fileService.getResourceData( new FileResourceName( "/z/c/other.txt" ) );
Assert.assertNotNull( data );
Assert.assertEquals( "/a/b/c/other.txt", data.getAsString() );
}
@Test
public void moveResourceFolder_move_to_new_name_on_level_down()
{
createSampleData();
this.fileService.createFolder( new FileResourceName( "/z" ) );
Assert.assertTrue( this.fileService.moveResource( new FileResourceName( "/a/b" ), new FileResourceName( "/z/x" ) ) );
Assert.assertEquals( 1, this.fileService.getChildren( new FileResourceName( "/a" ) ).size() );
Assert.assertEquals( 2, this.fileService.getChildren( new FileResourceName( "/" ) ).size() );
Assert.assertEquals( 2, this.fileService.getChildren( new FileResourceName( "/z/x/c" ) ).size() );
FileResourceData data = this.fileService.getResourceData( new FileResourceName( "/z/x/c/other.txt" ) );
Assert.assertNotNull( data );
Assert.assertEquals( "/a/b/c/other.txt", data.getAsString() );
}
private void createSampleData()
{
this.fileService.createFile( new FileResourceName( "/a/sample.txt" ), FileResourceData.create( "/a/sample.txt" ) );
this.fileService.createFile( new FileResourceName( "/a/b/sample.txt" ), FileResourceData.create( "/a/b/sample.txt" ) );
this.fileService.createFile( new FileResourceName( "/a/b/c/sample.txt" ), FileResourceData.create( "/a/b/c/sample.txt" ) );
this.fileService.createFile( new FileResourceName( "/a/b/c/other.txt" ), FileResourceData.create( "/a/b/c/other.txt" ) );
}
}