| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033 |
- <?php
- /**
- * Test for Schema database management
- *
- *
- * PHP 5
- *
- * CakePHP(tm) Tests <http://book.cakephp.org/2.0/en/development/testing.html>
- * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
- *
- * Licensed under The MIT License
- * For full copyright and license information, please see the LICENSE.txt
- * Redistributions of files must retain the above copyright notice
- *
- * @copyright Copyright (c) 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 http://www.opensource.org/licenses/mit-license.php MIT License
- */
- App::uses('CakeSchema', 'Model');
- App::uses('CakeTestFixture', 'TestSuite/Fixture');
- /**
- * Test for Schema database management
- *
- * @package Cake.Test.Case.Model
- */
- class MyAppSchema extends CakeSchema {
- /**
- * connection property
- *
- * @var string
- */
- 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');
- /**
- * 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
- */
- 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' => ''),
- 'huge_int' => array('type' => 'biginteger'),
- '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 {
- /**
- * useTable property
- *
- * @var string
- */
- 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 {
- /**
- * useTable property
- *
- * @var string
- */
- public $useTable = 'comments';
- /**
- * belongsTo property
- *
- * @var array
- */
- public $belongsTo = array('SchemaPost');
- }
- /**
- * SchemaTag class
- *
- * @package Cake.Test.Case.Model
- */
- class SchemaTag extends CakeTestModel {
- /**
- * useTable property
- *
- * @var string
- */
- public $useTable = 'tags';
- /**
- * hasAndBelongsToMany property
- *
- * @var array
- */
- public $hasAndBelongsToMany = array('SchemaPost');
- }
- /**
- * SchemaDatatype class
- *
- * @package Cake.Test.Case.Model
- */
- class SchemaDatatype extends CakeTestModel {
- /**
- * useTable property
- *
- * @var string
- */
- 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 Cake.Test.Case.Model
- */
- class Testdescribe extends CakeTestModel {
- }
- /**
- * SchemaCrossDatabase class
- *
- * @package Cake.Test.Case.Model
- */
- class SchemaCrossDatabase extends CakeTestModel {
- /**
- * useTable property
- *
- * @var string
- */
- public $useTable = 'cross_database';
- /**
- * useDbConfig property
- *
- * @var string
- */
- public $useDbConfig = 'test2';
- }
- /**
- * SchemaCrossDatabaseFixture class
- *
- * @package Cake.Test.Case.Model
- */
- class SchemaCrossDatabaseFixture extends CakeTestFixture {
- /**
- * name property
- *
- * @var string
- */
- public $name = 'CrossDatabase';
- /**
- * table property
- *
- * @var string
- */
- 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 {
- /**
- * 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
- *
- * @return void
- */
- public function testSchemaReadWithAppModel() {
- $connections = ConnectionManager::enumConnectionObjects();
- ConnectionManager::drop('default');
- ConnectionManager::create('default', $connections['test']);
- try {
- $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.');
- $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);
- $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),
- 'MyFtIndex' => array('column' => array('title', 'body'), 'type' => 'fulltext')
- )
- );
- $result = $this->Schema->generateTable('fields', $posts);
- $this->assertRegExp('/public \$fields/', $result);
- $this->assertRegExp('/\'type\' \=\> \'fulltext\'/', $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(
- 'create' => 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')
- )
- )
- );
- $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);
- }
- }
|