<?php

/**
 * Fixture loader class file.
 *
 * A class to load fixtures on CakePHP's tests. Most of the code is taken from the CakeTestCase class. 
 * Go to http://www.gignus.com/blog/posts/view/13 to learn more about it.
 *
 * @filesource
 * @author Matias Lespiau
 * @link http://www.gignus.com/blog/posts/view/13
 * @version    1
 * @license    http://www.opensource.org/licenses/mit-license.php The MIT License
 * @package app
 * @subpackage app.views.helpers
 */

class FixturesLoader {
    private 
$fixtures;
    var 
$__truncated true;
    var 
$autoFixtures true;
    var 
$_fixtureClassMap = array();
    
    function 
__construct$fixtures null ) { 
        
$this->fixtures $fixtures;    
    }
    
    function 
start()  {
        
$this->cleanFixtures();
         
        
// Set up DB connection
        
if (isset($this->fixtures)) {
            
$this->_initDb();
            
$this->_loadFixtures();
        }

        if (isset(
$this->_fixtures) && isset($this->db)) {
            foreach (
$this->_fixtures as $fixture) {
                
$fixture->create($this->db);
            }
        }
        
        
// Create records
        
if (isset($this->_fixtures) && isset($this->db) && $this->__truncated && $this->autoFixtures == true) {
            foreach (
$this->_fixtures as $fixture) {
                
$inserts $fixture->insert($this->db);
            }
        }
    }

    function 
end() {
        if (isset(
$this->_fixtures) && isset($this->db)) {
            foreach (
array_reverse($this->_fixtures) as $fixture) {
                
$fixture->drop($this->db);
            }
        }
    }

    function 
cleanFixtures() { 
        if (isset(
$this->fixtures) && (!is_array($this->fixtures) || empty($this->fixtures))) {
            unset(
$this->fixtures);
        }        
    }    
    
    function 
_initDb()  {
        
$testDbAvailable false;

        if (
class_exists('DATABASE_CONFIG')) {
            
$dbConfig =& new DATABASE_CONFIG();
            
$testDbAvailable = isset($dbConfig->test);
        }

        if (
$testDbAvailable) {
            
// Try for test DB
            
restore_error_handler();
            @
$db =& ConnectionManager::getDataSource('test');
            
set_error_handler('simpleTestErrorHandler');

            
$testDbAvailable $db->isConnected();
        }

        
// Try for default DB
        
if (!$testDbAvailable) {
            
$db =& ConnectionManager::getDataSource('default');
            
$db->config['prefix'] = 'test_suite_';
        }

        
ConnectionManager::create('test_suite'$db->config);
        
// Get db connection
        
$this->db =& ConnectionManager::getDataSource('test_suite');
        
$this->db->cacheSources  false;
        
$this->db->fullDebug false;        
    }
    
/**
 * Load fixtures specified in var $fixtures.
 *
 * @access private
 */
    
function _loadFixtures() {
        if (!isset(
$this->fixtures) || empty($this->fixtures)) {
            return;
        }

        if (!
is_array($this->fixtures)) {
            
$this->fixtures array_map('trim'explode(','$this->fixtures));
        }

        
$this->_fixtures = array();

        foreach (
$this->fixtures as $index => $fixture) {
            
$fixtureFile null;

            if (
strpos($fixture'core.') === 0) {
                
$fixture substr($fixturestrlen('core.'));
                foreach (
Configure::corePaths('cake') as $key => $path) {
                    
$fixturePaths[] = $path DS 'tests' DS 'fixtures';
                }
            } elseif (
strpos($fixture'app.') === 0) {
                
$fixture substr($fixturestrlen('app.'));
                
$fixturePaths = array(
                    
TESTS DS 'fixtures',
                    
VENDORS 'tests' DS 'fixtures'
                
);
            } else {
                
$fixturePaths = array(
                    
TESTS 'fixtures',
                    
VENDORS 'tests' DS 'fixtures',
                    
TEST_CAKE_CORE_INCLUDE_PATH DS 'cake' DS 'tests' DS 'fixtures'
                
);
            }

            foreach (
$fixturePaths as $path) {
                if (
is_readable($path DS $fixture '_fixture.php')) {
                    
$fixtureFile $path DS $fixture '_fixture.php';
                    break;
                }
            }

            if (isset(
$fixtureFile)) {
                require_once(
$fixtureFile);
                
$fixtureClass Inflector::camelize($fixture) . 'Fixture';
                
$this->_fixtures[$this->fixtures[$index]] =& new $fixtureClass($this->db);
                
$this->_fixtureClassMap[Inflector::camelize($fixture)] = $this->fixtures[$index];
            }
        }

        if (empty(
$this->_fixtures)) {
            unset(
$this->_fixtures);
        }
    }    
}

?>