diff --git a/cake/tests/lib/cake_fixture_manager.php b/cake/tests/lib/cake_fixture_manager.php new file mode 100644 index 000000000..b50b879c8 --- /dev/null +++ b/cake/tests/lib/cake_fixture_manager.php @@ -0,0 +1,179 @@ +fixtures)) { + return; + } + if (!self::$_initialized) { + self::_initDb(); + if (!empty(self::$_db)) { + $test->db = self::$_db; + } + } + if (!is_array($test->fixtures)) { + $test->fixtures = array_map('trim', explode(',', $test->fixtures)); + } + if (isset($test->fixtures)) { + self::_loadFixtures($test->fixtures); + } + } + + protected static function _initDb() { + $testDbAvailable = in_array('test', array_keys(ConnectionManager::enumConnectionObjects())); + + $_prefix = null; + + if ($testDbAvailable) { + // Try for test DB + @$db = ConnectionManager::getDataSource('test'); + $testDbAvailable = $db->isConnected(); + } + + // Try for default DB + if (!$testDbAvailable) { + $db = ConnectionManager::getDataSource('default'); + $_prefix = $db->config['prefix']; + $db->config['prefix'] = 'test_suite_'; + } + + ConnectionManager::create('test_suite', $db->config); + $db->config['prefix'] = $_prefix; + + // Get db connection + self::$_db = ConnectionManager::getDataSource('test_suite'); + self::$_db->cacheSources = false; + + ClassRegistry::config(array('ds' => 'test_suite')); + } + + protected static function _loadFixtures($fixtures) { + foreach ($fixtures as $index => $fixture) { + $fixtureFile = null; + $fixtureIndex = $fixture; + if (isset(self::$_loaded[$fixture])) { + continue; + } + if (strpos($fixture, 'core.') === 0) { + $fixture = substr($fixture, strlen('core.')); + foreach (App::core('cake') as $key => $path) { + $fixturePaths[] = $path . 'tests' . DS . 'fixtures'; + } + } elseif (strpos($fixture, 'app.') === 0) { + $fixture = substr($fixture, strlen('app.')); + $fixturePaths = array( + TESTS . 'fixtures', + VENDORS . 'tests' . DS . 'fixtures' + ); + } elseif (strpos($fixture, 'plugin.') === 0) { + $parts = explode('.', $fixture, 3); + $pluginName = $parts[1]; + $fixture = $parts[2]; + $fixturePaths = array( + App::pluginPath($pluginName) . 'tests' . DS . 'fixtures', + TESTS . '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'; + self::$_loaded[$fixtureIndex] = new $fixtureClass(self::$_db); + self::$_fixtureMap[$fixtureClass] = self::$_loaded[$fixtureIndex]; + } + } + } + + protected static function setupTable($fixture, $db = null, $drop = true) { + if (!empty($fixture->created)) { + return; + } + if (!$db) { + $db = self::$_db; + } + + $cacheSources = $db->cacheSources; + $db->cacheSources = false; + $db->cacheSources = $cacheSources; + $sources = $db->listSources(); + $table = $db->config['prefix'] . $fixture->table; + + if ($drop && in_array($table, $sources)) { + $fixture->drop($db); + $fixture->create($db); + $fixture->created = true; + } elseif (!in_array($table, $sources)) { + $fixture->create($db); + $fixture->created = true; + } + } + + public static function load(CakeTestCase $test) { + if (empty($test->fixtures)) { + return; + } + $fixtures = $test->fixtures; + if (empty($fixtures) || $test->autoFixtures == false) { + return; + } + + foreach ($fixtures as $f) { + if (!empty(self::$_loaded[$f])) { + $fixture = self::$_loaded[$f]; + self::setupTable($fixture, $test->db, $test->dropTables); + $fixture->insert($test->db); + } + } + } + + public static function unload(CakeTestCase $test) { + if (empty($test->fixtures)) { + return; + } + $fixtures = $test->fixtures; + if (empty($fixtures)) { + return; + } + foreach ($fixtures as $f) { + if (isset(self::$_loaded[$f])) { + $fixture = self::$_loaded[$f]; + if (!empty($fixture->created)) { + $fixture->truncate($test->db); + } + } + } + } + + public static function loadSingle($name, $db = null) { + $name .= 'Fixture'; + if (isset(self::$_fixtureMap[$name])) { + if (!$db) { + $db = self::$_db; + } + $fixture = self::$_fixtureMap[$name]; + $fixture->truncate($db); + $fixture->insert($db); + } else { + throw new UnexpectedValueException(sprintf(__('Referenced fixture class %s not found'), $name)); + } + } +} \ No newline at end of file