Mercurial > hg > Members > shoshi > webvirt
diff cake/tests/cases/libs/model/model_integration.test.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/cases/libs/model/model_integration.test.php Sun Jul 24 21:08:31 2011 +0900 @@ -0,0 +1,1930 @@ +<?php +/* SVN FILE: $Id: model.test.php 8225 2009-07-08 03:25:30Z mark_story $ */ + +/** + * ModelIntegrationTest 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.tests.cases.libs.model + * @since CakePHP(tm) v 1.2.0.4206 + * @license http://www.opensource.org/licenses/opengroup.php The Open Group Test Suite License + */ +require_once dirname(__FILE__) . DS . 'model.test.php'; +App::import('Core', 'DboSource'); + +/** + * DboMock class + * A Dbo Source driver to mock a connection and a identity name() method + */ +class DboMock extends DboSource { + +/** +* Returns the $field without modifications +*/ + function name($field) { + return $field; + } +/** +* Returns true to fake a database connection +*/ + function connect() { + return true; + } +} + +/** + * ModelIntegrationTest + * + * @package cake + * @subpackage cake.tests.cases.libs.model.operations + */ +class ModelIntegrationTest extends BaseModelTest { + +/** + * testPkInHAbtmLinkModelArticleB + * + * @access public + * @return void + */ + function testPkInHabtmLinkModelArticleB() { + $this->loadFixtures('Article', 'Tag'); + $TestModel2 =& new ArticleB(); + $this->assertEqual($TestModel2->ArticlesTag->primaryKey, 'article_id'); + } + +/** + * Tests that $cacheSources can only be disabled in the db using model settings, not enabled + * + * @access public + * @return void + */ + function testCacheSourcesDisabling() { + $this->db->cacheSources = true; + $TestModel = new JoinA(); + $TestModel->cacheSources = false; + $TestModel->setSource('join_as'); + $this->assertFalse($this->db->cacheSources); + + $this->db->cacheSources = false; + $TestModel = new JoinA(); + $TestModel->cacheSources = true; + $TestModel->setSource('join_as'); + $this->assertFalse($this->db->cacheSources); + } + +/** + * testPkInHabtmLinkModel method + * + * @access public + * @return void + */ + function testPkInHabtmLinkModel() { + //Test Nonconformant Models + $this->loadFixtures('Content', 'ContentAccount', 'Account'); + $TestModel =& new Content(); + $this->assertEqual($TestModel->ContentAccount->primaryKey, 'iContentAccountsId'); + + //test conformant models with no PK in the join table + $this->loadFixtures('Article', 'Tag'); + $TestModel2 =& new Article(); + $this->assertEqual($TestModel2->ArticlesTag->primaryKey, 'article_id'); + + //test conformant models with PK in join table + $this->loadFixtures('Item', 'Portfolio', 'ItemsPortfolio'); + $TestModel3 =& new Portfolio(); + $this->assertEqual($TestModel3->ItemsPortfolio->primaryKey, 'id'); + + //test conformant models with PK in join table - join table contains extra field + $this->loadFixtures('JoinA', 'JoinB', 'JoinAB'); + $TestModel4 =& new JoinA(); + $this->assertEqual($TestModel4->JoinAsJoinB->primaryKey, 'id'); + + } + +/** + * testDynamicBehaviorAttachment method + * + * @access public + * @return void + */ + function testDynamicBehaviorAttachment() { + $this->loadFixtures('Apple'); + $TestModel =& new Apple(); + $this->assertEqual($TestModel->Behaviors->attached(), array()); + + $TestModel->Behaviors->attach('Tree', array('left' => 'left_field', 'right' => 'right_field')); + $this->assertTrue(is_object($TestModel->Behaviors->Tree)); + $this->assertEqual($TestModel->Behaviors->attached(), array('Tree')); + + $expected = array( + 'parent' => 'parent_id', + 'left' => 'left_field', + 'right' => 'right_field', + 'scope' => '1 = 1', + 'type' => 'nested', + '__parentChange' => false, + 'recursive' => -1 + ); + + $this->assertEqual($TestModel->Behaviors->Tree->settings['Apple'], $expected); + + $expected['enabled'] = false; + $TestModel->Behaviors->attach('Tree', array('enabled' => false)); + $this->assertEqual($TestModel->Behaviors->Tree->settings['Apple'], $expected); + $this->assertEqual($TestModel->Behaviors->attached(), array('Tree')); + + $TestModel->Behaviors->detach('Tree'); + $this->assertEqual($TestModel->Behaviors->attached(), array()); + $this->assertFalse(isset($TestModel->Behaviors->Tree)); + } + +/** + * Tests cross database joins. Requires $test and $test2 to both be set in DATABASE_CONFIG + * NOTE: When testing on MySQL, you must set 'persistent' => false on *both* database connections, + * or one connection will step on the other. + */ + function testCrossDatabaseJoins() { + $config = new DATABASE_CONFIG(); + + $skip = $this->skipIf( + !isset($config->test) || !isset($config->test2), + '%s 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.' + ); + + if ($skip) { + return; + } + + $this->loadFixtures('Article', 'Tag', 'ArticlesTag', 'User', 'Comment'); + $TestModel =& new Article(); + + $expected = array( + array( + 'Article' => array( + 'id' => '1', + 'user_id' => '1', + 'title' => 'First Article', + 'body' => 'First Article Body', + 'published' => 'Y', + 'created' => '2007-03-18 10:39:23', + 'updated' => '2007-03-18 10:41:31' + ), + 'User' => array( + 'id' => '1', + 'user' => 'mariano', + 'password' => '5f4dcc3b5aa765d61d8327deb882cf99', + 'created' => '2007-03-17 01:16:23', + 'updated' => '2007-03-17 01:18:31' + ), + 'Comment' => array( + array( + 'id' => '1', + 'article_id' => '1', + 'user_id' => '2', + 'comment' => 'First Comment for First Article', + 'published' => 'Y', + 'created' => '2007-03-18 10:45:23', + 'updated' => '2007-03-18 10:47:31' + ), + array( + 'id' => '2', + 'article_id' => '1', + 'user_id' => '4', + 'comment' => 'Second Comment for First Article', + 'published' => 'Y', + 'created' => '2007-03-18 10:47:23', + 'updated' => '2007-03-18 10:49:31' + ), + array( + 'id' => '3', + 'article_id' => '1', + 'user_id' => '1', + 'comment' => 'Third Comment for First Article', + 'published' => 'Y', + 'created' => '2007-03-18 10:49:23', + 'updated' => '2007-03-18 10:51:31' + ), + array( + 'id' => '4', + 'article_id' => '1', + 'user_id' => '1', + 'comment' => 'Fourth Comment for First Article', + 'published' => 'N', + 'created' => '2007-03-18 10:51:23', + 'updated' => '2007-03-18 10:53:31' + )), + 'Tag' => array( + array( + 'id' => '1', + 'tag' => 'tag1', + 'created' => '2007-03-18 12:22:23', + 'updated' => '2007-03-18 12:24:31' + ), + array( + 'id' => '2', + 'tag' => 'tag2', + 'created' => '2007-03-18 12:24:23', + 'updated' => '2007-03-18 12:26:31' + ))), + array( + 'Article' => array( + 'id' => '2', + 'user_id' => '3', + 'title' => 'Second Article', + 'body' => 'Second Article Body', + 'published' => 'Y', + 'created' => '2007-03-18 10:41:23', + 'updated' => '2007-03-18 10:43:31' + ), + 'User' => array( + 'id' => '3', + 'user' => 'larry', + 'password' => '5f4dcc3b5aa765d61d8327deb882cf99', + 'created' => '2007-03-17 01:20:23', + 'updated' => '2007-03-17 01:22:31' + ), + 'Comment' => array( + array( + 'id' => '5', + 'article_id' => '2', + 'user_id' => '1', + 'comment' => 'First Comment for Second Article', + 'published' => 'Y', + 'created' => '2007-03-18 10:53:23', + 'updated' => '2007-03-18 10:55:31' + ), + array( + 'id' => '6', + 'article_id' => '2', + 'user_id' => '2', + 'comment' => 'Second Comment for Second Article', + 'published' => 'Y', + 'created' => '2007-03-18 10:55:23', + 'updated' => '2007-03-18 10:57:31' + )), + 'Tag' => array( + array( + 'id' => '1', + 'tag' => 'tag1', + 'created' => '2007-03-18 12:22:23', + 'updated' => '2007-03-18 12:24:31' + ), + array( + 'id' => '3', + 'tag' => 'tag3', + 'created' => '2007-03-18 12:26:23', + 'updated' => '2007-03-18 12:28:31' + ))), + array( + 'Article' => array( + 'id' => '3', + 'user_id' => '1', + 'title' => 'Third Article', + 'body' => 'Third Article Body', + 'published' => 'Y', + 'created' => '2007-03-18 10:43:23', + 'updated' => '2007-03-18 10:45:31' + ), + 'User' => array( + 'id' => '1', + 'user' => 'mariano', + 'password' => '5f4dcc3b5aa765d61d8327deb882cf99', + 'created' => '2007-03-17 01:16:23', + 'updated' => '2007-03-17 01:18:31' + ), + 'Comment' => array(), + 'Tag' => array() + )); + $this->assertEqual($TestModel->find('all'), $expected); + + $db2 =& ConnectionManager::getDataSource('test2'); + + foreach (array('User', 'Comment') as $class) { + $this->_fixtures[$this->_fixtureClassMap[$class]]->create($db2); + $this->_fixtures[$this->_fixtureClassMap[$class]]->insert($db2); + $this->db->truncate(Inflector::pluralize(Inflector::underscore($class))); + } + + $this->assertEqual($TestModel->User->find('all'), array()); + $this->assertEqual($TestModel->Comment->find('all'), array()); + $this->assertEqual($TestModel->find('count'), 3); + + $TestModel->User->setDataSource('test2'); + $TestModel->Comment->setDataSource('test2'); + + foreach ($expected as $key => $value) { + unset($value['Comment'], $value['Tag']); + $expected[$key] = $value; + } + + $TestModel->recursive = 0; + $result = $TestModel->find('all'); + $this->assertEqual($result, $expected); + + foreach ($expected as $key => $value) { + unset($value['Comment'], $value['Tag']); + $expected[$key] = $value; + } + + $TestModel->recursive = 0; + $result = $TestModel->find('all'); + $this->assertEqual($result, $expected); + + $result = Set::extract($TestModel->User->find('all'), '{n}.User.id'); + $this->assertEqual($result, array('1', '2', '3', '4')); + $this->assertEqual($TestModel->find('all'), $expected); + + $TestModel->Comment->unbindModel(array('hasOne' => array('Attachment'))); + $expected = array( + array( + 'Comment' => array( + 'id' => '1', + 'article_id' => '1', + 'user_id' => '2', + 'comment' => 'First Comment for First Article', + 'published' => 'Y', + 'created' => '2007-03-18 10:45:23', + 'updated' => '2007-03-18 10:47:31' + ), + 'User' => array( + 'id' => '2', + 'user' => 'nate', + 'password' => '5f4dcc3b5aa765d61d8327deb882cf99', + 'created' => '2007-03-17 01:18:23', + 'updated' => '2007-03-17 01:20:31' + ), + 'Article' => array( + 'id' => '1', + 'user_id' => '1', + 'title' => 'First Article', + 'body' => 'First Article Body', + 'published' => 'Y', + 'created' => '2007-03-18 10:39:23', + 'updated' => '2007-03-18 10:41:31' + )), + array( + 'Comment' => array( + 'id' => '2', + 'article_id' => '1', + 'user_id' => '4', + 'comment' => 'Second Comment for First Article', + 'published' => 'Y', + 'created' => '2007-03-18 10:47:23', + 'updated' => '2007-03-18 10:49:31' + ), + 'User' => array( + 'id' => '4', + 'user' => 'garrett', + 'password' => '5f4dcc3b5aa765d61d8327deb882cf99', + 'created' => '2007-03-17 01:22:23', + 'updated' => '2007-03-17 01:24:31' + ), + 'Article' => array( + 'id' => '1', + 'user_id' => '1', + 'title' => 'First Article', + 'body' => 'First Article Body', + 'published' => 'Y', + 'created' => '2007-03-18 10:39:23', + 'updated' => '2007-03-18 10:41:31' + )), + array( + 'Comment' => array( + 'id' => '3', + 'article_id' => '1', + 'user_id' => '1', + 'comment' => 'Third Comment for First Article', + 'published' => 'Y', + 'created' => '2007-03-18 10:49:23', + 'updated' => '2007-03-18 10:51:31' + ), + 'User' => array( + 'id' => '1', + 'user' => 'mariano', + 'password' => '5f4dcc3b5aa765d61d8327deb882cf99', + 'created' => '2007-03-17 01:16:23', + 'updated' => '2007-03-17 01:18:31' + ), + 'Article' => array( + 'id' => '1', + 'user_id' => '1', + 'title' => 'First Article', + 'body' => 'First Article Body', + 'published' => 'Y', + 'created' => '2007-03-18 10:39:23', + 'updated' => '2007-03-18 10:41:31' + )), + array( + 'Comment' => array( + 'id' => '4', + 'article_id' => '1', + 'user_id' => '1', + 'comment' => 'Fourth Comment for First Article', + 'published' => 'N', + 'created' => '2007-03-18 10:51:23', + 'updated' => '2007-03-18 10:53:31' + ), + 'User' => array( + 'id' => '1', + 'user' => 'mariano', + 'password' => '5f4dcc3b5aa765d61d8327deb882cf99', + 'created' => '2007-03-17 01:16:23', + 'updated' => '2007-03-17 01:18:31' + ), + 'Article' => array( + 'id' => '1', + 'user_id' => '1', + 'title' => 'First Article', + 'body' => 'First Article Body', + 'published' => 'Y', + 'created' => '2007-03-18 10:39:23', + 'updated' => '2007-03-18 10:41:31' + )), + array( + 'Comment' => array( + 'id' => '5', + 'article_id' => '2', + 'user_id' => '1', + 'comment' => 'First Comment for Second Article', + 'published' => 'Y', + 'created' => '2007-03-18 10:53:23', + 'updated' => '2007-03-18 10:55:31' + ), + 'User' => array( + 'id' => '1', + 'user' => 'mariano', + 'password' => '5f4dcc3b5aa765d61d8327deb882cf99', + 'created' => '2007-03-17 01:16:23', + 'updated' => '2007-03-17 01:18:31' + ), + 'Article' => array( + 'id' => '2', + 'user_id' => '3', + 'title' => 'Second Article', + 'body' => 'Second Article Body', + 'published' => 'Y', + 'created' => '2007-03-18 10:41:23', + 'updated' => '2007-03-18 10:43:31' + )), + array( + 'Comment' => array( + 'id' => '6', + 'article_id' => '2', + 'user_id' => '2', + 'comment' => 'Second Comment for Second Article', + 'published' => 'Y', + 'created' => '2007-03-18 10:55:23', + 'updated' => '2007-03-18 10:57:31' + ), + 'User' => array( + 'id' => '2', + 'user' => 'nate', + 'password' => '5f4dcc3b5aa765d61d8327deb882cf99', + 'created' => '2007-03-17 01:18:23', + 'updated' => '2007-03-17 01:20:31' + ), + 'Article' => array( + 'id' => '2', + 'user_id' => '3', + 'title' => 'Second Article', + 'body' => 'Second Article Body', + 'published' => 'Y', + 'created' => '2007-03-18 10:41:23', + 'updated' => '2007-03-18 10:43:31' + ))); + $this->assertEqual($TestModel->Comment->find('all'), $expected); + + foreach (array('User', 'Comment') as $class) { + $this->_fixtures[$this->_fixtureClassMap[$class]]->drop($db2); + } + } + +/** + * testDisplayField method + * + * @access public + * @return void + */ + function testDisplayField() { + $this->loadFixtures('Post', 'Comment', 'Person'); + $Post = new Post(); + $Comment = new Comment(); + $Person = new Person(); + + $this->assertEqual($Post->displayField, 'title'); + $this->assertEqual($Person->displayField, 'name'); + $this->assertEqual($Comment->displayField, 'id'); + } + +/** + * testSchema method + * + * @access public + * @return void + */ + function testSchema() { + $Post = new Post(); + + $result = $Post->schema(); + $columns = array('id', 'author_id', 'title', 'body', 'published', 'created', 'updated'); + $this->assertEqual(array_keys($result), $columns); + + $types = array('integer', 'integer', 'string', 'text', 'string', 'datetime', 'datetime'); + $this->assertEqual(Set::extract(array_values($result), '{n}.type'), $types); + + $result = $Post->schema('body'); + $this->assertEqual($result['type'], 'text'); + $this->assertNull($Post->schema('foo')); + + $this->assertEqual($Post->getColumnTypes(), array_combine($columns, $types)); + } + +/** + * test deconstruct() with time fields. + * + * @return void + */ + function testDeconstructFieldsTime() { + $this->loadFixtures('Apple'); + $TestModel =& new Apple(); + + $data = array(); + $data['Apple']['mytime']['hour'] = ''; + $data['Apple']['mytime']['min'] = ''; + $data['Apple']['mytime']['sec'] = ''; + + $TestModel->data = null; + $TestModel->set($data); + $expected = array('Apple'=> array('mytime'=> '')); + $this->assertEqual($TestModel->data, $expected); + + $data = array(); + $data['Apple']['mytime']['hour'] = ''; + $data['Apple']['mytime']['min'] = ''; + $data['Apple']['mytime']['meridan'] = ''; + + $TestModel->data = null; + $TestModel->set($data); + $expected = array('Apple'=> array('mytime'=> '')); + $this->assertEqual($TestModel->data, $expected, 'Empty values are not returning properly. %s'); + + $data = array(); + $data['Apple']['mytime']['hour'] = '12'; + $data['Apple']['mytime']['min'] = '0'; + $data['Apple']['mytime']['meridian'] = 'am'; + + $TestModel->data = null; + $TestModel->set($data); + $expected = array('Apple'=> array('mytime'=> '00:00:00')); + $this->assertEqual($TestModel->data, $expected, 'Midnight is not returning proper values. %s'); + + $data = array(); + $data['Apple']['mytime']['hour'] = '00'; + $data['Apple']['mytime']['min'] = '00'; + + $TestModel->data = null; + $TestModel->set($data); + $expected = array('Apple'=> array('mytime'=> '00:00:00')); + $this->assertEqual($TestModel->data, $expected, 'Midnight is not returning proper values. %s'); + + $data = array(); + $data['Apple']['mytime']['hour'] = '03'; + $data['Apple']['mytime']['min'] = '04'; + $data['Apple']['mytime']['sec'] = '04'; + + $TestModel->data = null; + $TestModel->set($data); + $expected = array('Apple'=> array('mytime'=> '03:04:04')); + $this->assertEqual($TestModel->data, $expected); + + $data = array(); + $data['Apple']['mytime']['hour'] = '3'; + $data['Apple']['mytime']['min'] = '4'; + $data['Apple']['mytime']['sec'] = '4'; + + $TestModel->data = null; + $TestModel->set($data); + $expected = array('Apple' => array('mytime'=> '03:04:04')); + $this->assertEqual($TestModel->data, $expected); + + $data = array(); + $data['Apple']['mytime']['hour'] = '03'; + $data['Apple']['mytime']['min'] = '4'; + $data['Apple']['mytime']['sec'] = '4'; + + $TestModel->data = null; + $TestModel->set($data); + $expected = array('Apple'=> array('mytime'=> '03:04:04')); + $this->assertEqual($TestModel->data, $expected); + + $db = ConnectionManager::getDataSource('test_suite'); + $data = array(); + $data['Apple']['mytime'] = $db->expression('NOW()'); + $TestModel->data = null; + $TestModel->set($data); + $this->assertEqual($TestModel->data, $data); + } + +/** + * testDeconstructFields with datetime, timestamp, and date fields + * + * @access public + * @return void + */ + function testDeconstructFieldsDateTime() { + $this->loadFixtures('Apple'); + $TestModel =& new Apple(); + + //test null/empty values first + $data['Apple']['created']['year'] = ''; + $data['Apple']['created']['month'] = ''; + $data['Apple']['created']['day'] = ''; + $data['Apple']['created']['hour'] = ''; + $data['Apple']['created']['min'] = ''; + $data['Apple']['created']['sec'] = ''; + + $TestModel->data = null; + $TestModel->set($data); + $expected = array('Apple'=> array('created'=> '')); + $this->assertEqual($TestModel->data, $expected); + + $data = array(); + $data['Apple']['date']['year'] = ''; + $data['Apple']['date']['month'] = ''; + $data['Apple']['date']['day'] = ''; + + $TestModel->data = null; + $TestModel->set($data); + $expected = array('Apple'=> array('date'=> '')); + $this->assertEqual($TestModel->data, $expected); + + $data = array(); + $data['Apple']['created']['year'] = '2007'; + $data['Apple']['created']['month'] = '08'; + $data['Apple']['created']['day'] = '20'; + $data['Apple']['created']['hour'] = ''; + $data['Apple']['created']['min'] = ''; + $data['Apple']['created']['sec'] = ''; + + $TestModel->data = null; + $TestModel->set($data); + $expected = array('Apple'=> array('created'=> '2007-08-20 00:00:00')); + $this->assertEqual($TestModel->data, $expected); + + $data = array(); + $data['Apple']['created']['year'] = '2007'; + $data['Apple']['created']['month'] = '08'; + $data['Apple']['created']['day'] = '20'; + $data['Apple']['created']['hour'] = '10'; + $data['Apple']['created']['min'] = '12'; + $data['Apple']['created']['sec'] = ''; + + $TestModel->data = null; + $TestModel->set($data); + $expected = array('Apple'=> array('created'=> '2007-08-20 10:12:00')); + $this->assertEqual($TestModel->data, $expected); + + $data = array(); + $data['Apple']['created']['year'] = '2007'; + $data['Apple']['created']['month'] = ''; + $data['Apple']['created']['day'] = '12'; + $data['Apple']['created']['hour'] = '20'; + $data['Apple']['created']['min'] = ''; + $data['Apple']['created']['sec'] = ''; + + $TestModel->data = null; + $TestModel->set($data); + $expected = array('Apple'=> array('created'=> '')); + $this->assertEqual($TestModel->data, $expected); + + $data = array(); + $data['Apple']['created']['hour'] = '20'; + $data['Apple']['created']['min'] = '33'; + + $TestModel->data = null; + $TestModel->set($data); + $expected = array('Apple'=> array('created'=> '')); + $this->assertEqual($TestModel->data, $expected); + + $data = array(); + $data['Apple']['created']['hour'] = '20'; + $data['Apple']['created']['min'] = '33'; + $data['Apple']['created']['sec'] = '33'; + + $TestModel->data = null; + $TestModel->set($data); + $expected = array('Apple'=> array('created'=> '')); + $this->assertEqual($TestModel->data, $expected); + + $data = array(); + $data['Apple']['created']['hour'] = '13'; + $data['Apple']['created']['min'] = '00'; + $data['Apple']['date']['year'] = '2006'; + $data['Apple']['date']['month'] = '12'; + $data['Apple']['date']['day'] = '25'; + + $TestModel->data = null; + $TestModel->set($data); + $expected = array( + 'Apple'=> array( + 'created'=> '', + 'date'=> '2006-12-25' + )); + $this->assertEqual($TestModel->data, $expected); + + $data = array(); + $data['Apple']['created']['year'] = '2007'; + $data['Apple']['created']['month'] = '08'; + $data['Apple']['created']['day'] = '20'; + $data['Apple']['created']['hour'] = '10'; + $data['Apple']['created']['min'] = '12'; + $data['Apple']['created']['sec'] = '09'; + $data['Apple']['date']['year'] = '2006'; + $data['Apple']['date']['month'] = '12'; + $data['Apple']['date']['day'] = '25'; + + $TestModel->data = null; + $TestModel->set($data); + $expected = array( + 'Apple'=> array( + 'created'=> '2007-08-20 10:12:09', + 'date'=> '2006-12-25' + )); + $this->assertEqual($TestModel->data, $expected); + + $data = array(); + $data['Apple']['created']['year'] = '--'; + $data['Apple']['created']['month'] = '--'; + $data['Apple']['created']['day'] = '--'; + $data['Apple']['created']['hour'] = '--'; + $data['Apple']['created']['min'] = '--'; + $data['Apple']['created']['sec'] = '--'; + $data['Apple']['date']['year'] = '--'; + $data['Apple']['date']['month'] = '--'; + $data['Apple']['date']['day'] = '--'; + + $TestModel->data = null; + $TestModel->set($data); + $expected = array('Apple'=> array('created'=> '', 'date'=> '')); + $this->assertEqual($TestModel->data, $expected); + + $data = array(); + $data['Apple']['created']['year'] = '2007'; + $data['Apple']['created']['month'] = '--'; + $data['Apple']['created']['day'] = '20'; + $data['Apple']['created']['hour'] = '10'; + $data['Apple']['created']['min'] = '12'; + $data['Apple']['created']['sec'] = '09'; + $data['Apple']['date']['year'] = '2006'; + $data['Apple']['date']['month'] = '12'; + $data['Apple']['date']['day'] = '25'; + + $TestModel->data = null; + $TestModel->set($data); + $expected = array('Apple'=> array('created'=> '', 'date'=> '2006-12-25')); + $this->assertEqual($TestModel->data, $expected); + + $data = array(); + $data['Apple']['date']['year'] = '2006'; + $data['Apple']['date']['month'] = '12'; + $data['Apple']['date']['day'] = '25'; + + $TestModel->data = null; + $TestModel->set($data); + $expected = array('Apple'=> array('date'=> '2006-12-25')); + $this->assertEqual($TestModel->data, $expected); + + $db = ConnectionManager::getDataSource('test_suite'); + $data = array(); + $data['Apple']['modified'] = $db->expression('NOW()'); + $TestModel->data = null; + $TestModel->set($data); + $this->assertEqual($TestModel->data, $data); + } + +/** + * testTablePrefixSwitching method + * + * @access public + * @return void + */ + function testTablePrefixSwitching() { + ConnectionManager::create('database1', + array_merge($this->db->config, array('prefix' => 'aaa_') + )); + ConnectionManager::create('database2', + array_merge($this->db->config, array('prefix' => 'bbb_') + )); + + $db1 = ConnectionManager::getDataSource('database1'); + $db2 = ConnectionManager::getDataSource('database2'); + + $TestModel = new Apple(); + $TestModel->setDataSource('database1'); + $this->assertEqual($this->db->fullTableName($TestModel, false), 'aaa_apples'); + $this->assertEqual($db1->fullTableName($TestModel, false), 'aaa_apples'); + $this->assertEqual($db2->fullTableName($TestModel, false), 'aaa_apples'); + + $TestModel->setDataSource('database2'); + $this->assertEqual($this->db->fullTableName($TestModel, false), 'bbb_apples'); + $this->assertEqual($db1->fullTableName($TestModel, false), 'bbb_apples'); + $this->assertEqual($db2->fullTableName($TestModel, false), 'bbb_apples'); + + $TestModel = new Apple(); + $TestModel->tablePrefix = 'custom_'; + $this->assertEqual($this->db->fullTableName($TestModel, false), 'custom_apples'); + $TestModel->setDataSource('database1'); + $this->assertEqual($this->db->fullTableName($TestModel, false), 'custom_apples'); + $this->assertEqual($db1->fullTableName($TestModel, false), 'custom_apples'); + + $TestModel = new Apple(); + $TestModel->setDataSource('database1'); + $this->assertEqual($this->db->fullTableName($TestModel, false), 'aaa_apples'); + $TestModel->tablePrefix = ''; + $TestModel->setDataSource('database2'); + $this->assertEqual($db2->fullTableName($TestModel, false), 'apples'); + $this->assertEqual($db1->fullTableName($TestModel, false), 'apples'); + + $TestModel->tablePrefix = null; + $TestModel->setDataSource('database1'); + $this->assertEqual($db2->fullTableName($TestModel, false), 'aaa_apples'); + $this->assertEqual($db1->fullTableName($TestModel, false), 'aaa_apples'); + + $TestModel->tablePrefix = false; + $TestModel->setDataSource('database2'); + $this->assertEqual($db2->fullTableName($TestModel, false), 'apples'); + $this->assertEqual($db1->fullTableName($TestModel, false), 'apples'); + } + +/** + * Tests validation parameter order in custom validation methods + * + * @access public + * @return void + */ + function testInvalidAssociation() { + $TestModel =& new ValidationTest1(); + $this->assertNull($TestModel->getAssociated('Foo')); + } + +/** + * testLoadModelSecondIteration method + * + * @access public + * @return void + */ + function testLoadModelSecondIteration() { + $model = new ModelA(); + $this->assertIsA($model,'ModelA'); + + $this->assertIsA($model->ModelB, 'ModelB'); + $this->assertIsA($model->ModelB->ModelD, 'ModelD'); + + $this->assertIsA($model->ModelC, 'ModelC'); + $this->assertIsA($model->ModelC->ModelD, 'ModelD'); + } + +/** + * ensure that exists() does not persist between method calls reset on create + * + * @return void + */ + function testResetOfExistsOnCreate() { + $this->loadFixtures('Article'); + $Article =& new Article(); + $Article->id = 1; + $Article->saveField('title', 'Reset me'); + $Article->delete(); + $Article->id = 1; + $this->assertFalse($Article->exists()); + + $Article->create(); + $this->assertFalse($Article->exists()); + $Article->id = 2; + $Article->saveField('title', 'Staying alive'); + $result = $Article->read(null, 2); + $this->assertEqual($result['Article']['title'], 'Staying alive'); + } + +/** + * testUseTableFalseExistsCheck method + * + * @return void + */ + function testUseTableFalseExistsCheck() { + $this->loadFixtures('Article'); + $Article =& new Article(); + $Article->id = 1337; + $result = $Article->exists(); + $this->assertFalse($result); + + $Article->useTable = false; + $Article->id = null; + $result = $Article->exists(); + $this->assertFalse($result); + + // An article with primary key of '1' has been loaded by the fixtures. + $Article->useTable = false; + $Article->id = 1; + $result = $Article->exists(); + $this->assertTrue($result); + } + +/** + * testPluginAssociations method + * + * @access public + * @return void + */ + function testPluginAssociations() { + $this->loadFixtures('TestPluginArticle', 'User', 'TestPluginComment'); + $TestModel =& new TestPluginArticle(); + + $result = $TestModel->find('all'); + $expected = array( + array( + 'TestPluginArticle' => array( + 'id' => 1, + 'user_id' => 1, + 'title' => 'First Plugin Article', + 'body' => 'First Plugin Article Body', + 'published' => 'Y', + 'created' => '2008-09-24 10:39:23', + 'updated' => '2008-09-24 10:41:31' + ), + 'User' => array( + 'id' => 1, + 'user' => 'mariano', + 'password' => '5f4dcc3b5aa765d61d8327deb882cf99', + 'created' => '2007-03-17 01:16:23', + 'updated' => '2007-03-17 01:18:31' + ), + 'TestPluginComment' => array( + array( + 'id' => 1, + 'article_id' => 1, + 'user_id' => 2, + 'comment' => 'First Comment for First Plugin Article', + 'published' => 'Y', + 'created' => '2008-09-24 10:45:23', + 'updated' => '2008-09-24 10:47:31' + ), + array( + 'id' => 2, + 'article_id' => 1, + 'user_id' => 4, + 'comment' => 'Second Comment for First Plugin Article', + 'published' => 'Y', + 'created' => '2008-09-24 10:47:23', + 'updated' => '2008-09-24 10:49:31' + ), + array( + 'id' => 3, + 'article_id' => 1, + 'user_id' => 1, + 'comment' => 'Third Comment for First Plugin Article', + 'published' => 'Y', + 'created' => '2008-09-24 10:49:23', + 'updated' => '2008-09-24 10:51:31' + ), + array( + 'id' => 4, + 'article_id' => 1, + 'user_id' => 1, + 'comment' => 'Fourth Comment for First Plugin Article', + 'published' => 'N', + 'created' => '2008-09-24 10:51:23', + 'updated' => '2008-09-24 10:53:31' + ))), + array( + 'TestPluginArticle' => array( + 'id' => 2, + 'user_id' => 3, + 'title' => 'Second Plugin Article', + 'body' => 'Second Plugin Article Body', + 'published' => 'Y', + 'created' => '2008-09-24 10:41:23', + 'updated' => '2008-09-24 10:43:31' + ), + 'User' => array( + 'id' => 3, + 'user' => 'larry', + 'password' => '5f4dcc3b5aa765d61d8327deb882cf99', + 'created' => '2007-03-17 01:20:23', + 'updated' => '2007-03-17 01:22:31' + ), + 'TestPluginComment' => array( + array( + 'id' => 5, + 'article_id' => 2, + 'user_id' => 1, + 'comment' => 'First Comment for Second Plugin Article', + 'published' => 'Y', + 'created' => '2008-09-24 10:53:23', + 'updated' => '2008-09-24 10:55:31' + ), + array( + 'id' => 6, + 'article_id' => 2, + 'user_id' => 2, + 'comment' => 'Second Comment for Second Plugin Article', + 'published' => 'Y', + 'created' => '2008-09-24 10:55:23', + 'updated' => '2008-09-24 10:57:31' + ))), + array( + 'TestPluginArticle' => array( + 'id' => 3, + 'user_id' => 1, + 'title' => 'Third Plugin Article', + 'body' => 'Third Plugin Article Body', + 'published' => 'Y', + 'created' => '2008-09-24 10:43:23', + 'updated' => '2008-09-24 10:45:31' + ), + 'User' => array( + 'id' => 1, + 'user' => 'mariano', + 'password' => '5f4dcc3b5aa765d61d8327deb882cf99', + 'created' => '2007-03-17 01:16:23', + 'updated' => '2007-03-17 01:18:31' + ), + 'TestPluginComment' => array() + )); + + $this->assertEqual($result, $expected); + } + +/** + * Tests getAssociated method + * + * @access public + * @return void + */ + function testGetAssociated() { + $this->loadFixtures('Article'); + $Article = ClassRegistry::init('Article'); + + $assocTypes = array('hasMany', 'hasOne', 'belongsTo', 'hasAndBelongsToMany'); + foreach ($assocTypes as $type) { + $this->assertEqual($Article->getAssociated($type), array_keys($Article->{$type})); + } + + $Article->bindModel(array('hasMany' => array('Category'))); + $this->assertEqual($Article->getAssociated('hasMany'), array('Comment', 'Category')); + + $results = $Article->getAssociated(); + $this->assertEqual(sort(array_keys($results)), array('Category', 'Comment', 'Tag')); + + $Article->unbindModel(array('hasAndBelongsToMany' => array('Tag'))); + $this->assertEqual($Article->getAssociated('hasAndBelongsToMany'), array()); + + $result = $Article->getAssociated('Category'); + $expected = array( + 'className' => 'Category', + 'foreignKey' => 'article_id', + 'conditions' => '', + 'fields' => '', + 'order' => '', + 'limit' => '', + 'offset' => '', + 'dependent' => '', + 'exclusive' => '', + 'finderQuery' => '', + 'counterQuery' => '', + 'association' => 'hasMany', + ); + $this->assertEqual($result, $expected); + } + +/** + * testAutoConstructAssociations method + * + * @access public + * @return void + */ + function testAutoConstructAssociations() { + $this->loadFixtures('User', 'ArticleFeatured'); + $TestModel =& new AssociationTest1(); + + $result = $TestModel->hasAndBelongsToMany; + $expected = array('AssociationTest2' => array( + 'unique' => false, + 'joinTable' => 'join_as_join_bs', + 'foreignKey' => false, + 'className' => 'AssociationTest2', + 'with' => 'JoinAsJoinB', + 'associationForeignKey' => 'join_b_id', + 'conditions' => '', 'fields' => '', 'order' => '', 'limit' => '', 'offset' => '', + 'finderQuery' => '', 'deleteQuery' => '', 'insertQuery' => '' + )); + $this->assertEqual($result, $expected); + + // Tests related to ticket https://trac.cakephp.org/ticket/5594 + $TestModel =& new ArticleFeatured(); + $TestFakeModel =& new ArticleFeatured(array('table' => false)); + + $expected = array( + 'User' => array( + 'className' => 'User', 'foreignKey' => 'user_id', + 'conditions' => '', 'fields' => '', 'order' => '', 'counterCache' => '' + ), + 'Category' => array( + 'className' => 'Category', 'foreignKey' => 'category_id', + 'conditions' => '', 'fields' => '', 'order' => '', 'counterCache' => '' + ) + ); + $this->assertIdentical($TestModel->belongsTo, $expected); + $this->assertIdentical($TestFakeModel->belongsTo, $expected); + + $this->assertEqual($TestModel->User->name, 'User'); + $this->assertEqual($TestFakeModel->User->name, 'User'); + $this->assertEqual($TestModel->Category->name, 'Category'); + $this->assertEqual($TestFakeModel->Category->name, 'Category'); + + $expected = array( + 'Featured' => array( + 'className' => 'Featured', + 'foreignKey' => 'article_featured_id', + 'conditions' => '', + 'fields' => '', + 'order' => '', + 'dependent' => '' + )); + + $this->assertIdentical($TestModel->hasOne, $expected); + $this->assertIdentical($TestFakeModel->hasOne, $expected); + + $this->assertEqual($TestModel->Featured->name, 'Featured'); + $this->assertEqual($TestFakeModel->Featured->name, 'Featured'); + + $expected = array( + 'Comment' => array( + 'className' => 'Comment', + 'dependent' => true, + 'foreignKey' => 'article_featured_id', + 'conditions' => '', + 'fields' => '', + 'order' => '', + 'limit' => '', + 'offset' => '', + 'exclusive' => '', + 'finderQuery' => '', + 'counterQuery' => '' + )); + + $this->assertIdentical($TestModel->hasMany, $expected); + $this->assertIdentical($TestFakeModel->hasMany, $expected); + + $this->assertEqual($TestModel->Comment->name, 'Comment'); + $this->assertEqual($TestFakeModel->Comment->name, 'Comment'); + + $expected = array( + 'Tag' => array( + 'className' => 'Tag', + 'joinTable' => 'article_featureds_tags', + 'with' => 'ArticleFeaturedsTag', + 'foreignKey' => 'article_featured_id', + 'associationForeignKey' => 'tag_id', + 'conditions' => '', + 'fields' => '', + 'order' => '', + 'limit' => '', + 'offset' => '', + 'unique' => true, + 'finderQuery' => '', + 'deleteQuery' => '', + 'insertQuery' => '' + )); + + $this->assertIdentical($TestModel->hasAndBelongsToMany, $expected); + $this->assertIdentical($TestFakeModel->hasAndBelongsToMany, $expected); + + $this->assertEqual($TestModel->Tag->name, 'Tag'); + $this->assertEqual($TestFakeModel->Tag->name, 'Tag'); + } + +/** + * test Model::__construct + * + * ensure that $actsAS and $_findMethods are merged. + * + * @return void + */ + function testConstruct() { + $this->loadFixtures('Post', 'Comment'); + + $TestModel =& ClassRegistry::init('MergeVarPluginPost'); + $this->assertEqual($TestModel->actsAs, array('Containable', 'Tree')); + $this->assertTrue(isset($TestModel->Behaviors->Containable)); + $this->assertTrue(isset($TestModel->Behaviors->Tree)); + + $TestModel =& ClassRegistry::init('MergeVarPluginComment'); + $expected = array('Containable', 'Containable' => array('some_settings')); + $this->assertEqual($TestModel->actsAs, $expected); + $this->assertTrue(isset($TestModel->Behaviors->Containable)); + } + +/** + * test Model::__construct + * + * ensure that $actsAS and $_findMethods are merged. + * + * @return void + */ + function testConstructWithAlternateDataSource() { + $TestModel =& ClassRegistry::init(array( + 'class' => 'DoesntMatter', 'ds' => 'test_suite', 'table' => false + )); + $this->assertEqual('test_suite', $TestModel->useDbConfig); + + //deprecated but test it anyway + $NewVoid =& new TheVoid(null, false, 'other'); + $this->assertEqual('other', $NewVoid->useDbConfig); + } + +/** + * testColumnTypeFetching method + * + * @access public + * @return void + */ + function testColumnTypeFetching() { + $model =& new Test(); + $this->assertEqual($model->getColumnType('id'), 'integer'); + $this->assertEqual($model->getColumnType('notes'), 'text'); + $this->assertEqual($model->getColumnType('updated'), 'datetime'); + $this->assertEqual($model->getColumnType('unknown'), null); + + $model =& new Article(); + $this->assertEqual($model->getColumnType('User.created'), 'datetime'); + $this->assertEqual($model->getColumnType('Tag.id'), 'integer'); + $this->assertEqual($model->getColumnType('Article.id'), 'integer'); + } + +/** + * testHabtmUniqueKey method + * + * @access public + * @return void + */ + function testHabtmUniqueKey() { + $model =& new Item(); + $this->assertFalse($model->hasAndBelongsToMany['Portfolio']['unique']); + } + +/** + * testIdentity method + * + * @access public + * @return void + */ + function testIdentity() { + $TestModel =& new Test(); + $result = $TestModel->alias; + $expected = 'Test'; + $this->assertEqual($result, $expected); + + $TestModel =& new TestAlias(); + $result = $TestModel->alias; + $expected = 'TestAlias'; + $this->assertEqual($result, $expected); + + $TestModel =& new Test(array('alias' => 'AnotherTest')); + $result = $TestModel->alias; + $expected = 'AnotherTest'; + $this->assertEqual($result, $expected); + } + +/** + * testWithAssociation method + * + * @access public + * @return void + */ + function testWithAssociation() { + $this->loadFixtures('Something', 'SomethingElse', 'JoinThing'); + $TestModel =& new Something(); + $result = $TestModel->SomethingElse->find('all'); + + $expected = array( + array( + 'SomethingElse' => array( + 'id' => '1', + 'title' => 'First Post', + 'body' => 'First Post Body', + 'published' => 'Y', + 'created' => '2007-03-18 10:39:23', + 'updated' => '2007-03-18 10:41:31' + ), + 'Something' => array( + array( + 'id' => '3', + 'title' => 'Third Post', + 'body' => 'Third Post Body', + 'published' => 'Y', + 'created' => '2007-03-18 10:43:23', + 'updated' => '2007-03-18 10:45:31', + 'JoinThing' => array( + 'id' => '3', + 'something_id' => '3', + 'something_else_id' => '1', + 'doomed' => '1', + 'created' => '2007-03-18 10:43:23', + 'updated' => '2007-03-18 10:45:31' + )))), + array( + 'SomethingElse' => array( + 'id' => '2', + 'title' => 'Second Post', + 'body' => 'Second Post Body', + 'published' => 'Y', + 'created' => '2007-03-18 10:41:23', + 'updated' => '2007-03-18 10:43:31' + ), + 'Something' => array( + array( + 'id' => '1', + 'title' => 'First Post', + 'body' => 'First Post Body', + 'published' => 'Y', + 'created' => '2007-03-18 10:39:23', + 'updated' => '2007-03-18 10:41:31', + 'JoinThing' => array( + 'id' => '1', + 'something_id' => '1', + 'something_else_id' => '2', + 'doomed' => '1', + 'created' => '2007-03-18 10:39:23', + 'updated' => '2007-03-18 10:41:31' + )))), + array( + 'SomethingElse' => array( + 'id' => '3', + 'title' => 'Third Post', + 'body' => 'Third Post Body', + 'published' => 'Y', + 'created' => '2007-03-18 10:43:23', + 'updated' => '2007-03-18 10:45:31' + ), + 'Something' => array( + array( + 'id' => '2', + 'title' => 'Second Post', + 'body' => 'Second Post Body', + 'published' => 'Y', + 'created' => '2007-03-18 10:41:23', + 'updated' => '2007-03-18 10:43:31', + 'JoinThing' => array( + 'id' => '2', + 'something_id' => '2', + 'something_else_id' => '3', + 'doomed' => '0', + 'created' => '2007-03-18 10:41:23', + 'updated' => '2007-03-18 10:43:31' + ))))); + $this->assertEqual($result, $expected); + + $result = $TestModel->find('all'); + $expected = array( + array( + 'Something' => array( + 'id' => '1', + 'title' => 'First Post', + 'body' => 'First Post Body', + 'published' => 'Y', + 'created' => '2007-03-18 10:39:23', + 'updated' => '2007-03-18 10:41:31' + ), + 'SomethingElse' => array( + array( + 'id' => '2', + 'title' => 'Second Post', + 'body' => 'Second Post Body', + 'published' => 'Y', + 'created' => '2007-03-18 10:41:23', + 'updated' => '2007-03-18 10:43:31', + 'JoinThing' => array( + 'doomed' => '1', + 'something_id' => '1', + 'something_else_id' => '2' + )))), + array( + 'Something' => array( + 'id' => '2', + 'title' => 'Second Post', + 'body' => 'Second Post Body', + 'published' => 'Y', + 'created' => '2007-03-18 10:41:23', + 'updated' => '2007-03-18 10:43:31' + ), + 'SomethingElse' => array( + array( + 'id' => '3', + 'title' => 'Third Post', + 'body' => 'Third Post Body', + 'published' => 'Y', + 'created' => '2007-03-18 10:43:23', + 'updated' => '2007-03-18 10:45:31', + 'JoinThing' => array( + 'doomed' => '0', + 'something_id' => '2', + 'something_else_id' => '3' + )))), + array( + 'Something' => array( + 'id' => '3', + 'title' => 'Third Post', + 'body' => 'Third Post Body', + 'published' => 'Y', + 'created' => '2007-03-18 10:43:23', + 'updated' => '2007-03-18 10:45:31' + ), + 'SomethingElse' => array( + array( + 'id' => '1', + 'title' => 'First Post', + 'body' => 'First Post Body', + 'published' => 'Y', + 'created' => '2007-03-18 10:39:23', + 'updated' => '2007-03-18 10:41:31', + 'JoinThing' => array( + 'doomed' => '1', + 'something_id' => '3', + 'something_else_id' => '1' + ))))); + $this->assertEqual($result, $expected); + + $result = $TestModel->findById(1); + $expected = array( + 'Something' => array( + 'id' => '1', + 'title' => 'First Post', + 'body' => 'First Post Body', + 'published' => 'Y', + 'created' => '2007-03-18 10:39:23', + 'updated' => '2007-03-18 10:41:31' + ), + 'SomethingElse' => array( + array( + 'id' => '2', + 'title' => 'Second Post', + 'body' => 'Second Post Body', + 'published' => 'Y', + 'created' => '2007-03-18 10:41:23', + 'updated' => '2007-03-18 10:43:31', + 'JoinThing' => array( + 'doomed' => '1', + 'something_id' => '1', + 'something_else_id' => '2' + )))); + $this->assertEqual($result, $expected); + + $expected = $TestModel->findById(1); + $TestModel->set($expected); + $TestModel->save(); + $result = $TestModel->findById(1); + $this->assertEqual($result, $expected); + + $TestModel->hasAndBelongsToMany['SomethingElse']['unique'] = false; + $TestModel->create(array( + 'Something' => array('id' => 1), + 'SomethingElse' => array(3, array( + 'something_else_id' => 1, + 'doomed' => '1' + )))); + + $ts = date('Y-m-d H:i:s'); + $TestModel->save(); + + $TestModel->hasAndBelongsToMany['SomethingElse']['order'] = 'SomethingElse.id ASC'; + $result = $TestModel->findById(1); + $expected = array( + 'Something' => array( + 'id' => '1', + 'title' => 'First Post', + 'body' => 'First Post Body', + 'published' => 'Y', + 'created' => '2007-03-18 10:39:23', + 'updated' => $ts), + 'SomethingElse' => array( + array( + 'id' => '1', + 'title' => 'First Post', + 'body' => 'First Post Body', + 'published' => 'Y', + 'created' => '2007-03-18 10:39:23', + 'updated' => '2007-03-18 10:41:31', + 'JoinThing' => array( + 'doomed' => '1', + 'something_id' => '1', + 'something_else_id' => '1' + )), + array( + 'id' => '2', + 'title' => 'Second Post', + 'body' => 'Second Post Body', + 'published' => 'Y', + 'created' => '2007-03-18 10:41:23', + 'updated' => '2007-03-18 10:43:31', + 'JoinThing' => array( + 'doomed' => '1', + 'something_id' => '1', + 'something_else_id' => '2' + )), + array( + 'id' => '3', + 'title' => 'Third Post', + 'body' => 'Third Post Body', + 'published' => 'Y', + 'created' => '2007-03-18 10:43:23', + 'updated' => '2007-03-18 10:45:31', + 'JoinThing' => array( + 'doomed' => '0', + 'something_id' => '1', + 'something_else_id' => '3' + )))); + + $this->assertEqual($result, $expected); + } + +/** + * testFindSelfAssociations method + * + * @access public + * @return void + */ + function testFindSelfAssociations() { + $this->loadFixtures('Person'); + + $TestModel =& new Person(); + $TestModel->recursive = 2; + $result = $TestModel->read(null, 1); + $expected = array( + 'Person' => array( + 'id' => 1, + 'name' => 'person', + 'mother_id' => 2, + 'father_id' => 3 + ), + 'Mother' => array( + 'id' => 2, + 'name' => 'mother', + 'mother_id' => 4, + 'father_id' => 5, + 'Mother' => array( + 'id' => 4, + 'name' => 'mother - grand mother', + 'mother_id' => 0, + 'father_id' => 0 + ), + 'Father' => array( + 'id' => 5, + 'name' => 'mother - grand father', + 'mother_id' => 0, + 'father_id' => 0 + )), + 'Father' => array( + 'id' => 3, + 'name' => 'father', + 'mother_id' => 6, + 'father_id' => 7, + 'Father' => array( + 'id' => 7, + 'name' => 'father - grand father', + 'mother_id' => 0, + 'father_id' => 0 + ), + 'Mother' => array( + 'id' => 6, + 'name' => 'father - grand mother', + 'mother_id' => 0, + 'father_id' => 0 + ))); + + $this->assertEqual($result, $expected); + + $TestModel->recursive = 3; + $result = $TestModel->read(null, 1); + $expected = array( + 'Person' => array( + 'id' => 1, + 'name' => 'person', + 'mother_id' => 2, + 'father_id' => 3 + ), + 'Mother' => array( + 'id' => 2, + 'name' => 'mother', + 'mother_id' => 4, + 'father_id' => 5, + 'Mother' => array( + 'id' => 4, + 'name' => 'mother - grand mother', + 'mother_id' => 0, + 'father_id' => 0, + 'Mother' => array(), + 'Father' => array()), + 'Father' => array( + 'id' => 5, + 'name' => 'mother - grand father', + 'mother_id' => 0, + 'father_id' => 0, + 'Father' => array(), + 'Mother' => array() + )), + 'Father' => array( + 'id' => 3, + 'name' => 'father', + 'mother_id' => 6, + 'father_id' => 7, + 'Father' => array( + 'id' => 7, + 'name' => 'father - grand father', + 'mother_id' => 0, + 'father_id' => 0, + 'Father' => array(), + 'Mother' => array() + ), + 'Mother' => array( + 'id' => 6, + 'name' => 'father - grand mother', + 'mother_id' => 0, + 'father_id' => 0, + 'Mother' => array(), + 'Father' => array() + ))); + + $this->assertEqual($result, $expected); + } + +/** + * testDynamicAssociations method + * + * @access public + * @return void + */ + function testDynamicAssociations() { + $this->loadFixtures('Article', 'Comment'); + $TestModel =& new Article(); + + $TestModel->belongsTo = $TestModel->hasAndBelongsToMany = $TestModel->hasOne = array(); + $TestModel->hasMany['Comment'] = array_merge($TestModel->hasMany['Comment'], array( + 'foreignKey' => false, + 'conditions' => array('Comment.user_id =' => '2') + )); + $result = $TestModel->find('all'); + $expected = array( + array( + 'Article' => array( + 'id' => '1', + 'user_id' => '1', + 'title' => 'First Article', + 'body' => 'First Article Body', + 'published' => 'Y', + 'created' => '2007-03-18 10:39:23', + 'updated' => '2007-03-18 10:41:31' + ), + 'Comment' => array( + array( + 'id' => '1', + 'article_id' => '1', + 'user_id' => '2', + 'comment' => 'First Comment for First Article', + 'published' => 'Y', + 'created' => '2007-03-18 10:45:23', + 'updated' => '2007-03-18 10:47:31' + ), + array( + 'id' => '6', + 'article_id' => '2', + 'user_id' => '2', + 'comment' => 'Second Comment for Second Article', + 'published' => 'Y', + 'created' => '2007-03-18 10:55:23', + 'updated' => '2007-03-18 10:57:31' + ))), + array( + 'Article' => array( + 'id' => '2', + 'user_id' => '3', + 'title' => 'Second Article', + 'body' => 'Second Article Body', + 'published' => 'Y', + 'created' => '2007-03-18 10:41:23', + 'updated' => '2007-03-18 10:43:31' + ), + 'Comment' => array( + array( + 'id' => '1', + 'article_id' => '1', + 'user_id' => '2', + 'comment' => 'First Comment for First Article', + 'published' => 'Y', + 'created' => '2007-03-18 10:45:23', + 'updated' => '2007-03-18 10:47:31' + ), + array( + 'id' => '6', + 'article_id' => '2', + 'user_id' => '2', + 'comment' => 'Second Comment for Second Article', + 'published' => 'Y', + 'created' => '2007-03-18 10:55:23', + 'updated' => '2007-03-18 10:57:31' + ))), + array( + 'Article' => array( + 'id' => '3', + 'user_id' => '1', + 'title' => 'Third Article', + 'body' => 'Third Article Body', + 'published' => 'Y', + 'created' => '2007-03-18 10:43:23', + 'updated' => '2007-03-18 10:45:31' + ), + 'Comment' => array( + array( + 'id' => '1', + 'article_id' => '1', + 'user_id' => '2', + 'comment' => 'First Comment for First Article', + 'published' => 'Y', + 'created' => '2007-03-18 10:45:23', + 'updated' => '2007-03-18 10:47:31' + ), + array( + 'id' => '6', + 'article_id' => '2', + 'user_id' => '2', + 'comment' => 'Second Comment for Second Article', + 'published' => 'Y', + 'created' => '2007-03-18 10:55:23', + 'updated' => '2007-03-18 10:57:31' + )))); + + $this->assertEqual($result, $expected); + } + +/** + * testCreation method + * + * @access public + * @return void + */ + function testCreation() { + $this->loadFixtures('Article'); + $TestModel =& new Test(); + $result = $TestModel->create(); + $expected = array('Test' => array('notes' => 'write some notes here')); + $this->assertEqual($result, $expected); + $TestModel =& new User(); + $result = $TestModel->schema(); + + if (isset($this->db->columns['primary_key']['length'])) { + $intLength = $this->db->columns['primary_key']['length']; + } elseif (isset($this->db->columns['integer']['length'])) { + $intLength = $this->db->columns['integer']['length']; + } else { + $intLength = 11; + } + foreach (array('collate', 'charset') as $type) { + unset($result['user'][$type]); + unset($result['password'][$type]); + } + + $expected = array( + 'id' => array( + 'type' => 'integer', + 'null' => false, + 'default' => null, + 'length' => $intLength, + 'key' => 'primary' + ), + 'user' => array( + 'type' => 'string', + 'null' => false, + 'default' => '', + 'length' => 255 + ), + 'password' => array( + 'type' => 'string', + 'null' => false, + 'default' => '', + 'length' => 255 + ), + 'created' => array( + 'type' => 'datetime', + 'null' => true, + 'default' => null, + 'length' => null + ), + 'updated'=> array( + 'type' => 'datetime', + 'null' => true, + 'default' => null, + 'length' => null + )); + + $this->assertEqual($result, $expected); + + $TestModel =& new Article(); + $result = $TestModel->create(); + $expected = array('Article' => array('published' => 'N')); + $this->assertEqual($result, $expected); + + $FeaturedModel =& new Featured(); + $data = array( + 'article_featured_id' => 1, + 'category_id' => 1, + 'published_date' => array( + 'year' => 2008, + 'month' => 06, + 'day' => 11 + ), + 'end_date' => array( + 'year' => 2008, + 'month' => 06, + 'day' => 20 + )); + + $expected = array( + 'Featured' => array( + 'article_featured_id' => 1, + 'category_id' => 1, + 'published_date' => '2008-6-11 00:00:00', + 'end_date' => '2008-6-20 00:00:00' + )); + + $this->assertEqual($FeaturedModel->create($data), $expected); + + $data = array( + 'published_date' => array( + 'year' => 2008, + 'month' => 06, + 'day' => 11 + ), + 'end_date' => array( + 'year' => 2008, + 'month' => 06, + 'day' => 20 + ), + 'article_featured_id' => 1, + 'category_id' => 1 + ); + + $expected = array( + 'Featured' => array( + 'published_date' => '2008-6-11 00:00:00', + 'end_date' => '2008-6-20 00:00:00', + 'article_featured_id' => 1, + 'category_id' => 1 + )); + + $this->assertEqual($FeaturedModel->create($data), $expected); + } + +/** + * testEscapeField to prove it escapes the field well even when it has part of the alias on it + * @see ttp://cakephp.lighthouseapp.com/projects/42648-cakephp-1x/tickets/473-escapefield-doesnt-consistently-prepend-modelname + * + * @access public + * @return void + */ + function testEscapeField() { + $TestModel =& new Test(); + $db =& $TestModel->getDataSource(); + + $result = $TestModel->escapeField('test_field'); + $expected = $db->name('Test.test_field'); + $this->assertEqual($result, $expected); + + $result = $TestModel->escapeField('TestField'); + $expected = $db->name('Test.TestField'); + $this->assertEqual($result, $expected); + + $result = $TestModel->escapeField('DomainHandle', 'Domain'); + $expected = $db->name('Domain.DomainHandle'); + $this->assertEqual($result, $expected); + + ConnectionManager::create('mock', array('driver' => 'mock')); + $TestModel->setDataSource('mock'); + $db =& $TestModel->getDataSource(); + + $result = $TestModel->escapeField('DomainHandle', 'Domain'); + $expected = $db->name('Domain.DomainHandle'); + $this->assertEqual($result, $expected); + } +}