/**
  * Checks if asset file and asset thumbnails (if supported) exist in filesystem.
  *
  * @param lyMediaAsset $asset
  * @param boolean $exist true=must exist, false=must not exist
  * 
  * @return lyMediaTestFunctional current lyMediaTestFunctional instance
  */
 protected function checkFile($asset, $exist = true)
 {
     $fs = new lyMediaFileSystem();
     $file_path = $asset->getPath();
     $this->test()->is($fs->is_file($file_path), $exist, 'File ' . $file_path . ($exist ? ' has ' : ' has not ') . 'been found');
     if ($asset->supportsThumbnails()) {
         $tn = new lyMediaThumbnails($file_path, in_array($asset->getType(), array('image/png', 'image/gif')) ? $asset->getType() : 'image/jpeg', $asset->getThumbnailFile(null));
         foreach ($tn->getThumbnailPaths() as $file_path) {
             $this->test()->is($fs->is_file($file_path), $exist, 'Thumbnail ' . basename($file_path) . ($exist ? ' has ' : ' has not ') . 'been found');
         }
     }
     return $this;
 }
 * @package     lyMediaManagerPlugin
 * @subpackage  functional tests
 * @copyright   Copyright (C) 2010 Massimo Giagnoni.
 * @license     http://www.symfony-project.org/license MIT
 * @version     SVN: $Id$
 */
include dirname(__FILE__) . '/../bootstrap/functional.php';
Doctrine_Core::loadData(dirname(__FILE__) . '/../data/fixtures/fixtures_fs.yml');
$root = Doctrine::getTable('lyMediaFolder')->findOneByName('media');
$subf1 = lyMediaFolderTable::getInstance()->findOneByName('testsub1');
$subf2 = lyMediaFolderTable::getInstance()->findOneByName('testsub2');
//Creates some test assets. Cannot be done in fixtures
$file = dirname(__FILE__) . '/../data/assets/asset1.png';
$asset = new lyMediaAsset();
$asset->setFolder($subf1);
$asset->setFilename($file);
$asset->save();
$asset->refresh();
$file = dirname(__FILE__) . '/../data/assets/asseta.png';
$asset2 = new lyMediaAsset();
$asset2->setFolder($subf2);
$asset2->setFilename($file);
$asset2->save();
$asset2->refresh();
$base = sfConfig::get('sf_web_dir') . DIRECTORY_SEPARATOR . 'media' . DIRECTORY_SEPARATOR;
chmod($base . 'testsub1', 0555);
$browser = new lyMediaTestFunctional(new sfBrowser());
$browser->setTester('doctrine', 'sfTesterDoctrine');
$browser->info('1 - Unwritable destination folder')->info('  1.1 - Create folder')->get('/ly_media_asset')->click('li.sf_admin_action_new_folder a')->click('li.sf_admin_action_save input', array('ly_media_folder' => array('parent_id' => $subf1->getId(), 'name' => 'test')))->with('form')->begin()->hasErrors(1)->hasGlobalError('parent_unwritable')->end()->info('  1.2 - Move folder')->get('/ly_media_folder/' . $subf2->getId() . '/edit')->click('li.sf_admin_action_save input', array('ly_media_folder' => array('parent_id' => $subf1->getId())))->with('form')->begin()->hasErrors(1)->hasGlobalError('parent_unwritable')->end()->info('  1.3 - Upload asset')->get('/ly_media_asset')->click('li.sf_admin_action_new a')->click('li.sf_admin_action_save input', array('ly_media_asset' => array('folder_id' => $subf1->getId(), 'title' => 'test', 'filename' => dirname(__FILE__) . '/../data/assets/asset1.png')))->with('form')->begin()->hasErrors(1)->hasGlobalError('folder_unwritable')->end()->info('  1.4 - Rename asset')->get('/ly_media_asset/' . $asset->getId() . '/edit')->click('li.sf_admin_action_save input', array('filename' => 'renamed'))->with('form')->begin()->hasErrors(1)->hasGlobalError('folder_unwritable')->end()->info('  1.5 - Delete asset')->get('/ly_media_asset')->click('li.sf_admin_action_delete a[href$=ly_media_asset/' . $asset->getId() . ']', array(), array('method' => 'delete', '_with_csrf' => true))->with('response')->isRedirected()->followRedirect()->with('response')->checkElement('div.error:contains("asset1.png")')->info('  1.6 - Move asset')->get('/ly_media_asset/' . $asset2->getId() . '/edit')->click('li.sf_admin_action_save input', array('ly_media_asset' => array('folder_id' => $subf1->getId())))->with('form')->begin()->hasErrors(1)->hasGlobalError('folder_unwritable')->end();
//Make writable to allow removal
chmod($base . 'testsub1', 0755);
$t->ok($fs->is_dir($folder2->getRelativePath()), 'Folder exists in filesystem');
$t->info('Move folder deeper');
$folder2->move($sub);
$folder2->refresh();
/*
 * test_root
 *  -- test
 *  -- -- test-sub
 *  -- -- -- test 2
 */
$t->is($folder2->getRelativePath(), 'test_root/test/test-sub/test2/', '->getRelativePath()');
$t->is($folder2->getNode()->getPath('/', true), 'test_root/test/test-sub/test2', 'Folder has right path');
$t->ok($fs->is_dir($folder2->getRelativePath()), 'Folder exists in filesystem');
$t->info('Synchronize folder');
//Create orphaned asset
$asset = new lyMediaAsset();
$asset->setFolder($folder);
$asset->setFilename(dirname(__FILE__) . '/../data/assets/asseta.png');
$asset->save();
$root->synchronizeWith(dirname(__FILE__) . '/../data/assets/', false);
$asset = lyMediaAssetTable::getInstance()->findOneByFilename('asset1.png');
$t->ok(is_object($asset), 'Asset created in root');
$t->is($asset->getPath(), 'test_root/asset1.png', 'Asset has correct path');
$t->ok($fs->is_file('test_root/asset1.png'), 'Asset exists in filesystem');
$t->ok($fs->is_file('test_root/thumbs/small_asset1.png'), 'Small thumbnail exists in filesystem');
$t->ok($fs->is_file('test_root/thumbs/medium_asset1.png'), 'Medium thumbnail exists in filesystem');
$asset = lyMediaAssetTable::getInstance()->findOneByFilename('assetc.png');
$t->ok(is_object($asset), 'Asset created in subfolder');
$t->is($asset->getPath(), 'test_root/test/test-sub/assetc.png', 'Asset has correct path');
$t->ok($fs->is_file('test_root/test/test-sub/assetc.png'), 'Asset exists in filesystem');
$t->ok($fs->is_file('test_root/test/test-sub/thumbs/small_assetc.png'), 'Small thumbnail exists in filesystem');
 /**
  * Used by synchronize task.
  *
  * @param string $baseFolder
  * @param bool $verbose
  * @param bool $removeOrphanAssets
  * @param bool $removeOrphanFolders
  */
 public function synchronizeWith($baseFolder, $verbose = true, $removeOrphanAssets = false, $removeOrphanFolders = false)
 {
     if (!is_dir($baseFolder)) {
         throw new lyMediaException(sprintf('%s is not a directory', $baseFolder));
     }
     $files = sfFinder::type('file')->maxdepth(0)->ignore_version_control()->in($baseFolder);
     $assets = $this->getAssetsWithFilenames();
     $fs = new lyMediaFileSystem();
     foreach ($files as $file) {
         $basename = basename($file);
         if (!array_key_exists($basename, $assets)) {
             // File exists, asset does not exist: create asset
             $fs->import($file, $this->getRelativePath() . $basename);
             $lyMediaAsset = new lyMediaAsset();
             $lyMediaAsset->setFolderId($this->getId());
             $lyMediaAsset->setFilename($basename);
             $lyMediaAsset->setType(mime_content_type($file));
             $lyMediaAsset->setFilesize(filesize($file) / 1024);
             $lyMediaAsset->save();
             if ($verbose) {
                 lyMediaTools::log(sprintf("Importing file %s", $file), 'green');
             }
         } else {
             // File exists, asset exists: do nothing
             unset($assets[basename($file)]);
         }
     }
     foreach ($assets as $name => $asset) {
         if ($removeOrphanAssets) {
             // File does not exist, asset exists: delete asset
             $asset->delete();
             if ($verbose) {
                 lyMediaTools::log(sprintf("Deleting asset %s", $asset->getPath()), 'yellow');
             }
         } else {
             if ($verbose) {
                 lyMediaTools::log(sprintf("Warning: No file for asset %s", $asset->getPath()), 'red');
             }
         }
     }
     $dirs = sfFinder::type('dir')->maxdepth(0)->discard(lyMediaTools::getThumbnailFolder())->ignore_version_control()->in($baseFolder);
     $folders = $this->getSubfoldersWithFolderNames();
     foreach ($dirs as $dir) {
         list(, $name) = lyMediaTools::splitPath($dir);
         if (!array_key_exists($name, $folders)) {
             // dir exists in filesystem, not in database: create folder in database
             $lyMediaFolder = new lyMediaFolder();
             $lyMediaFolder->setName($name);
             $lyMediaFolder->create($this);
             if ($verbose) {
                 lyMediaTools::log(sprintf("Importing directory %s", $dir), 'green');
             }
         } else {
             // dir exists in filesystem and database: look inside
             $lyMediaFolder = $folders[$name];
             unset($folders[$name]);
         }
         $lyMediaFolder->synchronizeWith($dir, $verbose, $removeOrphanAssets, $removeOrphanFolders);
     }
     foreach ($folders as $name => $folder) {
         if ($removeOrphanFolders) {
             $folder->delete(null, true);
             if ($verbose) {
                 lyMediaTools::log(sprintf("Deleting folder %s", $folder->getRelativePath()), 'yellow');
             }
         } else {
             if ($verbose) {
                 lyMediaTools::log(sprintf("Warning: No directory for folder %s", $folder->getRelativePath()), 'red');
             }
         }
     }
 }
$t = new lime_test(31, new lime_output_color());
$t->info('Create asset');
$file = dirname(__FILE__) . '/../data/assets/asset1.png';
$a = new lyMediaAsset();
$a->setFolder($root);
$a->setFilename($file);
$a->save();
$a->refresh();
$t->is($a->getFilename(), 'asset1.png', '->getFilename()');
$t->is($a->getType(), 'image/png', '->getType()');
$t->is($a->getPath(), 'test_root/asset1.png', '->getPath()');
$t->ok(file_exists($base . 'asset1.png'), 'File exists');
$t->ok(file_exists($base . 'thumbs/small_asset1.png'), 'Small thumbnail exists');
$t->ok(file_exists($base . 'thumbs/medium_asset1.png'), 'Medium thumbnail exists');
$t->info('Create another asset with the same file');
$a2 = new lyMediaAsset();
$a2->setFolder($root);
$a2->setFilename($file);
$a2->save();
$a2->refresh();
$t->is($a2->getFilename(), 'asset1(1).png', 'Filename is unique');
$t->info('Rename asset: asset1.png > renamed.png');
$a->setFilename('renamed.png');
$a->save();
$a->refresh();
$t->is($a->getPath(), 'test_root/renamed.png', '->getPath()');
$t->ok(file_exists($base . 'renamed.png'), 'Renamed file exists');
$t->ok(file_exists($base . 'thumbs/small_renamed.png'), 'Small thumbnail is renamed');
$t->ok(file_exists($base . 'thumbs/medium_renamed.png'), 'Medium thumbnail is renamed');
$t->ok(!file_exists($base . 'asset1.png'), 'Old file name does not exist');
$t->ok(!file_exists($base . 'thumbs/small_asset1.png'), 'Old small thumbnail does not exist');
$t->info('Move *and* rename asset');
$a->setFilename('asset.png');
$a->setFolder($root);
$a->save();
$a->refresh();
$t->is($a->getPath(), 'test_root/asset.png', '->getPath()');
$t->ok(file_exists($base . 'asset.png'), 'Moved/renamed file exists');
$t->ok(file_exists($base . 'thumbs/small_asset.png'), 'Small thumbnail is moved/renamed');
$t->ok(file_exists($base . 'thumbs/medium_asset.png'), 'Medium thumbnail is moved/renamed');
$t->ok(!file_exists($base . 'test/renamed.png'), 'File does not exist in old path');
$t->ok(!file_exists($base . 'test/thumbs/small_renamed.png'), 'Small thumbnail does not exist in old path');
$t->ok(!file_exists($base . 'test/thumbs/medium_renamed.png'), 'Medium thumbnail does not exist in old path');
$t->info('Delete asset');
$a->delete();
$t->ok(!file_exists($base . 'asset.png'), 'deleted file does not exist');
$t->ok(!file_exists($base . 'thumbs/small_asset.png'), 'Deleted small thumbnail does not exist');
$t->ok(!file_exists($base . 'thumbs/medium_asset.png'), 'Deleted medium thumbnail does not exist');
$t->info('Create thumbnails');
//Turn off automatic thumbnail generation
sfConfig::set('app_lyMediaManager_create_thumbnails_for', array());
$a = new lyMediaAsset();
$a->setFolder($root);
$a->setFilename(dirname(__FILE__) . '/../data/assets/asseta.png');
$a->save();
$a->refresh();
$t->ok(!file_exists($base . 'thumbs/small_asseta.png'), 'small thumbnail does not exist');
$t->ok(!file_exists($base . 'thumbs/medium_asseta.png'), 'medium thumbnail does not exist');
sfConfig::set('app_lyMediaManager_create_thumbnails_for', array('image/png'));
$a->generateThumbnails();
$t->ok(file_exists($base . 'thumbs/small_asseta.png'), 'small thumbnail exists');
$t->ok(file_exists($base . 'thumbs/medium_asseta.png'), 'medium thumbnail exists');