summaryrefslogtreecommitdiff
path: root/poc/poc02-compiling-cake/src/vendor/cakephp-2.2.1-0-gcc44130/lib/Cake/Test/Case/Model/CakeSchemaTest.php
diff options
context:
space:
mode:
Diffstat (limited to 'poc/poc02-compiling-cake/src/vendor/cakephp-2.2.1-0-gcc44130/lib/Cake/Test/Case/Model/CakeSchemaTest.php')
-rw-r--r--poc/poc02-compiling-cake/src/vendor/cakephp-2.2.1-0-gcc44130/lib/Cake/Test/Case/Model/CakeSchemaTest.php1091
1 files changed, 1091 insertions, 0 deletions
diff --git a/poc/poc02-compiling-cake/src/vendor/cakephp-2.2.1-0-gcc44130/lib/Cake/Test/Case/Model/CakeSchemaTest.php b/poc/poc02-compiling-cake/src/vendor/cakephp-2.2.1-0-gcc44130/lib/Cake/Test/Case/Model/CakeSchemaTest.php
new file mode 100644
index 0000000..47effcc
--- /dev/null
+++ b/poc/poc02-compiling-cake/src/vendor/cakephp-2.2.1-0-gcc44130/lib/Cake/Test/Case/Model/CakeSchemaTest.php
@@ -0,0 +1,1091 @@
+<?php
+/**
+ * Test for Schema database management
+ *
+ *
+ * PHP 5
+ *
+ * CakePHP(tm) Tests <http://book.cakephp.org/2.0/en/development/testing.html>
+ * Copyright 2005-2012, Cake Software Foundation, Inc. (http://cakefoundation.org)
+ *
+ * Licensed under The MIT License
+ * Redistributions of files must retain the above copyright notice
+ *
+ * @copyright Copyright 2005-2012, Cake Software Foundation, Inc. (http://cakefoundation.org)
+ * @link http://book.cakephp.org/2.0/en/development/testing.html CakePHP(tm) Tests
+ * @package Cake.Test.Case.Model
+ * @since CakePHP(tm) v 1.2.0.5550
+ * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
+ */
+
+App::uses('CakeSchema', 'Model');
+App::uses('CakeTestFixture', 'TestSuite/Fixture');
+
+/**
+ * Test for Schema database management
+ *
+ * @package Cake.Test.Case.Model
+ */
+class MyAppSchema extends CakeSchema {
+
+/**
+ * name property
+ *
+ * @var string 'MyApp'
+ */
+ public $name = 'MyApp';
+
+/**
+ * connection property
+ *
+ * @var string 'test'
+ */
+ public $connection = 'test';
+
+/**
+ * comments property
+ *
+ * @var array
+ */
+ public $comments = array(
+ 'id' => array('type' => 'integer', 'null' => false, 'default' => 0, 'key' => 'primary'),
+ 'post_id' => array('type' => 'integer', 'null' => false, 'default' => 0),
+ 'user_id' => array('type' => 'integer', 'null' => false),
+ 'title' => array('type' => 'string', 'null' => false, 'length' => 100),
+ 'comment' => array('type' => 'text', 'null' => false, 'default' => null),
+ 'published' => array('type' => 'string', 'null' => true, 'default' => 'N', 'length' => 1),
+ 'created' => array('type' => 'datetime', 'null' => true, 'default' => null),
+ 'updated' => array('type' => 'datetime', 'null' => true, 'default' => null),
+ 'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => true)),
+ );
+
+/**
+ * posts property
+ *
+ * @var array
+ */
+ public $posts = array(
+ 'id' => array('type' => 'integer', 'null' => false, 'default' => 0, 'key' => 'primary'),
+ 'author_id' => array('type' => 'integer', 'null' => true, 'default' => ''),
+ 'title' => array('type' => 'string', 'null' => false, 'default' => 'Title'),
+ 'body' => array('type' => 'text', 'null' => true, 'default' => null),
+ 'summary' => array('type' => 'text', 'null' => true),
+ 'published' => array('type' => 'string', 'null' => true, 'default' => 'Y', 'length' => 1),
+ 'created' => array('type' => 'datetime', 'null' => true, 'default' => null),
+ 'updated' => array('type' => 'datetime', 'null' => true, 'default' => null),
+ 'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => true)),
+ );
+
+/**
+ * _foo property
+ *
+ * @var array
+ */
+ protected $_foo = array('bar');
+
+/**
+ * setup method
+ *
+ * @param mixed $version
+ * @return void
+ */
+ public function setup($version) {
+ }
+
+/**
+ * teardown method
+ *
+ * @param mixed $version
+ * @return void
+ */
+ public function teardown($version) {
+ }
+
+/**
+ * getVar method
+ *
+ * @param string $var Name of var
+ * @return mixed
+ */
+ public function getVar($var) {
+ if (!isset($this->$var)) {
+ return null;
+ }
+ return $this->$var;
+ }
+
+}
+
+/**
+ * TestAppSchema class
+ *
+ * @package Cake.Test.Case.Model
+ */
+class TestAppSchema extends CakeSchema {
+
+/**
+ * name property
+ *
+ * @var string 'MyApp'
+ */
+ public $name = 'MyApp';
+
+/**
+ * comments property
+ *
+ * @var array
+ */
+ public $comments = array(
+ 'id' => array('type' => 'integer', 'null' => false, 'default' => 0,'key' => 'primary'),
+ 'article_id' => array('type' => 'integer', 'null' => false),
+ 'user_id' => array('type' => 'integer', 'null' => false),
+ 'comment' => array('type' => 'text', 'null' => true, 'default' => null),
+ 'published' => array('type' => 'string', 'null' => true, 'default' => 'N', 'length' => 1),
+ 'created' => array('type' => 'datetime', 'null' => true, 'default' => null),
+ 'updated' => array('type' => 'datetime', 'null' => true, 'default' => null),
+ 'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => true)),
+ 'tableParameters' => array(),
+ );
+
+/**
+ * posts property
+ *
+ * @var array
+ */
+ public $posts = array(
+ 'id' => array('type' => 'integer', 'null' => false, 'default' => 0, 'key' => 'primary'),
+ 'author_id' => array('type' => 'integer', 'null' => false),
+ 'title' => array('type' => 'string', 'null' => false),
+ 'body' => array('type' => 'text', 'null' => true, 'default' => null),
+ 'published' => array('type' => 'string', 'null' => true, 'default' => 'N', 'length' => 1),
+ 'created' => array('type' => 'datetime', 'null' => true, 'default' => null),
+ 'updated' => array('type' => 'datetime', 'null' => true, 'default' => null),
+ 'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => true)),
+ 'tableParameters' => array(),
+ );
+
+/**
+ * posts_tags property
+ *
+ * @var array
+ */
+ public $posts_tags = array(
+ 'post_id' => array('type' => 'integer', 'null' => false, 'key' => 'primary'),
+ 'tag_id' => array('type' => 'string', 'null' => false, 'key' => 'primary'),
+ 'indexes' => array('posts_tag' => array('column' => array('tag_id', 'post_id'), 'unique' => 1)),
+ 'tableParameters' => array()
+ );
+
+/**
+ * tags property
+ *
+ * @var array
+ */
+ public $tags = array(
+ 'id' => array('type' => 'integer', 'null' => false, 'default' => 0, 'key' => 'primary'),
+ 'tag' => array('type' => 'string', 'null' => false),
+ 'created' => array('type' => 'datetime', 'null' => true, 'default' => null),
+ 'updated' => array('type' => 'datetime', 'null' => true, 'default' => null),
+ 'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => true)),
+ 'tableParameters' => array()
+ );
+
+/**
+ * datatypes property
+ *
+ * @var array
+ */
+ public $datatypes = array(
+ 'id' => array('type' => 'integer', 'null' => false, 'default' => 0, 'key' => 'primary'),
+ 'float_field' => array('type' => 'float', 'null' => false, 'length' => '5,2', 'default' => ''),
+ 'bool' => array('type' => 'boolean', 'null' => false, 'default' => false),
+ 'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => true)),
+ 'tableParameters' => array()
+ );
+
+/**
+ * setup method
+ *
+ * @param mixed $version
+ * @return void
+ */
+ public function setup($version) {
+ }
+
+/**
+ * teardown method
+ *
+ * @param mixed $version
+ * @return void
+ */
+ public function teardown($version) {
+ }
+
+}
+
+/**
+ * SchemaPost class
+ *
+ * @package Cake.Test.Case.Model
+ */
+class SchemaPost extends CakeTestModel {
+
+/**
+ * name property
+ *
+ * @var string 'SchemaPost'
+ */
+ public $name = 'SchemaPost';
+
+/**
+ * useTable property
+ *
+ * @var string 'posts'
+ */
+ public $useTable = 'posts';
+
+/**
+ * hasMany property
+ *
+ * @var array
+ */
+ public $hasMany = array('SchemaComment');
+
+/**
+ * hasAndBelongsToMany property
+ *
+ * @var array
+ */
+ public $hasAndBelongsToMany = array('SchemaTag');
+}
+
+/**
+ * SchemaComment class
+ *
+ * @package Cake.Test.Case.Model
+ */
+class SchemaComment extends CakeTestModel {
+
+/**
+ * name property
+ *
+ * @var string 'SchemaComment'
+ */
+ public $name = 'SchemaComment';
+
+/**
+ * useTable property
+ *
+ * @var string 'comments'
+ */
+ public $useTable = 'comments';
+
+/**
+ * belongsTo property
+ *
+ * @var array
+ */
+ public $belongsTo = array('SchemaPost');
+}
+
+/**
+ * SchemaTag class
+ *
+ * @package Cake.Test.Case.Model
+ */
+class SchemaTag extends CakeTestModel {
+
+/**
+ * name property
+ *
+ * @var string 'SchemaTag'
+ */
+ public $name = 'SchemaTag';
+
+/**
+ * useTable property
+ *
+ * @var string 'tags'
+ */
+ public $useTable = 'tags';
+
+/**
+ * hasAndBelongsToMany property
+ *
+ * @var array
+ */
+ public $hasAndBelongsToMany = array('SchemaPost');
+}
+
+/**
+ * SchemaDatatype class
+ *
+ * @package Cake.Test.Case.Model
+ */
+class SchemaDatatype extends CakeTestModel {
+
+/**
+ * name property
+ *
+ * @var string 'SchemaDatatype'
+ */
+ public $name = 'SchemaDatatype';
+
+/**
+ * useTable property
+ *
+ * @var string 'datatypes'
+ */
+ public $useTable = 'datatypes';
+}
+
+/**
+ * Testdescribe class
+ *
+ * This class is defined purely to inherit the cacheSources variable otherwise
+ * testSchemaCreateTable will fail if listSources has already been called and
+ * its source cache populated - I.e. if the test is run within a group
+ *
+ * @uses CakeTestModel
+ * @package
+ * @package Cake.Test.Case.Model
+ */
+class Testdescribe extends CakeTestModel {
+
+/**
+ * name property
+ *
+ * @var string 'Testdescribe'
+ */
+ public $name = 'Testdescribe';
+}
+
+/**
+ * SchemaCrossDatabase class
+ *
+ * @package Cake.Test.Case.Model
+ */
+class SchemaCrossDatabase extends CakeTestModel {
+
+/**
+ * name property
+ *
+ * @var string 'SchemaCrossDatabase'
+ */
+ public $name = 'SchemaCrossDatabase';
+
+/**
+ * useTable property
+ *
+ * @var string 'posts'
+ */
+ public $useTable = 'cross_database';
+
+/**
+ * useDbConfig property
+ *
+ * @var string 'test2'
+ */
+ public $useDbConfig = 'test2';
+}
+
+/**
+ * SchemaCrossDatabaseFixture class
+ *
+ * @package Cake.Test.Case.Model
+ */
+class SchemaCrossDatabaseFixture extends CakeTestFixture {
+
+/**
+ * name property
+ *
+ * @var string 'CrossDatabase'
+ */
+ public $name = 'CrossDatabase';
+
+/**
+ * table property
+ *
+ */
+ public $table = 'cross_database';
+
+/**
+ * fields property
+ *
+ * @var array
+ */
+ public $fields = array(
+ 'id' => array('type' => 'integer', 'key' => 'primary'),
+ 'name' => 'string'
+ );
+
+/**
+ * records property
+ *
+ * @var array
+ */
+ public $records = array(
+ array('id' => 1, 'name' => 'First'),
+ array('id' => 2, 'name' => 'Second'),
+ );
+}
+
+/**
+ * SchemaPrefixAuthUser class
+ *
+ * @package Cake.Test.Case.Model
+ */
+class SchemaPrefixAuthUser extends CakeTestModel {
+
+/**
+ * name property
+ *
+ * @var string
+ */
+ public $name = 'SchemaPrefixAuthUser';
+
+/**
+ * table prefix
+ *
+ * @var string
+ */
+ public $tablePrefix = 'auth_';
+
+/**
+ * useTable
+ *
+ * @var string
+ */
+ public $useTable = 'users';
+}
+
+/**
+ * CakeSchemaTest
+ *
+ * @package Cake.Test.Case.Model
+ */
+class CakeSchemaTest extends CakeTestCase {
+
+/**
+ * fixtures property
+ *
+ * @var array
+ */
+ public $fixtures = array(
+ 'core.post', 'core.tag', 'core.posts_tag', 'core.test_plugin_comment',
+ 'core.datatype', 'core.auth_user', 'core.author',
+ 'core.test_plugin_article', 'core.user', 'core.comment',
+ 'core.prefix_test'
+ );
+
+/**
+ * setUp method
+ *
+ * @return void
+ */
+ public function setUp() {
+ parent::setUp();
+ ConnectionManager::getDataSource('test')->cacheSources = false;
+ $this->Schema = new TestAppSchema();
+ }
+
+/**
+ * tearDown method
+ *
+ * @return void
+ */
+ public function tearDown() {
+ parent::tearDown();
+ if (file_exists(TMP . 'tests' . DS . 'schema.php')) {
+ unlink(TMP . 'tests' . DS . 'schema.php');
+ }
+ unset($this->Schema);
+ CakePlugin::unload();
+ }
+
+/**
+ * testSchemaName method
+ *
+ * @return void
+ */
+ public function testSchemaName() {
+ $Schema = new CakeSchema();
+ $this->assertEquals(Inflector::camelize(Inflector::slug(APP_DIR)), $Schema->name);
+
+ Configure::write('App.dir', 'Some.name.with.dots');
+ $Schema = new CakeSchema();
+ $this->assertEquals('SomeNameWithDots', $Schema->name);
+
+ Configure::write('App.dir', 'Some-name-with-dashes');
+ $Schema = new CakeSchema();
+ $this->assertEquals('SomeNameWithDashes', $Schema->name);
+
+ Configure::write('App.dir', 'Some name with spaces');
+ $Schema = new CakeSchema();
+ $this->assertEquals('SomeNameWithSpaces', $Schema->name);
+
+ Configure::write('App.dir', 'Some,name;with&weird=characters');
+ $Schema = new CakeSchema();
+ $this->assertEquals('SomeNameWithWeirdCharacters', $Schema->name);
+
+ Configure::write('App.dir', 'app');
+ }
+
+/**
+ * testSchemaRead method
+ *
+ * @return void
+ */
+ public function testSchemaRead() {
+ $read = $this->Schema->read(array(
+ 'connection' => 'test',
+ 'name' => 'TestApp',
+ 'models' => array('SchemaPost', 'SchemaComment', 'SchemaTag', 'SchemaDatatype')
+ ));
+ unset($read['tables']['missing']);
+
+ $expected = array('comments', 'datatypes', 'posts', 'posts_tags', 'tags');
+ foreach ($expected as $table) {
+ $this->assertTrue(isset($read['tables'][$table]), 'Missing table ' . $table);
+ }
+ foreach ($this->Schema->tables as $table => $fields) {
+ $this->assertEquals(array_keys($fields), array_keys($read['tables'][$table]));
+ }
+
+ if (isset($read['tables']['datatypes']['float_field']['length'])) {
+ $this->assertEquals(
+ $read['tables']['datatypes']['float_field']['length'],
+ $this->Schema->tables['datatypes']['float_field']['length']
+ );
+ }
+
+ $this->assertEquals(
+ $read['tables']['datatypes']['float_field']['type'],
+ $this->Schema->tables['datatypes']['float_field']['type']
+ );
+
+ $this->assertEquals(
+ $read['tables']['datatypes']['float_field']['null'],
+ $this->Schema->tables['datatypes']['float_field']['null']
+ );
+
+ $db = ConnectionManager::getDataSource('test');
+ $config = $db->config;
+ $config['prefix'] = 'schema_test_prefix_';
+ ConnectionManager::create('schema_prefix', $config);
+ $read = $this->Schema->read(array('connection' => 'schema_prefix', 'models' => false));
+ $this->assertTrue(empty($read['tables']));
+
+ $read = $this->Schema->read(array(
+ 'connection' => 'test',
+ 'name' => 'TestApp',
+ 'models' => array('SchemaComment', 'SchemaTag', 'SchemaPost')
+ ));
+ $this->assertFalse(isset($read['tables']['missing']['posts_tags']), 'Join table marked as missing');
+ }
+
+/**
+ * testSchemaReadWithAppModel method
+ *
+ * @access public
+ * @return void
+ */
+ public function testSchemaReadWithAppModel() {
+ $connections = ConnectionManager::enumConnectionObjects();
+ ConnectionManager::drop('default');
+ ConnectionManager::create('default', $connections['test']);
+ try {
+ $read = $this->Schema->read(array(
+ 'connection' => 'default',
+ 'name' => 'TestApp',
+ 'models' => array('AppModel')
+ ));
+ } catch(MissingTableException $mte) {
+ ConnectionManager::drop('default');
+ $this->fail($mte->getMessage());
+ }
+ ConnectionManager::drop('default');
+ }
+
+/**
+ * testSchemaReadWithOddTablePrefix method
+ *
+ * @return void
+ */
+ public function testSchemaReadWithOddTablePrefix() {
+ $config = ConnectionManager::getDataSource('test')->config;
+ $this->skipIf(!empty($config['prefix']), 'This test can not be executed with datasource prefix set.');
+
+ $SchemaPost = ClassRegistry::init('SchemaPost');
+ $SchemaPost->tablePrefix = 'po';
+ $SchemaPost->useTable = 'sts';
+ $read = $this->Schema->read(array(
+ 'connection' => 'test',
+ 'name' => 'TestApp',
+ 'models' => array('SchemaPost')
+ ));
+
+ $this->assertFalse(isset($read['tables']['missing']['posts']), 'Posts table was not read from tablePrefix');
+ }
+
+/**
+ * test read() with tablePrefix properties.
+ *
+ * @return void
+ */
+ public function testSchemaReadWithTablePrefix() {
+ $config = ConnectionManager::getDataSource('test')->config;
+ $this->skipIf(!empty($config['prefix']), 'This test can not be executed with datasource prefix set.');
+
+ $model = new SchemaPrefixAuthUser();
+
+ $Schema = new CakeSchema();
+ $read = $Schema->read(array(
+ 'connection' => 'test',
+ 'name' => 'TestApp',
+ 'models' => array('SchemaPrefixAuthUser')
+ ));
+ unset($read['tables']['missing']);
+ $this->assertTrue(isset($read['tables']['auth_users']), 'auth_users key missing %s');
+ }
+
+/**
+ * test reading schema with config prefix.
+ *
+ * @return void
+ */
+ public function testSchemaReadWithConfigPrefix() {
+ $this->skipIf($this->db instanceof Sqlite, 'Cannot open 2 connections to Sqlite');
+
+ $db = ConnectionManager::getDataSource('test');
+ $config = $db->config;
+ $this->skipIf(!empty($config['prefix']), 'This test can not be executed with datasource prefix set.');
+
+ $config['prefix'] = 'schema_test_prefix_';
+ ConnectionManager::create('schema_prefix', $config);
+ $read = $this->Schema->read(array('connection' => 'schema_prefix', 'models' => false));
+ $this->assertTrue(empty($read['tables']));
+
+ $config['prefix'] = 'prefix_';
+ ConnectionManager::create('schema_prefix2', $config);
+ $read = $this->Schema->read(array(
+ 'connection' => 'schema_prefix2',
+ 'name' => 'TestApp',
+ 'models' => false));
+ $this->assertTrue(isset($read['tables']['prefix_tests']));
+ }
+
+/**
+ * test reading schema from plugins.
+ *
+ * @return void
+ */
+ public function testSchemaReadWithPlugins() {
+ App::objects('model', null, false);
+ App::build(array(
+ 'Plugin' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS)
+ ));
+ CakePlugin::load('TestPlugin');
+
+ $Schema = new CakeSchema();
+ $Schema->plugin = 'TestPlugin';
+ $read = $Schema->read(array(
+ 'connection' => 'test',
+ 'name' => 'TestApp',
+ 'models' => true
+ ));
+ unset($read['tables']['missing']);
+ $this->assertTrue(isset($read['tables']['auth_users']));
+ $this->assertTrue(isset($read['tables']['authors']));
+ $this->assertTrue(isset($read['tables']['test_plugin_comments']));
+ $this->assertTrue(isset($read['tables']['posts']));
+ $this->assertTrue(count($read['tables']) >= 4);
+
+ App::build();
+ }
+
+/**
+ * test reading schema with tables from another database.
+ *
+ * @return void
+ */
+ public function testSchemaReadWithCrossDatabase() {
+ $config = ConnectionManager::enumConnectionObjects();
+ $this->skipIf(
+ !isset($config['test']) || !isset($config['test2']),
+ 'Primary and secondary test databases not configured, ' .
+ 'skipping cross-database join tests. ' .
+ 'To run these tests, you must define $test and $test2 in your database configuration.'
+ );
+
+ $db = ConnectionManager::getDataSource('test2');
+ $fixture = new SchemaCrossDatabaseFixture();
+ $fixture->create($db);
+ $fixture->insert($db);
+
+ $read = $this->Schema->read(array(
+ 'connection' => 'test',
+ 'name' => 'TestApp',
+ 'models' => array('SchemaCrossDatabase', 'SchemaPost')
+ ));
+ $this->assertTrue(isset($read['tables']['posts']));
+ $this->assertFalse(isset($read['tables']['cross_database']), 'Cross database should not appear');
+ $this->assertFalse(isset($read['tables']['missing']['cross_database']), 'Cross database should not appear');
+
+ $read = $this->Schema->read(array(
+ 'connection' => 'test2',
+ 'name' => 'TestApp',
+ 'models' => array('SchemaCrossDatabase', 'SchemaPost')
+ ));
+ $this->assertFalse(isset($read['tables']['posts']), 'Posts should not appear');
+ $this->assertFalse(isset($read['tables']['posts']), 'Posts should not appear');
+ $this->assertTrue(isset($read['tables']['cross_database']));
+
+ $fixture->drop($db);
+ }
+
+/**
+ * test that tables are generated correctly
+ *
+ * @return void
+ */
+ public function testGenerateTable() {
+ $posts = array(
+ 'id' => array('type' => 'integer', 'null' => false, 'default' => 0, 'key' => 'primary'),
+ 'author_id' => array('type' => 'integer', 'null' => false),
+ 'title' => array('type' => 'string', 'null' => false),
+ 'body' => array('type' => 'text', 'null' => true, 'default' => null),
+ 'published' => array('type' => 'string', 'null' => true, 'default' => 'N', 'length' => 1),
+ 'created' => array('type' => 'datetime', 'null' => true, 'default' => null),
+ 'updated' => array('type' => 'datetime', 'null' => true, 'default' => null),
+ 'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => true)),
+ );
+ $result = $this->Schema->generateTable('posts', $posts);
+ $this->assertRegExp('/public \$posts/', $result);
+ }
+
+/**
+ * testSchemaWrite method
+ *
+ * @return void
+ */
+ public function testSchemaWrite() {
+ $write = $this->Schema->write(array(
+ 'name' => 'MyOtherApp',
+ 'tables' => $this->Schema->tables,
+ 'path' => TMP . 'tests'
+ ));
+ $file = file_get_contents(TMP . 'tests' . DS . 'schema.php');
+ $this->assertEquals($write, $file);
+
+ require_once TMP . 'tests' . DS . 'schema.php';
+ $OtherSchema = new MyOtherAppSchema();
+ $this->assertEquals($this->Schema->tables, $OtherSchema->tables);
+ }
+
+/**
+ * testSchemaComparison method
+ *
+ * @return void
+ */
+ public function testSchemaComparison() {
+ $New = new MyAppSchema();
+ $compare = $New->compare($this->Schema);
+ $expected = array(
+ 'comments' => array(
+ 'add' => array(
+ 'post_id' => array('type' => 'integer', 'null' => false, 'default' => 0, 'after' => 'id'),
+ 'title' => array('type' => 'string', 'null' => false, 'length' => 100, 'after' => 'user_id'),
+ ),
+ 'drop' => array(
+ 'article_id' => array('type' => 'integer', 'null' => false),
+ 'tableParameters' => array(),
+ ),
+ 'change' => array(
+ 'comment' => array('type' => 'text', 'null' => false, 'default' => null),
+ )
+ ),
+ 'posts' => array(
+ 'add' => array(
+ 'summary' => array('type' => 'text', 'null' => true, 'after' => 'body'),
+ ),
+ 'drop' => array(
+ 'tableParameters' => array(),
+ ),
+ 'change' => array(
+ 'author_id' => array('type' => 'integer', 'null' => true, 'default' => ''),
+ 'title' => array('type' => 'string', 'null' => false, 'default' => 'Title'),
+ 'published' => array('type' => 'string', 'null' => true, 'default' => 'Y', 'length' => 1)
+ )
+ ),
+ );
+ $this->assertEquals($expected, $compare);
+ $this->assertNull($New->getVar('comments'));
+ $this->assertEquals(array('bar'), $New->getVar('_foo'));
+
+ $tables = array(
+ 'missing' => array(
+ 'categories' => array(
+ 'id' => array('type' => 'integer', 'null' => false, 'default' => null, 'key' => 'primary'),
+ 'created' => array('type' => 'datetime', 'null' => false, 'default' => null),
+ 'modified' => array('type' => 'datetime', 'null' => false, 'default' => null),
+ 'name' => array('type' => 'string', 'null' => false, 'default' => null, 'length' => 100),
+ 'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1)),
+ 'tableParameters' => array('charset' => 'latin1', 'collate' => 'latin1_swedish_ci', 'engine' => 'MyISAM')
+ )
+ ),
+ 'ratings' => array(
+ 'id' => array('type' => 'integer', 'null' => false, 'default' => null, 'key' => 'primary'),
+ 'foreign_key' => array('type' => 'integer', 'null' => false, 'default' => null),
+ 'model' => array('type' => 'varchar', 'null' => false, 'default' => null),
+ 'value' => array('type' => 'float', 'null' => false, 'length' => '5,2', 'default' => null),
+ 'created' => array('type' => 'datetime', 'null' => false, 'default' => null),
+ 'modified' => array('type' => 'datetime', 'null' => false, 'default' => null),
+ 'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1)),
+ 'tableParameters' => array('charset' => 'latin1', 'collate' => 'latin1_swedish_ci', 'engine' => 'MyISAM')
+ )
+ );
+ $compare = $New->compare($this->Schema, $tables);
+ $expected = array(
+ 'ratings' => array(
+ 'add' => array(
+ 'id' => array('type' => 'integer', 'null' => false, 'default' => null, 'key' => 'primary'),
+ 'foreign_key' => array('type' => 'integer', 'null' => false, 'default' => null, 'after' => 'id'),
+ 'model' => array('type' => 'varchar', 'null' => false, 'default' => null, 'after' => 'foreign_key'),
+ 'value' => array('type' => 'float', 'null' => false, 'length' => '5,2', 'default' => null, 'after' => 'model'),
+ 'created' => array('type' => 'datetime', 'null' => false, 'default' => null, 'after' => 'value'),
+ 'modified' => array('type' => 'datetime', 'null' => false, 'default' => null, 'after' => 'created'),
+ 'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1)),
+ 'tableParameters' => array('charset' => 'latin1', 'collate' => 'latin1_swedish_ci', 'engine' => 'MyISAM')
+ )
+ )
+ );
+ $this->assertEquals($expected, $compare);
+ }
+
+/**
+ * test comparing '' and null and making sure they are different.
+ *
+ * @return void
+ */
+ public function testCompareEmptyStringAndNull() {
+ $One = new CakeSchema(array(
+ 'posts' => array(
+ 'id' => array('type' => 'integer', 'null' => false, 'default' => null, 'key' => 'primary'),
+ 'name' => array('type' => 'string', 'null' => false, 'default' => '')
+ )
+ ));
+ $Two = new CakeSchema(array(
+ 'posts' => array(
+ 'id' => array('type' => 'integer', 'null' => false, 'default' => null, 'key' => 'primary'),
+ 'name' => array('type' => 'string', 'null' => false, 'default' => null)
+ )
+ ));
+ $compare = $One->compare($Two);
+ $expected = array(
+ 'posts' => array(
+ 'change' => array(
+ 'name' => array('type' => 'string', 'null' => false, 'default' => null)
+ )
+ )
+ );
+ $this->assertEquals($expected, $compare);
+ }
+
+/**
+ * Test comparing tableParameters and indexes.
+ *
+ * @return void
+ */
+ public function testTableParametersAndIndexComparison() {
+ $old = array(
+ 'posts' => array(
+ 'id' => array('type' => 'integer', 'null' => false, 'default' => 0, 'key' => 'primary'),
+ 'author_id' => array('type' => 'integer', 'null' => false),
+ 'title' => array('type' => 'string', 'null' => false),
+ 'indexes' => array(
+ 'PRIMARY' => array('column' => 'id', 'unique' => true)
+ ),
+ 'tableParameters' => array(
+ 'charset' => 'latin1',
+ 'collate' => 'latin1_general_ci'
+ )
+ ),
+ 'comments' => array(
+ 'id' => array('type' => 'integer', 'null' => false, 'default' => 0, 'key' => 'primary'),
+ 'post_id' => array('type' => 'integer', 'null' => false, 'default' => 0),
+ 'comment' => array('type' => 'text'),
+ 'indexes' => array(
+ 'PRIMARY' => array('column' => 'id', 'unique' => true),
+ 'post_id' => array('column' => 'post_id'),
+ ),
+ 'tableParameters' => array(
+ 'engine' => 'InnoDB',
+ 'charset' => 'latin1',
+ 'collate' => 'latin1_general_ci'
+ )
+ )
+ );
+ $new = array(
+ 'posts' => array(
+ 'id' => array('type' => 'integer', 'null' => false, 'default' => 0, 'key' => 'primary'),
+ 'author_id' => array('type' => 'integer', 'null' => false),
+ 'title' => array('type' => 'string', 'null' => false),
+ 'indexes' => array(
+ 'PRIMARY' => array('column' => 'id', 'unique' => true),
+ 'author_id' => array('column' => 'author_id'),
+ ),
+ 'tableParameters' => array(
+ 'charset' => 'utf8',
+ 'collate' => 'utf8_general_ci',
+ 'engine' => 'MyISAM'
+ )
+ ),
+ 'comments' => array(
+ 'id' => array('type' => 'integer', 'null' => false, 'default' => 0, 'key' => 'primary'),
+ 'post_id' => array('type' => 'integer', 'null' => false, 'default' => 0),
+ 'comment' => array('type' => 'text'),
+ 'indexes' => array(
+ 'PRIMARY' => array('column' => 'id', 'unique' => true),
+ ),
+ 'tableParameters' => array(
+ 'charset' => 'utf8',
+ 'collate' => 'utf8_general_ci'
+ )
+ )
+ );
+ $compare = $this->Schema->compare($old, $new);
+ $expected = array(
+ 'posts' => array(
+ 'add' => array(
+ 'indexes' => array('author_id' => array('column' => 'author_id')),
+ ),
+ 'change' => array(
+ 'tableParameters' => array(
+ 'charset' => 'utf8',
+ 'collate' => 'utf8_general_ci',
+ 'engine' => 'MyISAM'
+ )
+ )
+ ),
+ 'comments' => array(
+ 'drop' => array(
+ 'indexes' => array('post_id' => array('column' => 'post_id')),
+ ),
+ 'change' => array(
+ 'tableParameters' => array(
+ 'charset' => 'utf8',
+ 'collate' => 'utf8_general_ci',
+ )
+ )
+ )
+ );
+ $this->assertEquals($expected, $compare);
+ }
+
+/**
+ * Test comparing with field changed from VARCHAR to DATETIME
+ *
+ * @return void
+ */
+ public function testCompareVarcharToDatetime() {
+ $old = array(
+ 'posts' => array(
+ 'id' => array('type' => 'integer', 'null' => false, 'default' => 0, 'key' => 'primary'),
+ 'author_id' => array('type' => 'integer', 'null' => false),
+ 'title' => array('type' => 'string', 'null' => true, 'length' => 45),
+ 'indexes' => array(
+ 'PRIMARY' => array('column' => 'id', 'unique' => true)
+ ),
+ 'tableParameters' => array(
+ 'charset' => 'latin1',
+ 'collate' => 'latin1_general_ci'
+ )
+ ),
+ );
+ $new = array(
+ 'posts' => array(
+ 'id' => array('type' => 'integer', 'null' => false, 'default' => 0, 'key' => 'primary'),
+ 'author_id' => array('type' => 'integer', 'null' => false),
+ 'title' => array('type' => 'datetime', 'null' => false),
+ 'indexes' => array(
+ 'PRIMARY' => array('column' => 'id', 'unique' => true)
+ ),
+ 'tableParameters' => array(
+ 'charset' => 'latin1',
+ 'collate' => 'latin1_general_ci'
+ )
+ ),
+ );
+ $compare = $this->Schema->compare($old, $new);
+ $expected = array(
+ 'posts' => array(
+ 'change' => array(
+ 'title' => array(
+ 'type' => 'datetime',
+ 'null' => false,
+ )
+ )
+ ),
+ );
+ $this->assertEquals($expected, $compare, 'Invalid SQL, datetime does not have length');
+ }
+
+/**
+ * testSchemaLoading method
+ *
+ * @return void
+ */
+ public function testSchemaLoading() {
+ $Other = $this->Schema->load(array('name' => 'MyOtherApp', 'path' => TMP . 'tests'));
+ $this->assertEquals('MyOtherApp', $Other->name);
+ $this->assertEquals($Other->tables, $this->Schema->tables);
+ }
+
+/**
+ * test loading schema files inside of plugins.
+ *
+ * @return void
+ */
+ public function testSchemaLoadingFromPlugin() {
+ App::build(array(
+ 'Plugin' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS)
+ ));
+ CakePlugin::load('TestPlugin');
+ $Other = $this->Schema->load(array('name' => 'TestPluginApp', 'plugin' => 'TestPlugin'));
+ $this->assertEquals('TestPluginApp', $Other->name);
+ $this->assertEquals(array('test_plugin_acos'), array_keys($Other->tables));
+
+ App::build();
+ }
+
+/**
+ * testSchemaCreateTable method
+ *
+ * @return void
+ */
+ public function testSchemaCreateTable() {
+ $db = ConnectionManager::getDataSource('test');
+ $db->cacheSources = false;
+
+ $Schema = new CakeSchema(array(
+ 'connection' => 'test',
+ 'testdescribes' => array(
+ 'id' => array('type' => 'integer', 'key' => 'primary'),
+ 'int_null' => array('type' => 'integer', 'null' => true),
+ 'int_not_null' => array('type' => 'integer', 'null' => false),
+ ),
+ ));
+ $sql = $db->createSchema($Schema);
+
+ $col = $Schema->tables['testdescribes']['int_null'];
+ $col['name'] = 'int_null';
+ $column = $this->db->buildColumn($col);
+ $this->assertRegExp('/' . preg_quote($column, '/') . '/', $sql);
+
+ $col = $Schema->tables['testdescribes']['int_not_null'];
+ $col['name'] = 'int_not_null';
+ $column = $this->db->buildColumn($col);
+ $this->assertRegExp('/' . preg_quote($column, '/') . '/', $sql);
+ }
+}