diff cake/tests/lib/cake_test_fixture.php @ 0:261e66bd5a0c

hg init
author Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
date Sun, 24 Jul 2011 21:08:31 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cake/tests/lib/cake_test_fixture.php	Sun Jul 24 21:08:31 2011 +0900
@@ -0,0 +1,213 @@
+<?php
+/**
+ * Short description for file.
+ *
+ * PHP versions 4 and 5
+ *
+ * CakePHP(tm) Tests <http://book.cakephp.org/view/1196/Testing>
+ * Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org)
+ *
+ *  Licensed under The Open Group Test Suite License
+ *  Redistributions of files must retain the above copyright notice.
+ *
+ * @copyright     Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org)
+ * @link          http://book.cakephp.org/view/1196/Testing CakePHP(tm) Tests
+ * @package       cake
+ * @subpackage    cake.cake.tests.libs
+ * @since         CakePHP(tm) v 1.2.0.4667
+ * @license       http://www.opensource.org/licenses/opengroup.php The Open Group Test Suite License
+ */
+
+/**
+ * Short description for class.
+ *
+ * @package       cake
+ * @subpackage    cake.cake.tests.lib
+ */
+class CakeTestFixture extends Object {
+
+/**
+ * Name of the object
+ *
+ * @var string
+ */
+	var $name = null;
+
+/**
+ * Cake's DBO driver (e.g: DboMysql).
+ *
+ * @access public
+ */
+	var $db = null;
+
+/**
+ * Full Table Name
+ *
+ * @access public
+ */
+	var $table = null;
+
+/**
+ * Instantiate the fixture.
+ *
+ * @access public
+ */
+	function __construct() {
+		App::import('Model', 'CakeSchema');
+		$this->Schema = new CakeSchema(array('name' => 'TestSuite', 'connection' => 'test_suite'));
+
+		$this->init();
+	}
+
+/**
+ * Initialize the fixture.
+ *
+ * @param object	Cake's DBO driver (e.g: DboMysql).
+ * @access public
+ *
+ */
+	function init() {
+		if (isset($this->import) && (is_string($this->import) || is_array($this->import))) {
+			$import = array_merge(
+				array('connection' => 'default', 'records' => false),
+				is_array($this->import) ? $this->import : array('model' => $this->import)
+			);
+
+			if (isset($import['model']) && App::import('Model', $import['model'])) {
+				ClassRegistry::config(array('ds' => $import['connection']));
+				$model =& ClassRegistry::init($import['model']);
+				$db =& ConnectionManager::getDataSource($model->useDbConfig);
+				$db->cacheSources = false;
+				$this->fields = $model->schema(true);
+				$this->fields[$model->primaryKey]['key'] = 'primary';
+				$this->table = $db->fullTableName($model, false);
+				ClassRegistry::config(array('ds' => 'test_suite'));
+				ClassRegistry::flush();
+			} elseif (isset($import['table'])) {
+				$model =& new Model(null, $import['table'], $import['connection']);
+				$db =& ConnectionManager::getDataSource($import['connection']);
+				$db->cacheSources = false;
+				$model->useDbConfig = $import['connection'];
+				$model->name = Inflector::camelize(Inflector::singularize($import['table']));
+				$model->table = $import['table'];
+				$model->tablePrefix = $db->config['prefix'];
+				$this->fields = $model->schema(true);
+				ClassRegistry::flush();
+			}
+
+			if (!empty($db->config['prefix']) && strpos($this->table, $db->config['prefix']) === 0) {
+				$this->table = str_replace($db->config['prefix'], '', $this->table);
+			}
+
+			if (isset($import['records']) && $import['records'] !== false && isset($model) && isset($db)) {
+				$this->records = array();
+				$query = array(
+					'fields' => $db->fields($model, null, array_keys($this->fields)),
+					'table' => $db->fullTableName($model),
+					'alias' => $model->alias,
+					'conditions' => array(),
+					'order' => null,
+					'limit' => null,
+					'group' => null
+				);
+				$records = $db->fetchAll($db->buildStatement($query, $model), false, $model->alias);
+
+				if ($records !== false && !empty($records)) {
+					$this->records = Set::extract($records, '{n}.' . $model->alias);
+				}
+			}
+		}
+
+		if (!isset($this->table)) {
+			$this->table = Inflector::underscore(Inflector::pluralize($this->name));
+		}
+
+		if (!isset($this->primaryKey) && isset($this->fields['id'])) {
+			$this->primaryKey = 'id';
+		}
+	}
+
+/**
+ * Run before all tests execute, should return SQL statement to create table for this fixture could be executed successfully.
+ *
+ * @param object	$db	An instance of the database object used to create the fixture table
+ * @return boolean True on success, false on failure
+ * @access public
+ */
+	function create(&$db) {
+		if (!isset($this->fields) || empty($this->fields)) {
+			return false;
+		}
+
+		$this->Schema->_build(array($this->table => $this->fields));
+		return (
+			$db->execute($db->createSchema($this->Schema), array('log' => false)) !== false
+		);
+	}
+
+/**
+ * Run after all tests executed, should return SQL statement to drop table for this fixture.
+ *
+ * @param object	$db	An instance of the database object used to create the fixture table
+ * @return boolean True on success, false on failure
+ * @access public
+ */
+	function drop(&$db) {
+		if (empty($this->fields)) {
+			return false;
+		}
+		$this->Schema->_build(array($this->table => $this->fields));
+		return (
+			$db->execute($db->dropSchema($this->Schema), array('log' => false)) !== false
+		);
+	}
+
+/**
+ * Run before each tests is executed, should return a set of SQL statements to insert records for the table
+ * of this fixture could be executed successfully.
+ *
+ * @param object $db An instance of the database into which the records will be inserted
+ * @return boolean on success or if there are no records to insert, or false on failure
+ * @access public
+ */
+	function insert(&$db) {
+		if (!isset($this->_insert)) {
+			$values = array();
+
+			if (isset($this->records) && !empty($this->records)) {
+				$fields = array();
+				foreach($this->records as $record) {
+					$fields = array_merge($fields, array_keys(array_intersect_key($record, $this->fields)));
+				}
+				$fields = array_unique($fields);
+				$default = array_fill_keys($fields, null);
+				foreach ($this->records as $record) {
+					$recordValues = array();
+					foreach(array_merge($default, array_map(array(&$db, 'value'), $record)) as $value) {
+						$recordValues[] = is_null($value) ? 'NULL' : $value;
+					}
+					$values[] = '(' . implode(', ', $recordValues) . ')';
+				}
+				return $db->insertMulti($this->table, $fields, $values);
+			}
+			return true;
+		}
+	}
+
+
+/**
+ * Truncates the current fixture. Can be overwritten by classes extending CakeFixture to trigger other events before / after
+ * truncate.
+ *
+ * @param object $db A reference to a db instance
+ * @return boolean
+ * @access public
+ */
+	function truncate(&$db) {
+		$fullDebug = $db->fullDebug;
+		$db->fullDebug = false;
+		$return = $db->truncate($this->table);
+		$db->fullDebug = $fullDebug;
+		return $return;
+	}
+}