2008-05-30 11:40:08 +00:00
< ? php
/**
2009-03-18 17:55:58 +00:00
* DboSourceTest file
2008-05-30 11:40:08 +00:00
*
2017-06-10 22:15:34 +00:00
* CakePHP ( tm ) Tests < https :// book . cakephp . org / 2.0 / en / development / testing . html >
2017-06-10 22:10:52 +00:00
* Copyright ( c ) Cake Software Foundation , Inc . ( https :// cakefoundation . org )
2008-05-30 11:40:08 +00:00
*
2013-11-13 17:52:06 +00:00
* 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 .
2008-05-30 11:40:08 +00:00
*
2017-06-10 22:10:52 +00:00
* @ copyright Copyright ( c ) Cake Software Foundation , Inc . ( https :// cakefoundation . org )
2017-06-10 22:15:34 +00:00
* @ link https :// book . cakephp . org / 2.0 / en / development / testing . html CakePHP ( tm ) Tests
2011-07-26 06:16:14 +00:00
* @ package Cake . Test . Case . Model . Datasource
2008-10-30 17:30:26 +00:00
* @ since CakePHP ( tm ) v 1.2 . 0.4206
2017-06-10 22:23:14 +00:00
* @ license https :// opensource . org / licenses / mit - license . php MIT License
2008-05-30 11:40:08 +00:00
*/
2010-11-21 20:13:33 +00:00
2010-12-09 05:55:24 +00:00
App :: uses ( 'Model' , 'Model' );
App :: uses ( 'AppModel' , 'Model' );
2010-12-22 04:41:40 +00:00
App :: uses ( 'DataSource' , 'Model/Datasource' );
2010-12-09 05:55:24 +00:00
App :: uses ( 'DboSource' , 'Model/Datasource' );
2013-03-13 20:58:55 +00:00
App :: uses ( 'DboTestSource' , 'Model/Datasource' );
App :: uses ( 'DboSecondTestSource' , 'Model/Datasource' );
App :: uses ( 'MockDataSource' , 'Model/Datasource' );
2013-11-18 10:56:00 +00:00
2008-05-30 11:40:08 +00:00
require_once dirname ( dirname ( __FILE__ )) . DS . 'models.php' ;
2009-07-24 19:18:37 +00:00
2013-05-30 22:11:14 +00:00
/**
2016-08-10 10:22:09 +00:00
* MockPDO
2013-05-30 22:11:14 +00:00
*
* @ package Cake . Test . Case . Model . Datasource
*/
2012-01-21 20:18:17 +00:00
class MockPDO extends PDO {
2014-07-13 16:21:09 +00:00
/**
* Constructor .
*/
2012-01-21 20:18:17 +00:00
public function __construct () {
}
2012-03-18 22:06:10 +00:00
2012-01-21 20:18:17 +00:00
}
2013-05-30 22:11:14 +00:00
/**
2016-08-10 10:22:09 +00:00
* MockDataSource
2013-05-30 22:11:14 +00:00
*
* @ package Cake . Test . Case . Model . Datasource
*/
2010-12-22 04:41:40 +00:00
class MockDataSource extends DataSource {
2011-09-03 22:37:26 +00:00
}
2013-05-30 22:11:14 +00:00
/**
2016-08-10 10:22:09 +00:00
* DboTestSource
2013-05-30 22:11:14 +00:00
*
* @ package Cake . Test . Case . Model . Datasource
*/
2011-09-03 22:37:26 +00:00
class DboTestSource extends DboSource {
2012-04-25 02:28:47 +00:00
public $nestedSupport = false ;
2012-04-01 04:41:16 +00:00
2011-09-03 22:37:26 +00:00
public function connect ( $config = array ()) {
$this -> connected = true ;
}
2011-05-16 22:49:00 +00:00
2011-09-03 22:37:26 +00:00
public function mergeAssociation ( & $data , & $merge , $association , $type , $selfJoin = false ) {
2011-11-13 01:43:55 +00:00
return parent :: _mergeAssociation ( $data , $merge , $association , $type , $selfJoin );
2011-09-03 22:37:26 +00:00
}
2011-11-13 01:43:55 +00:00
public function setConfig ( $config = array ()) {
2011-09-03 22:37:26 +00:00
$this -> config = $config ;
}
2011-10-01 01:56:39 +00:00
public function setConnection ( $conn ) {
$this -> _connection = $conn ;
}
2012-03-18 22:06:10 +00:00
2012-04-27 00:19:03 +00:00
public function nestedTransactionSupported () {
2012-04-27 00:53:18 +00:00
return $this -> useNestedTransactions && $this -> nestedSupport ;
2012-04-01 03:14:49 +00:00
}
2010-12-22 04:41:40 +00:00
}
2013-05-30 22:11:14 +00:00
/**
2016-08-10 10:22:09 +00:00
* DboSecondTestSource
2013-05-30 22:11:14 +00:00
*
* @ package Cake . Test . Case . Model . Datasource
*/
2012-05-31 19:00:06 +00:00
class DboSecondTestSource extends DboSource {
public $startQuote = '_' ;
public $endQuote = '_' ;
public function connect ( $config = array ()) {
$this -> connected = true ;
}
public function mergeAssociation ( & $data , & $merge , $association , $type , $selfJoin = false ) {
return parent :: _mergeAssociation ( $data , $merge , $association , $type , $selfJoin );
}
public function setConfig ( $config = array ()) {
$this -> config = $config ;
}
public function setConnection ( $conn ) {
$this -> _connection = $conn ;
}
}
2016-11-14 09:27:51 +00:00
/**
* DboThirdTestSource
*
* @ package Cake . Test . Case . Model . Datasource
*/
class DboThirdTestSource extends DboSource {
public function connect ( $config = array ()) {
$this -> connected = true ;
}
public function cacheMethodHasher ( $value ) {
return hash ( 'sha1' , $value );
}
}
2016-11-14 11:04:36 +00:00
/**
* DboFourthTestSource
*
* @ package Cake . Test . Case . Model . Datasource
*/
class DboFourthTestSource extends DboSource {
public function connect ( $config = array ()) {
$this -> connected = true ;
}
public function cacheMethodFilter ( $method , $key , $value ) {
if ( $method === 'name' ) {
if ( $value === '`menus`' ) {
return false ;
} elseif ( $key === '1fca740733997f1ebbedacfc7678592a' ) {
return false ;
}
} elseif ( $method === 'fields' ) {
$endsWithName = preg_grep ( '/`name`$/' , $value );
return count ( $endsWithName ) === 0 ;
}
return true ;
}
}
2008-05-30 11:40:08 +00:00
/**
2009-03-18 17:55:58 +00:00
* DboSourceTest class
2008-05-30 11:40:08 +00:00
*
2011-07-26 06:16:14 +00:00
* @ package Cake . Test . Case . Model . Datasource
2008-05-30 11:40:08 +00:00
*/
class DboSourceTest extends CakeTestCase {
2009-07-24 19:18:37 +00:00
2008-06-02 19:22:55 +00:00
/**
* autoFixtures property
2008-06-05 14:48:54 +00:00
*
2014-07-03 13:36:42 +00:00
* @ var bool
2008-06-02 19:22:55 +00:00
*/
2010-04-04 07:14:00 +00:00
public $autoFixtures = false ;
2009-07-24 19:18:37 +00:00
2008-06-02 19:22:55 +00:00
/**
* fixtures property
2008-06-05 14:48:54 +00:00
*
2008-06-02 19:22:55 +00:00
* @ var array
*/
2010-04-04 07:14:00 +00:00
public $fixtures = array (
2008-05-30 11:40:08 +00:00
'core.apple' , 'core.article' , 'core.articles_tag' , 'core.attachment' , 'core.comment' ,
2010-09-07 04:32:44 +00:00
'core.sample' , 'core.tag' , 'core.user' , 'core.post' , 'core.author' , 'core.data_test'
2008-05-30 11:40:08 +00:00
);
2009-07-24 19:18:37 +00:00
2008-06-02 19:22:55 +00:00
/**
2010-09-26 01:36:49 +00:00
* setUp method
2008-06-05 14:48:54 +00:00
*
2008-06-02 19:22:55 +00:00
* @ return void
*/
2011-05-30 20:02:32 +00:00
public function setUp () {
2010-09-26 01:36:49 +00:00
parent :: setUp ();
2008-05-30 11:40:08 +00:00
2011-09-03 22:37:26 +00:00
$this -> testDb = new DboTestSource ();
2008-08-07 15:36:26 +00:00
$this -> testDb -> cacheSources = false ;
2009-08-02 06:47:28 +00:00
$this -> testDb -> startQuote = '`' ;
$this -> testDb -> endQuote = '`' ;
2010-09-26 01:36:49 +00:00
2010-06-10 01:17:25 +00:00
$this -> Model = new TestModel ();
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-06-02 19:22:55 +00:00
/**
2012-04-11 14:50:54 +00:00
* tearDown method
2008-06-05 14:48:54 +00:00
*
2008-06-02 19:22:55 +00:00
* @ return void
*/
2011-05-30 20:02:32 +00:00
public function tearDown () {
2010-09-26 01:36:49 +00:00
parent :: tearDown ();
2008-05-30 11:40:08 +00:00
unset ( $this -> Model );
}
2009-07-24 19:18:37 +00:00
2010-01-22 15:30:22 +00:00
/**
* test that booleans and null make logical condition strings .
*
* @ return void
*/
2011-05-30 20:02:32 +00:00
public function testBooleanNullConditionsParsing () {
2010-01-22 15:30:22 +00:00
$result = $this -> testDb -> conditions ( true );
2012-03-23 06:37:12 +00:00
$this -> assertEquals ( ' WHERE 1 = 1' , $result , 'true conditions failed %s' );
2010-01-22 15:30:22 +00:00
$result = $this -> testDb -> conditions ( false );
2012-03-23 06:37:12 +00:00
$this -> assertEquals ( ' WHERE 0 = 1' , $result , 'false conditions failed %s' );
2010-01-22 15:30:22 +00:00
$result = $this -> testDb -> conditions ( null );
2012-03-23 06:37:12 +00:00
$this -> assertEquals ( ' WHERE 1 = 1' , $result , 'null conditions failed %s' );
2010-01-22 15:30:22 +00:00
$result = $this -> testDb -> conditions ( array ());
2012-03-23 06:37:12 +00:00
$this -> assertEquals ( ' WHERE 1 = 1' , $result , 'array() conditions failed %s' );
2010-01-22 15:30:22 +00:00
$result = $this -> testDb -> conditions ( '' );
2012-03-23 06:37:12 +00:00
$this -> assertEquals ( ' WHERE 1 = 1' , $result , '"" conditions failed %s' );
2010-01-22 15:30:22 +00:00
$result = $this -> testDb -> conditions ( ' ' , '" " conditions failed %s' );
2012-03-23 06:37:12 +00:00
$this -> assertEquals ( ' WHERE 1 = 1' , $result );
2010-01-22 15:30:22 +00:00
}
2010-05-19 08:54:51 +00:00
2012-11-17 18:34:02 +00:00
/**
* test that booleans work on empty set .
*
* @ return void
*/
public function testBooleanEmptyConditionsParsing () {
$result = $this -> testDb -> conditions ( array ( 'OR' => array ()));
2012-11-17 22:14:40 +00:00
$this -> assertEquals ( ' WHERE 1 = 1' , $result , 'empty conditions failed' );
2012-11-17 18:34:02 +00:00
$result = $this -> testDb -> conditions ( array ( 'OR' => array ( 'OR' => array ())));
2012-11-17 22:14:40 +00:00
$this -> assertEquals ( ' WHERE 1 = 1' , $result , 'nested empty conditions failed' );
2012-11-17 18:34:02 +00:00
}
2010-05-19 08:54:51 +00:00
/**
* test that order () will accept objects made from DboSource :: expression
*
* @ return void
*/
2011-05-30 20:02:32 +00:00
public function testOrderWithExpression () {
2010-05-19 08:54:51 +00:00
$expression = $this -> testDb -> expression ( " CASE Sample.id WHEN 1 THEN 'Id One' ELSE 'Other Id' END AS case_col " );
$result = $this -> testDb -> order ( $expression );
$expected = " ORDER BY CASE Sample.id WHEN 1 THEN 'Id One' ELSE 'Other Id' END AS case_col " ;
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2010-05-19 08:54:51 +00:00
}
2008-06-05 15:20:45 +00:00
/**
* testMergeAssociations method
2008-06-14 19:45:26 +00:00
*
2008-06-05 15:20:45 +00:00
* @ return void
*/
2011-05-30 20:02:32 +00:00
public function testMergeAssociations () {
2009-03-09 18:36:32 +00:00
$data = array ( 'Article2' => 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'
));
$merge = array ( 'Topic' => array ( array (
'id' => '1' , 'topic' => 'Topic' , 'created' => '2007-03-17 01:16:23' ,
'updated' => '2007-03-17 01:18:31'
)));
2008-06-20 20:17:23 +00:00
$expected = array (
'Article2' => array (
2009-03-09 18:36:32 +00:00
'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'
2008-06-20 20:17:23 +00:00
),
'Topic' => array (
2009-03-09 18:36:32 +00:00
'id' => '1' , 'topic' => 'Topic' , 'created' => '2007-03-17 01:16:23' ,
'updated' => '2007-03-17 01:18:31'
2008-06-20 20:17:23 +00:00
)
);
2011-08-22 01:18:11 +00:00
$this -> testDb -> mergeAssociation ( $data , $merge , 'Topic' , 'hasOne' );
2012-03-23 06:37:12 +00:00
$this -> assertEquals ( $expected , $data );
2008-06-20 20:17:23 +00:00
2009-03-09 18:36:32 +00:00
$data = array ( 'Article2' => 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'
));
$merge = array ( 'User2' => array ( array (
'id' => '1' , 'user' => 'mariano' , 'password' => '5f4dcc3b5aa765d61d8327deb882cf99' ,
'created' => '2007-03-17 01:16:23' , 'updated' => '2007-03-17 01:18:31'
)));
2008-06-20 20:17:23 +00:00
$expected = array (
'Article2' => array (
2009-03-09 18:36:32 +00:00
'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'
2008-06-20 20:17:23 +00:00
),
'User2' => array (
'id' => '1' , 'user' => 'mariano' , 'password' => '5f4dcc3b5aa765d61d8327deb882cf99' , 'created' => '2007-03-17 01:16:23' , 'updated' => '2007-03-17 01:18:31'
)
);
2011-08-22 01:18:11 +00:00
$this -> testDb -> mergeAssociation ( $data , $merge , 'User2' , 'belongsTo' );
2012-03-23 06:37:12 +00:00
$this -> assertEquals ( $expected , $data );
2008-06-20 20:17:23 +00:00
$data = array (
'Article2' => 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'
)
);
$merge = array ( array ( 'Comment' => false ));
$expected = array (
'Article2' => 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 ()
);
2011-08-22 01:18:11 +00:00
$this -> testDb -> mergeAssociation ( $data , $merge , 'Comment' , 'hasMany' );
2012-03-23 06:37:12 +00:00
$this -> assertEquals ( $expected , $data );
2008-06-20 20:17:23 +00:00
$data = 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'
)
);
$merge = array (
array (
'Comment' => array (
'id' => '1' , 'comment' => 'Comment 1' , 'created' => '2007-03-17 01:16:23' , 'updated' => '2007-03-17 01:18:31'
)
),
array (
'Comment' => array (
'id' => '2' , 'comment' => 'Comment 2' , 'created' => '2007-03-17 01:16:23' , 'updated' => '2007-03-17 01:18:31'
)
)
);
$expected = 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' , 'comment' => 'Comment 1' , 'created' => '2007-03-17 01:16:23' , 'updated' => '2007-03-17 01:18:31'
),
array (
'id' => '2' , 'comment' => 'Comment 2' , 'created' => '2007-03-17 01:16:23' , 'updated' => '2007-03-17 01:18:31'
)
)
);
2011-08-22 01:18:11 +00:00
$this -> testDb -> mergeAssociation ( $data , $merge , 'Comment' , 'hasMany' );
2012-03-23 06:37:12 +00:00
$this -> assertEquals ( $expected , $data );
2008-06-20 20:17:23 +00:00
$data = 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'
)
);
$merge = array (
array (
'Comment' => array (
'id' => '1' , 'comment' => 'Comment 1' , 'created' => '2007-03-17 01:16:23' , 'updated' => '2007-03-17 01:18:31'
),
'User2' => array (
'id' => '1' , 'user' => 'mariano' , 'password' => '5f4dcc3b5aa765d61d8327deb882cf99' , 'created' => '2007-03-17 01:16:23' , 'updated' => '2007-03-17 01:18:31'
)
),
array (
'Comment' => array (
'id' => '2' , 'comment' => 'Comment 2' , 'created' => '2007-03-17 01:16:23' , 'updated' => '2007-03-17 01:18:31'
),
'User2' => array (
'id' => '1' , 'user' => 'mariano' , 'password' => '5f4dcc3b5aa765d61d8327deb882cf99' , 'created' => '2007-03-17 01:16:23' , 'updated' => '2007-03-17 01:18:31'
)
)
);
$expected = 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' , 'comment' => 'Comment 1' , 'created' => '2007-03-17 01:16:23' , 'updated' => '2007-03-17 01:18:31' ,
'User2' => array (
'id' => '1' , 'user' => 'mariano' , 'password' => '5f4dcc3b5aa765d61d8327deb882cf99' , 'created' => '2007-03-17 01:16:23' , 'updated' => '2007-03-17 01:18:31'
)
),
array (
'id' => '2' , 'comment' => 'Comment 2' , 'created' => '2007-03-17 01:16:23' , 'updated' => '2007-03-17 01:18:31' ,
'User2' => array (
'id' => '1' , 'user' => 'mariano' , 'password' => '5f4dcc3b5aa765d61d8327deb882cf99' , 'created' => '2007-03-17 01:16:23' , 'updated' => '2007-03-17 01:18:31'
)
)
)
);
2011-08-22 01:18:11 +00:00
$this -> testDb -> mergeAssociation ( $data , $merge , 'Comment' , 'hasMany' );
2012-03-23 06:37:12 +00:00
$this -> assertEquals ( $expected , $data );
2008-06-20 20:17:23 +00:00
$data = 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'
)
);
$merge = array (
array (
'Comment' => array (
'id' => '1' , 'comment' => 'Comment 1' , 'created' => '2007-03-17 01:16:23' , 'updated' => '2007-03-17 01:18:31'
),
'User2' => array (
'id' => '1' , 'user' => 'mariano' , 'password' => '5f4dcc3b5aa765d61d8327deb882cf99' , 'created' => '2007-03-17 01:16:23' , 'updated' => '2007-03-17 01:18:31'
),
'Tag' => array (
array ( 'id' => 1 , 'tag' => 'Tag 1' ),
array ( 'id' => 2 , 'tag' => 'Tag 2' )
)
),
array (
'Comment' => array (
'id' => '2' , 'comment' => 'Comment 2' , 'created' => '2007-03-17 01:16:23' , 'updated' => '2007-03-17 01:18:31'
),
'User2' => array (
'id' => '1' , 'user' => 'mariano' , 'password' => '5f4dcc3b5aa765d61d8327deb882cf99' , 'created' => '2007-03-17 01:16:23' , 'updated' => '2007-03-17 01:18:31'
),
'Tag' => array ()
)
);
$expected = 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' , 'comment' => 'Comment 1' , 'created' => '2007-03-17 01:16:23' , 'updated' => '2007-03-17 01:18:31' ,
'User2' => array (
'id' => '1' , 'user' => 'mariano' , 'password' => '5f4dcc3b5aa765d61d8327deb882cf99' , 'created' => '2007-03-17 01:16:23' , 'updated' => '2007-03-17 01:18:31'
),
'Tag' => array (
array ( 'id' => 1 , 'tag' => 'Tag 1' ),
array ( 'id' => 2 , 'tag' => 'Tag 2' )
)
),
array (
'id' => '2' , 'comment' => 'Comment 2' , 'created' => '2007-03-17 01:16:23' , 'updated' => '2007-03-17 01:18:31' ,
'User2' => array (
'id' => '1' , 'user' => 'mariano' , 'password' => '5f4dcc3b5aa765d61d8327deb882cf99' , 'created' => '2007-03-17 01:16:23' , 'updated' => '2007-03-17 01:18:31'
),
'Tag' => array ()
)
)
);
2011-08-22 01:18:11 +00:00
$this -> testDb -> mergeAssociation ( $data , $merge , 'Comment' , 'hasMany' );
2012-03-23 06:37:12 +00:00
$this -> assertEquals ( $expected , $data );
2008-06-20 20:17:23 +00:00
$data = 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'
)
);
$merge = array (
array (
'Tag' => array (
'id' => '1' , 'tag' => 'Tag 1' , 'created' => '2007-03-17 01:16:23' , 'updated' => '2007-03-17 01:18:31'
)
),
array (
'Tag' => array (
'id' => '2' , 'tag' => 'Tag 2' , 'created' => '2007-03-17 01:16:23' , 'updated' => '2007-03-17 01:18:31'
)
),
array (
'Tag' => array (
'id' => '3' , 'tag' => 'Tag 3' , 'created' => '2007-03-17 01:16:23' , 'updated' => '2007-03-17 01:18:31'
)
)
);
$expected = 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'
),
'Tag' => array (
array (
'id' => '1' , 'tag' => 'Tag 1' , 'created' => '2007-03-17 01:16:23' , 'updated' => '2007-03-17 01:18:31'
),
array (
'id' => '2' , 'tag' => 'Tag 2' , 'created' => '2007-03-17 01:16:23' , 'updated' => '2007-03-17 01:18:31'
),
array (
'id' => '3' , 'tag' => 'Tag 3' , 'created' => '2007-03-17 01:16:23' , 'updated' => '2007-03-17 01:18:31'
)
)
);
2011-08-22 01:18:11 +00:00
$this -> testDb -> mergeAssociation ( $data , $merge , 'Tag' , 'hasAndBelongsToMany' );
2012-03-23 06:37:12 +00:00
$this -> assertEquals ( $expected , $data );
2008-06-20 20:17:23 +00:00
$data = 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'
)
);
$merge = array (
array (
'Tag' => array (
'id' => '1' , 'tag' => 'Tag 1' , 'created' => '2007-03-17 01:16:23' , 'updated' => '2007-03-17 01:18:31'
)
),
array (
'Tag' => array (
'id' => '2' , 'tag' => 'Tag 2' , 'created' => '2007-03-17 01:16:23' , 'updated' => '2007-03-17 01:18:31'
)
),
array (
'Tag' => array (
'id' => '3' , 'tag' => 'Tag 3' , 'created' => '2007-03-17 01:16:23' , 'updated' => '2007-03-17 01:18:31'
)
)
);
$expected = 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'
),
'Tag' => array ( 'id' => '1' , 'tag' => 'Tag 1' , 'created' => '2007-03-17 01:16:23' , 'updated' => '2007-03-17 01:18:31' )
);
2011-08-22 01:18:11 +00:00
$this -> testDb -> mergeAssociation ( $data , $merge , 'Tag' , 'hasOne' );
2012-03-23 06:37:12 +00:00
$this -> assertEquals ( $expected , $data );
2008-06-20 20:17:23 +00:00
}
2009-07-24 19:18:37 +00:00
2008-06-05 15:20:45 +00:00
/**
* testMagicMethodQuerying method
2008-06-14 19:45:26 +00:00
*
2008-06-05 15:20:45 +00:00
* @ return void
*/
2011-05-30 20:02:32 +00:00
public function testMagicMethodQuerying () {
2011-09-03 22:37:26 +00:00
$result = $this -> db -> query ( 'findByFieldName' , array ( 'value' ), $this -> Model );
2008-08-07 16:38:15 +00:00
$expected = array ( 'first' , array (
'conditions' => array ( 'TestModel.field_name' => 'value' ),
'fields' => null , 'order' => null , 'recursive' => null
));
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2009-03-18 17:55:58 +00:00
2011-09-03 22:37:26 +00:00
$result = $this -> db -> query ( 'findByFindBy' , array ( 'value' ), $this -> Model );
2009-02-25 03:22:31 +00:00
$expected = array ( 'first' , array (
'conditions' => array ( 'TestModel.find_by' => 'value' ),
'fields' => null , 'order' => null , 'recursive' => null
));
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2008-05-30 11:40:08 +00:00
2011-09-03 22:37:26 +00:00
$result = $this -> db -> query ( 'findAllByFieldName' , array ( 'value' ), $this -> Model );
2008-08-07 16:38:15 +00:00
$expected = array ( 'all' , array (
'conditions' => array ( 'TestModel.field_name' => 'value' ),
'fields' => null , 'order' => null , 'limit' => null ,
'page' => null , 'recursive' => null
));
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2008-05-30 11:40:08 +00:00
2011-09-03 22:37:26 +00:00
$result = $this -> db -> query ( 'findAllById' , array ( 'a' ), $this -> Model );
2008-08-07 16:38:15 +00:00
$expected = array ( 'all' , array (
'conditions' => array ( 'TestModel.id' => 'a' ),
'fields' => null , 'order' => null , 'limit' => null ,
'page' => null , 'recursive' => null
));
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2008-05-30 11:40:08 +00:00
2011-09-03 22:37:26 +00:00
$result = $this -> db -> query ( 'findByFieldName' , array ( array ( 'value1' , 'value2' , 'value3' )), $this -> Model );
2008-08-07 16:38:15 +00:00
$expected = array ( 'first' , array (
'conditions' => array ( 'TestModel.field_name' => array ( 'value1' , 'value2' , 'value3' )),
'fields' => null , 'order' => null , 'recursive' => null
));
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2008-05-30 11:40:08 +00:00
2011-09-03 22:37:26 +00:00
$result = $this -> db -> query ( 'findByFieldName' , array ( null ), $this -> Model );
2008-08-07 16:38:15 +00:00
$expected = array ( 'first' , array (
'conditions' => array ( 'TestModel.field_name' => null ),
'fields' => null , 'order' => null , 'recursive' => null
));
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2008-05-30 11:40:08 +00:00
2011-09-03 22:37:26 +00:00
$result = $this -> db -> query ( 'findByFieldName' , array ( '= a' ), $this -> Model );
2008-08-07 16:38:15 +00:00
$expected = array ( 'first' , array (
'conditions' => array ( 'TestModel.field_name' => '= a' ),
'fields' => null , 'order' => null , 'recursive' => null
));
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2008-05-30 11:40:08 +00:00
2011-09-03 22:37:26 +00:00
$result = $this -> db -> query ( 'findByFieldName' , array (), $this -> Model );
2008-05-30 11:40:08 +00:00
$expected = false ;
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2015-11-11 13:43:19 +00:00
// findBy<X>And<Y>
$result = $this -> db -> query ( 'findByFieldXAndFieldY' , array ( 'x' , 'y' ), $this -> Model );
$expected = array ( 'first' , array (
'conditions' => array ( 'TestModel.field_x' => 'x' , 'TestModel.field_y' => 'y' ),
'fields' => null , 'order' => null , 'recursive' => null
));
$this -> assertEquals ( $expected , $result );
// findBy<X>Or<Y>
$result = $this -> db -> query ( 'findByFieldXOrFieldY' , array ( 'x' , 'y' ), $this -> Model );
$expected = array ( 'first' , array (
'conditions' => array ( 'OR' => array ( 'TestModel.field_x' => 'x' , 'TestModel.field_y' => 'y' )),
'fields' => null , 'order' => null , 'recursive' => null
));
$this -> assertEquals ( $expected , $result );
// findMyFancySearchBy<X>
$result = $this -> db -> query ( 'findMyFancySearchByFieldX' , array ( 'x' ), $this -> Model );
$expected = array ( 'myFancySearch' , array (
'conditions' => array ( 'TestModel.field_x' => 'x' ),
'fields' => null , 'order' => null , 'limit' => null ,
'page' => null , 'recursive' => null
));
$this -> assertEquals ( $expected , $result );
// findFirstBy<X>
$result = $this -> db -> query ( 'findFirstByFieldX' , array ( 'x' ), $this -> Model );
$expected = array ( 'first' , array (
'conditions' => array ( 'TestModel.field_x' => 'x' ),
'fields' => null , 'order' => null , 'recursive' => null
));
$this -> assertEquals ( $expected , $result );
// findBy<X> with optional parameters
$result = $this -> db -> query ( 'findByFieldX' , array ( 'x' , 'y' , 'priority' , - 1 ), $this -> Model );
$expected = array ( 'first' , array (
'conditions' => array ( 'TestModel.field_x' => 'x' ),
'fields' => 'y' , 'order' => 'priority' , 'recursive' => - 1
));
$this -> assertEquals ( $expected , $result );
// findBy<X>And<Y> with optional parameters
$result = $this -> db -> query ( 'findByFieldXAndFieldY' , array ( 'x' , 'y' , 'z' , 'priority' , - 1 ), $this -> Model );
$expected = array ( 'first' , array (
'conditions' => array ( 'TestModel.field_x' => 'x' , 'TestModel.field_y' => 'y' ),
'fields' => 'z' , 'order' => 'priority' , 'recursive' => - 1
));
$this -> assertEquals ( $expected , $result );
// findAllBy<X> with optional parameters
$result = $this -> db -> query ( 'findAllByFieldX' , array ( 'x' , 'y' , 'priority' , 10 , 2 , - 1 ), $this -> Model );
$expected = array ( 'all' , array (
'conditions' => array ( 'TestModel.field_x' => 'x' ),
'fields' => 'y' , 'order' => 'priority' , 'limit' => 10 ,
'page' => 2 , 'recursive' => - 1
));
$this -> assertEquals ( $expected , $result );
// findAllBy<X>And<Y> with optional parameters
$result = $this -> db -> query ( 'findAllByFieldXAndFieldY' , array ( 'x' , 'y' , 'z' , 'priority' , 10 , 2 , - 1 ), $this -> Model );
$expected = array ( 'all' , array (
'conditions' => array ( 'TestModel.field_x' => 'x' , 'TestModel.field_y' => 'y' ),
'fields' => 'z' , 'order' => 'priority' , 'limit' => 10 ,
'page' => 2 , 'recursive' => - 1
));
$this -> assertEquals ( $expected , $result );
2011-09-03 22:37:26 +00:00
}
2008-05-30 11:40:08 +00:00
2011-09-03 22:37:26 +00:00
/**
* @ expectedException PDOException
* @ return void
*/
public function testDirectCallThrowsException () {
2013-01-23 12:45:50 +00:00
$this -> db -> query ( 'directCall' , array (), $this -> Model );
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-06-05 15:20:45 +00:00
/**
* testValue method
2008-06-14 19:45:26 +00:00
*
2008-06-05 15:20:45 +00:00
* @ return void
*/
2011-05-30 20:02:32 +00:00
public function testValue () {
2012-01-07 06:39:47 +00:00
if ( $this -> db instanceof Sqlserver ) {
$this -> markTestSkipped ( 'Cannot run this test with SqlServer' );
}
2011-09-03 22:37:26 +00:00
$result = $this -> db -> value ( '{$__cakeForeignKey__$}' );
2012-03-23 06:37:12 +00:00
$this -> assertEquals ( '{$__cakeForeignKey__$}' , $result );
2008-05-30 11:40:08 +00:00
2011-09-03 22:37:26 +00:00
$result = $this -> db -> value ( array ( 'first' , 2 , 'third' ));
2008-05-30 11:40:08 +00:00
$expected = array ( '\'first\'' , 2 , '\'third\'' );
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-06-05 15:20:45 +00:00
/**
2013-06-27 15:15:56 +00:00
* Tests if the connection can be re - established and that the new ( optional ) config is set .
2008-06-14 19:45:26 +00:00
*
2008-06-05 15:20:45 +00:00
* @ return void
*/
2011-05-30 20:02:32 +00:00
public function testReconnect () {
2008-08-07 16:38:15 +00:00
$this -> testDb -> reconnect ( array ( 'prefix' => 'foo' ));
2008-05-30 11:40:08 +00:00
$this -> assertTrue ( $this -> testDb -> connected );
2012-03-23 06:37:12 +00:00
$this -> assertEquals ( 'foo' , $this -> testDb -> config [ 'prefix' ]);
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-06-05 15:20:45 +00:00
/**
* testName method
2008-06-14 19:45:26 +00:00
*
2008-06-05 15:20:45 +00:00
* @ return void
*/
2011-05-30 20:02:32 +00:00
public function testName () {
2008-05-30 11:40:08 +00:00
$result = $this -> testDb -> name ( 'name' );
$expected = '`name`' ;
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2008-05-30 11:40:08 +00:00
$result = $this -> testDb -> name ( array ( 'name' , 'Model.*' ));
$expected = array ( '`name`' , '`Model`.*' );
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2008-05-30 11:40:08 +00:00
$result = $this -> testDb -> name ( 'MTD()' );
2008-08-22 04:06:29 +00:00
$expected = 'MTD()' ;
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2008-05-30 11:40:08 +00:00
$result = $this -> testDb -> name ( '(sm)' );
2008-08-22 04:06:29 +00:00
$expected = '(sm)' ;
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2008-08-22 04:06:29 +00:00
2010-01-17 04:14:19 +00:00
$result = $this -> testDb -> name ( 'name AS x' );
$expected = '`name` AS `x`' ;
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2010-01-17 04:14:19 +00:00
$result = $this -> testDb -> name ( 'Model.name AS x' );
$expected = '`Model`.`name` AS `x`' ;
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2010-01-17 04:14:19 +00:00
2008-08-22 04:06:29 +00:00
$result = $this -> testDb -> name ( 'Function(Something.foo)' );
$expected = 'Function(`Something`.`foo`)' ;
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2010-01-17 04:14:19 +00:00
$result = $this -> testDb -> name ( 'Function(SubFunction(Something.foo))' );
$expected = 'Function(SubFunction(`Something`.`foo`))' ;
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2010-01-17 04:14:19 +00:00
$result = $this -> testDb -> name ( 'Function(Something.foo) AS x' );
$expected = 'Function(`Something`.`foo`) AS `x`' ;
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2010-02-19 15:41:52 +00:00
2012-08-31 13:09:30 +00:00
$result = $this -> testDb -> name ( 'I18n__title__pt-br.locale' );
$expected = '`I18n__title__pt-br`.`locale`' ;
$this -> assertEquals ( $expected , $result );
2010-02-19 15:41:52 +00:00
$result = $this -> testDb -> name ( 'name-with-minus' );
$expected = '`name-with-minus`' ;
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2010-02-20 16:42:17 +00:00
$result = $this -> testDb -> name ( array ( 'my-name' , 'Foo-Model.*' ));
$expected = array ( '`my-name`' , '`Foo-Model`.*' );
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2011-01-27 01:58:16 +00:00
2010-11-25 11:52:23 +00:00
$result = $this -> testDb -> name ( array ( 'Team.P%' , 'Team.G/G' ));
$expected = array ( '`Team`.`P%`' , '`Team`.`G/G`' );
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2011-01-27 01:58:16 +00:00
$result = $this -> testDb -> name ( 'Model.name as y' );
$expected = '`Model`.`name` AS `y`' ;
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2010-03-14 03:55:18 +00:00
/**
2012-02-23 23:29:53 +00:00
* test that cacheMethod works as expected
2010-03-14 03:55:18 +00:00
*
* @ return void
*/
2011-05-30 20:02:32 +00:00
public function testCacheMethod () {
2010-03-14 03:55:18 +00:00
$this -> testDb -> cacheMethods = true ;
$result = $this -> testDb -> cacheMethod ( 'name' , 'some-key' , 'stuff' );
2012-03-23 06:37:12 +00:00
$this -> assertEquals ( 'stuff' , $result );
2010-03-14 03:55:18 +00:00
$result = $this -> testDb -> cacheMethod ( 'name' , 'some-key' );
2012-03-23 06:37:12 +00:00
$this -> assertEquals ( 'stuff' , $result );
2010-03-14 03:55:18 +00:00
$result = $this -> testDb -> cacheMethod ( 'conditions' , 'some-key' );
$this -> assertNull ( $result );
$result = $this -> testDb -> cacheMethod ( 'name' , 'other-key' );
$this -> assertNull ( $result );
$this -> testDb -> cacheMethods = false ;
$result = $this -> testDb -> cacheMethod ( 'name' , 'some-key' , 'stuff' );
2012-03-23 06:37:12 +00:00
$this -> assertEquals ( 'stuff' , $result );
2010-03-14 03:55:18 +00:00
$result = $this -> testDb -> cacheMethod ( 'name' , 'some-key' );
$this -> assertNull ( $result );
}
2016-11-14 10:44:35 +00:00
/**
* Test that cacheMethodFilter does not filter by default .
*
* @ return void
*/
public function testCacheMethodFilter () {
$method = 'name' ;
$key = '49d9207adfce6df1dd3ee8c30c434414' ;
$value = '`menus`' ;
$actual = $this -> testDb -> cacheMethodFilter ( $method , $key , $value );
$this -> assertTrue ( $actual );
$method = 'fields' ;
$key = '2b57253ab1fffb3e95fa4f95299220b1' ;
2016-11-14 11:04:36 +00:00
$value = array ( " `Menu`.`id` " , " `Menu`.`name` " );
2016-11-14 10:44:35 +00:00
$actual = $this -> testDb -> cacheMethodFilter ( $method , $key , $value );
$this -> assertTrue ( $actual );
$method = 'non-existing' ;
$key = '' ;
$value = '``' ;
$actual = $this -> testDb -> cacheMethodFilter ( $method , $key , $value );
$this -> assertTrue ( $actual );
}
2016-11-14 11:04:36 +00:00
/**
* Test that cacheMethodFilter can be overridden to do actual filtering .
*
* @ return void
*/
public function testCacheMethodFilterOverridden () {
$testDb = new DboFourthTestSource ();
$method = 'name' ;
$key = '49d9207adfce6df1dd3ee8c30c434414' ;
$value = '`menus`' ;
$actual = $testDb -> cacheMethodFilter ( $method , $key , $value );
$this -> assertFalse ( $actual );
$method = 'name' ;
$key = '1fca740733997f1ebbedacfc7678592a' ;
$value = '`Menu`.`id`' ;
$actual = $testDb -> cacheMethodFilter ( $method , $key , $value );
$this -> assertFalse ( $actual );
$method = 'fields' ;
$key = '2b57253ab1fffb3e95fa4f95299220b1' ;
$value = array ( " `Menu`.`id` " , " `Menu`.`name` " );
$actual = $testDb -> cacheMethodFilter ( $method , $key , $value );
$this -> assertFalse ( $actual );
$method = 'name' ;
$key = 'd2bc458620afb092c61ab4383b7475e0' ;
$value = '`Menu`' ;
$actual = $testDb -> cacheMethodFilter ( $method , $key , $value );
$this -> assertTrue ( $actual );
$method = 'non-existing' ;
$key = '' ;
$value = '``' ;
$actual = $testDb -> cacheMethodFilter ( $method , $key , $value );
$this -> assertTrue ( $actual );
}
2016-11-14 09:00:47 +00:00
/**
* Test that cacheMethodHasher uses md5 by default .
*
* @ return void
*/
public function testCacheMethodHasher () {
$name = 'Model.fieldlbqndkezcoapfgirmjsh' ;
$actual = $this -> testDb -> cacheMethodHasher ( $name );
$expected = '4a45dc9ed52f98c393d04ac424ee5078' ;
$this -> assertEquals ( $expected , $actual );
}
/**
* Test that cacheMethodHasher can be overridden to use a different hashing algorithm .
*
* @ return void
*/
public function testCacheMethodHasherOverridden () {
$testDb = new DboThirdTestSource ();
$name = 'Model.fieldlbqndkezcoapfgirmjsh' ;
$actual = $testDb -> cacheMethodHasher ( $name );
2016-11-14 09:27:51 +00:00
$expected = 'beb8b6469359285b7c2865dce0ef743feb16cb71' ;
2016-11-14 09:00:47 +00:00
$this -> assertEquals ( $expected , $actual );
}
2012-05-31 17:38:40 +00:00
/**
* Test that rare collisions do not happen with method caching
*
* @ return void
*/
public function testNameMethodCacheCollisions () {
$this -> testDb -> cacheMethods = true ;
$this -> testDb -> flushMethodCache ();
$this -> testDb -> name ( 'Model.fieldlbqndkezcoapfgirmjsh' );
$result = $this -> testDb -> name ( 'Model.fieldkhdfjmelarbqnzsogcpi' );
$expected = '`Model`.`fieldkhdfjmelarbqnzsogcpi`' ;
$this -> assertEquals ( $expected , $result );
}
2013-10-01 18:34:40 +00:00
/**
* Test that flushMethodCache works as expected
2013-10-11 22:58:14 +00:00
*
2013-10-01 18:34:40 +00:00
* @ return void
*/
public function testFlushMethodCache () {
$this -> testDb -> cacheMethods = true ;
2013-10-11 22:58:14 +00:00
$this -> testDb -> cacheMethod ( 'name' , 'some-key' , 'stuff' );
2013-10-01 18:34:40 +00:00
Cache :: write ( 'method_cache' , DboTestSource :: $methodCache , '_cake_core_' );
$this -> testDb -> flushMethodCache ();
2013-10-11 22:58:14 +00:00
$result = $this -> testDb -> cacheMethod ( 'name' , 'some-key' );
2013-10-01 18:34:40 +00:00
$this -> assertNull ( $result );
}
2008-06-05 15:20:45 +00:00
/**
* testLog method
2008-06-14 19:45:26 +00:00
*
2011-09-03 21:07:45 +00:00
* @ outputBuffering enabled
2008-06-05 15:20:45 +00:00
* @ return void
*/
2011-05-30 20:02:32 +00:00
public function testLog () {
2008-05-30 11:40:08 +00:00
$this -> testDb -> logQuery ( 'Query 1' );
$this -> testDb -> logQuery ( 'Query 2' );
2009-12-20 00:54:49 +00:00
$log = $this -> testDb -> getLog ( false , false );
2012-04-04 23:33:57 +00:00
$result = Hash :: extract ( $log [ 'log' ], '{n}.query' );
2008-05-30 11:40:08 +00:00
$expected = array ( 'Query 1' , 'Query 2' );
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2011-10-28 05:01:17 +00:00
2011-09-03 16:47:00 +00:00
$oldDebug = Configure :: read ( 'debug' );
2009-12-20 00:54:49 +00:00
Configure :: write ( 'debug' , 2 );
2008-05-30 11:40:08 +00:00
ob_start ();
$this -> testDb -> showLog ();
2008-06-14 19:45:26 +00:00
$contents = ob_get_clean ();
2008-05-30 11:40:08 +00:00
2011-11-16 00:07:56 +00:00
$this -> assertRegExp ( '/Query 1/s' , $contents );
$this -> assertRegExp ( '/Query 2/s' , $contents );
2008-05-30 11:40:08 +00:00
ob_start ();
$this -> testDb -> showLog ( true );
2008-06-14 19:45:26 +00:00
$contents = ob_get_clean ();
2008-05-30 11:40:08 +00:00
2011-11-16 00:07:56 +00:00
$this -> assertRegExp ( '/Query 1/s' , $contents );
$this -> assertRegExp ( '/Query 2/s' , $contents );
2008-05-30 11:40:08 +00:00
Configure :: write ( 'debug' , $oldDebug );
}
2009-07-24 19:18:37 +00:00
2009-09-02 03:23:47 +00:00
/**
* test getting the query log as an array .
*
* @ return void
2009-11-14 12:19:25 +00:00
*/
2011-05-30 20:02:32 +00:00
public function testGetLog () {
2009-09-02 03:23:47 +00:00
$this -> testDb -> logQuery ( 'Query 1' );
$this -> testDb -> logQuery ( 'Query 2' );
$log = $this -> testDb -> getLog ();
2012-02-04 02:21:06 +00:00
$expected = array ( 'query' => 'Query 1' , 'params' => array (), 'affected' => '' , 'numRows' => '' , 'took' => '' );
2012-01-21 20:18:17 +00:00
2012-03-23 06:37:12 +00:00
$this -> assertEquals ( $expected , $log [ 'log' ][ 0 ]);
2012-02-04 02:21:06 +00:00
$expected = array ( 'query' => 'Query 2' , 'params' => array (), 'affected' => '' , 'numRows' => '' , 'took' => '' );
2012-03-23 06:37:12 +00:00
$this -> assertEquals ( $expected , $log [ 'log' ][ 1 ]);
2011-09-03 16:47:00 +00:00
$expected = array ( 'query' => 'Error 1' , 'affected' => '' , 'numRows' => '' , 'took' => '' );
2009-09-02 03:23:47 +00:00
}
2012-02-04 02:21:06 +00:00
/**
* test getting the query log as an array , setting bind params .
*
* @ return void
*/
public function testGetLogParams () {
2013-06-09 15:39:48 +00:00
$this -> testDb -> logQuery ( 'Query 1' , array ( 1 , 2 , 'abc' ));
2012-02-04 02:21:06 +00:00
$this -> testDb -> logQuery ( 'Query 2' , array ( 'field1' => 1 , 'field2' => 'abc' ));
$log = $this -> testDb -> getLog ();
2013-06-09 15:39:48 +00:00
$expected = array ( 'query' => 'Query 1' , 'params' => array ( 1 , 2 , 'abc' ), 'affected' => '' , 'numRows' => '' , 'took' => '' );
2012-03-23 06:37:12 +00:00
$this -> assertEquals ( $expected , $log [ 'log' ][ 0 ]);
2012-02-04 02:21:06 +00:00
$expected = array ( 'query' => 'Query 2' , 'params' => array ( 'field1' => 1 , 'field2' => 'abc' ), 'affected' => '' , 'numRows' => '' , 'took' => '' );
2012-03-23 06:37:12 +00:00
$this -> assertEquals ( $expected , $log [ 'log' ][ 1 ]);
2012-02-04 02:21:06 +00:00
}
2009-10-30 00:31:29 +00:00
/**
* test that query () returns boolean values from operations like CREATE TABLE
*
* @ return void
2009-11-14 12:19:25 +00:00
*/
2011-05-30 20:02:32 +00:00
public function testFetchAllBooleanReturns () {
2009-10-30 00:31:29 +00:00
$name = $this -> db -> fullTableName ( 'test_query' );
$query = " CREATE TABLE { $name } (name varchar(10)); " ;
$result = $this -> db -> query ( $query );
2010-10-17 00:58:07 +00:00
$this -> assertTrue ( $result , 'Query did not return a boolean' );
2009-10-30 00:31:29 +00:00
$query = " DROP TABLE { $name } ; " ;
2010-10-17 00:58:07 +00:00
$result = $this -> db -> query ( $query );
$this -> assertTrue ( $result , 'Query did not return a boolean' );
2009-10-30 00:31:29 +00:00
}
2015-01-05 17:04:24 +00:00
/**
* Test NOT NULL on ENUM data type with empty string as a value
*
* @ return void
*/
public function testNotNullOnEnum () {
if ( ! $this -> db instanceof Mysql ) {
$this -> markTestSkipped ( 'This test can only run on MySQL' );
}
$name = $this -> db -> fullTableName ( 'enum_tests' );
$query = " CREATE TABLE { $name } (mood ENUM('','happy','sad','ok') NOT NULL); " ;
$result = $this -> db -> query ( $query );
$this -> assertTrue ( $result );
$EnumTest = ClassRegistry :: init ( 'EnumTest' );
$enumResult = $EnumTest -> save ( array ( 'mood' => '' ));
$query = " DROP TABLE { $name } ; " ;
$result = $this -> db -> query ( $query );
$this -> assertTrue ( $result );
$this -> assertEquals ( array (
'EnumTest' => array (
'mood' => '' ,
'id' => '0'
)
), $enumResult );
}
2009-12-17 19:20:36 +00:00
/**
* test order to generate query order clause for virtual fields
*
* @ return void
*/
2011-05-30 20:02:32 +00:00
public function testVirtualFieldsInOrder () {
2010-10-17 14:48:46 +00:00
$Article = ClassRegistry :: init ( 'Article' );
2009-12-17 19:12:46 +00:00
$Article -> virtualFields = array (
'this_moment' => 'NOW()' ,
'two' => '1 + 1' ,
);
2009-12-19 00:16:10 +00:00
$order = array ( 'two' , 'this_moment' );
$result = $this -> db -> order ( $order , 'ASC' , $Article );
2009-12-17 19:12:46 +00:00
$expected = ' ORDER BY (1 + 1) ASC, (NOW()) ASC' ;
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2010-05-31 00:30:58 +00:00
$order = array ( 'Article.two' , 'Article.this_moment' );
$result = $this -> db -> order ( $order , 'ASC' , $Article );
$expected = ' ORDER BY (1 + 1) ASC, (NOW()) ASC' ;
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2009-12-17 19:12:46 +00:00
}
2010-06-09 03:29:40 +00:00
/**
* test the permutations of fullTableName ()
*
* @ return void
*/
2011-05-30 20:02:32 +00:00
public function testFullTablePermutations () {
2010-10-17 14:48:46 +00:00
$Article = ClassRegistry :: init ( 'Article' );
2011-11-08 05:38:36 +00:00
$result = $this -> testDb -> fullTableName ( $Article , false , false );
2012-03-23 06:37:12 +00:00
$this -> assertEquals ( 'articles' , $result );
2010-06-09 03:29:40 +00:00
$Article -> tablePrefix = 'tbl_' ;
2011-11-08 05:38:36 +00:00
$result = $this -> testDb -> fullTableName ( $Article , false , false );
2012-03-23 06:37:12 +00:00
$this -> assertEquals ( 'tbl_articles' , $result );
2011-05-16 22:49:00 +00:00
2010-09-22 00:34:27 +00:00
$Article -> useTable = $Article -> table = 'with spaces' ;
$Article -> tablePrefix = '' ;
2011-11-08 05:38:36 +00:00
$result = $this -> testDb -> fullTableName ( $Article , true , false );
2012-03-23 06:37:12 +00:00
$this -> assertEquals ( '`with spaces`' , $result );
2011-12-29 12:17:06 +00:00
$this -> loadFixtures ( 'Article' );
$Article -> useTable = $Article -> table = 'articles' ;
$Article -> setDataSource ( 'test' );
$testdb = $Article -> getDataSource ();
$result = $testdb -> fullTableName ( $Article , false , true );
$this -> assertEquals ( $testdb -> getSchemaName () . '.articles' , $result );
// tests for empty schemaName
$noschema = ConnectionManager :: create ( 'noschema' , array (
'datasource' => 'DboTestSource'
));
$Article -> setDataSource ( 'noschema' );
$Article -> schemaName = null ;
$result = $noschema -> fullTableName ( $Article , false , true );
$this -> assertEquals ( 'articles' , $result );
2012-04-04 13:00:36 +00:00
$this -> testDb -> config [ 'prefix' ] = 't_' ;
$result = $this -> testDb -> fullTableName ( 'post_tag' , false , false );
$this -> assertEquals ( 't_post_tag' , $result );
2010-06-09 03:29:40 +00:00
}
2010-07-11 17:06:33 +00:00
/**
* test that read () only calls queryAssociation on db objects when the method is defined .
*
* @ return void
*/
2011-05-30 20:02:32 +00:00
public function testReadOnlyCallingQueryAssociationWhenDefined () {
2010-11-11 04:01:54 +00:00
$this -> loadFixtures ( 'Article' , 'User' , 'ArticlesTag' , 'Tag' );
2010-07-11 17:06:33 +00:00
ConnectionManager :: create ( 'test_no_queryAssociation' , array (
2010-12-22 04:41:40 +00:00
'datasource' => 'MockDataSource'
2010-07-11 17:06:33 +00:00
));
2010-10-17 00:58:07 +00:00
$Article = ClassRegistry :: init ( 'Article' );
2010-07-11 17:06:33 +00:00
$Article -> Comment -> useDbConfig = 'test_no_queryAssociation' ;
$result = $Article -> find ( 'all' );
$this -> assertTrue ( is_array ( $result ));
}
2010-10-21 02:28:31 +00:00
2012-05-27 21:16:20 +00:00
/**
* test that queryAssociation () reuse already joined data for 'belongsTo' and 'hasOne' associations
* instead of running unneeded queries for each record
*
* @ return void
*/
public function testQueryAssociationUnneededQueries () {
$this -> loadFixtures ( 'Article' , 'User' , 'Comment' , 'Attachment' , 'Tag' , 'ArticlesTag' );
2014-04-10 18:11:58 +00:00
$Comment = ClassRegistry :: init ( 'Comment' );
2012-05-27 21:16:20 +00:00
$fullDebug = $this -> db -> fullDebug ;
$this -> db -> fullDebug = true ;
$Comment -> find ( 'all' , array ( 'recursive' => 2 )); // ensure Model descriptions are saved
$this -> db -> getLog ();
2013-07-05 12:36:40 +00:00
// case: Comment belongsTo User and Article
2012-05-27 21:16:20 +00:00
$Comment -> unbindModel ( array (
'hasOne' => array ( 'Attachment' )
));
$Comment -> Article -> unbindModel ( array (
'belongsTo' => array ( 'User' ),
'hasMany' => array ( 'Comment' ),
'hasAndBelongsToMany' => array ( 'Tag' )
));
$Comment -> find ( 'all' , array ( 'recursive' => 2 ));
$log = $this -> db -> getLog ();
$this -> assertEquals ( 1 , count ( $log [ 'log' ]));
// case: Comment belongsTo Article, Article belongsTo User
$Comment -> unbindModel ( array (
'belongsTo' => array ( 'User' ),
'hasOne' => array ( 'Attachment' )
));
$Comment -> Article -> unbindModel ( array (
'hasMany' => array ( 'Comment' ),
'hasAndBelongsToMany' => array ( 'Tag' ),
));
$Comment -> find ( 'all' , array ( 'recursive' => 2 ));
$log = $this -> db -> getLog ();
$this -> assertEquals ( 7 , count ( $log [ 'log' ]));
// case: Comment hasOne Attachment
$Comment -> unbindModel ( array (
'belongsTo' => array ( 'Article' , 'User' ),
));
$Comment -> Attachment -> unbindModel ( array (
'belongsTo' => array ( 'Comment' ),
));
$Comment -> find ( 'all' , array ( 'recursive' => 2 ));
$log = $this -> db -> getLog ();
$this -> assertEquals ( 1 , count ( $log [ 'log' ]));
$this -> db -> fullDebug = $fullDebug ;
}
2014-04-10 18:11:58 +00:00
/**
* Tests that generation association queries without LinkModel still works .
* Mainly BC .
*
* @ return void
*/
public function testGenerateAssociationQuery () {
$this -> loadFixtures ( 'Article' );
$Article = ClassRegistry :: init ( 'Article' );
$queryData = array (
'conditions' => array (
'Article.id' => 1
),
'fields' => array (
'Article.id' ,
'Article.title' ,
),
'joins' => array (),
'limit' => 2 ,
'offset' => 2 ,
'order' => array ( 'title' ),
'page' => 2 ,
'group' => null ,
'callbacks' => 1
);
$result = $this -> db -> generateAssociationQuery ( $Article , null , null , null , null , $queryData , false );
$this -> assertContains ( 'SELECT' , $result );
$this -> assertContains ( 'FROM' , $result );
$this -> assertContains ( 'WHERE' , $result );
$this -> assertContains ( 'ORDER' , $result );
}
2010-10-21 02:28:31 +00:00
/**
* test that fields () is using methodCache ()
*
* @ return void
*/
2011-05-30 20:02:32 +00:00
public function testFieldsUsingMethodCache () {
2010-10-21 02:28:31 +00:00
$this -> testDb -> cacheMethods = false ;
2011-11-14 01:47:55 +00:00
DboTestSource :: $methodCache = array ();
2010-10-21 02:28:31 +00:00
2010-11-09 06:13:23 +00:00
$Article = ClassRegistry :: init ( 'Article' );
2010-10-21 02:28:31 +00:00
$this -> testDb -> fields ( $Article , null , array ( 'title' , 'body' , 'published' ));
2011-11-14 01:47:55 +00:00
$this -> assertTrue ( empty ( DboTestSource :: $methodCache [ 'fields' ]), 'Cache not empty' );
2010-10-21 02:28:31 +00:00
}
2010-11-11 04:52:08 +00:00
2012-05-31 19:00:06 +00:00
/**
* test that fields () method cache detects datasource changes
*
* @ return void
*/
public function testFieldsCacheKeyWithDatasourceChange () {
ConnectionManager :: create ( 'firstschema' , array (
'datasource' => 'DboTestSource'
));
ConnectionManager :: create ( 'secondschema' , array (
'datasource' => 'DboSecondTestSource'
));
Cache :: delete ( 'method_cache' , '_cake_core_' );
DboTestSource :: $methodCache = array ();
$Article = ClassRegistry :: init ( 'Article' );
$Article -> setDataSource ( 'firstschema' );
$ds = $Article -> getDataSource ();
$ds -> cacheMethods = true ;
$first = $ds -> fields ( $Article , null , array ( 'title' , 'body' , 'published' ));
$Article -> setDataSource ( 'secondschema' );
$ds = $Article -> getDataSource ();
$ds -> cacheMethods = true ;
$second = $ds -> fields ( $Article , null , array ( 'title' , 'body' , 'published' ));
$this -> assertNotEquals ( $first , $second );
$this -> assertEquals ( 2 , count ( DboTestSource :: $methodCache [ 'fields' ]));
}
2013-09-26 10:56:14 +00:00
/**
* test that fields () method cache detects schema name changes
*
* @ return void
*/
public function testFieldsCacheKeyWithSchemanameChange () {
2013-09-27 12:03:32 +00:00
if ( $this -> db instanceof Postgres || $this -> db instanceof Sqlserver ) {
$this -> markTestSkipped ( 'Cannot run this test with SqlServer or Postgres' );
}
2013-09-26 10:56:14 +00:00
Cache :: delete ( 'method_cache' , '_cake_core_' );
DboSource :: $methodCache = array ();
$Article = ClassRegistry :: init ( 'Article' );
$ds = $Article -> getDataSource ();
$ds -> cacheMethods = true ;
$first = $ds -> fields ( $Article );
$Article -> schemaName = 'secondSchema' ;
$ds = $Article -> getDataSource ();
$ds -> cacheMethods = true ;
$second = $ds -> fields ( $Article );
$this -> assertEquals ( 2 , count ( DboSource :: $methodCache [ 'fields' ]));
}
2011-06-23 19:48:06 +00:00
/**
* Test that group works without a model
*
* @ return void
*/
2012-02-17 07:13:12 +00:00
public function testGroupNoModel () {
2011-06-23 19:48:06 +00:00
$result = $this -> db -> group ( 'created' );
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( ' GROUP BY created' , $result );
2011-06-23 19:48:06 +00:00
}
2011-10-01 01:56:39 +00:00
/**
* Test getting the last error .
2014-04-02 01:02:37 +00:00
*
* @ return void
2011-10-01 01:56:39 +00:00
*/
2012-02-17 07:13:12 +00:00
public function testLastError () {
2011-10-01 01:56:39 +00:00
$stmt = $this -> getMock ( 'PDOStatement' );
$stmt -> expects ( $this -> any ())
-> method ( 'errorInfo' )
-> will ( $this -> returnValue ( array ( '' , 'something' , 'bad' )));
$result = $this -> db -> lastError ( $stmt );
$expected = 'something: bad' ;
$this -> assertEquals ( $expected , $result );
}
2012-01-21 20:18:17 +00:00
/**
* Tests that transaction commands are logged
*
* @ return void
2013-01-11 14:06:54 +00:00
*/
2012-01-21 20:18:17 +00:00
public function testTransactionLogging () {
2012-02-04 02:21:06 +00:00
$conn = $this -> getMock ( 'MockPDO' );
2014-04-10 18:11:58 +00:00
$db = new DboTestSource ();
2012-02-04 02:21:06 +00:00
$db -> setConnection ( $conn );
$conn -> expects ( $this -> exactly ( 2 )) -> method ( 'beginTransaction' )
-> will ( $this -> returnValue ( true ));
$conn -> expects ( $this -> once ()) -> method ( 'commit' ) -> will ( $this -> returnValue ( true ));
$conn -> expects ( $this -> once ()) -> method ( 'rollback' ) -> will ( $this -> returnValue ( true ));
$db -> begin ();
$log = $db -> getLog ();
$expected = array ( 'query' => 'BEGIN' , 'params' => array (), 'affected' => '' , 'numRows' => '' , 'took' => '' );
$this -> assertEquals ( $expected , $log [ 'log' ][ 0 ]);
$db -> commit ();
$expected = array ( 'query' => 'COMMIT' , 'params' => array (), 'affected' => '' , 'numRows' => '' , 'took' => '' );
$log = $db -> getLog ();
$this -> assertEquals ( $expected , $log [ 'log' ][ 0 ]);
$db -> begin ();
$expected = array ( 'query' => 'BEGIN' , 'params' => array (), 'affected' => '' , 'numRows' => '' , 'took' => '' );
$log = $db -> getLog ();
$this -> assertEquals ( $expected , $log [ 'log' ][ 0 ]);
$db -> rollback ();
$expected = array ( 'query' => 'ROLLBACK' , 'params' => array (), 'affected' => '' , 'numRows' => '' , 'took' => '' );
$log = $db -> getLog ();
$this -> assertEquals ( $expected , $log [ 'log' ][ 0 ]);
2012-01-21 20:18:17 +00:00
}
2012-04-03 03:23:53 +00:00
2012-04-01 03:14:49 +00:00
/**
* Test nested transaction calls
*
* @ return void
*/
public function testTransactionNested () {
$conn = $this -> getMock ( 'MockPDO' );
$db = new DboTestSource ();
$db -> setConnection ( $conn );
2012-04-27 00:53:18 +00:00
$db -> useNestedTransactions = true ;
2012-04-25 02:28:47 +00:00
$db -> nestedSupport = true ;
2012-04-01 03:14:49 +00:00
$conn -> expects ( $this -> at ( 0 )) -> method ( 'beginTransaction' ) -> will ( $this -> returnValue ( true ));
$conn -> expects ( $this -> at ( 1 )) -> method ( 'exec' ) -> with ( $this -> equalTo ( 'SAVEPOINT LEVEL1' )) -> will ( $this -> returnValue ( true ));
$conn -> expects ( $this -> at ( 2 )) -> method ( 'exec' ) -> with ( $this -> equalTo ( 'RELEASE SAVEPOINT LEVEL1' )) -> will ( $this -> returnValue ( true ));
$conn -> expects ( $this -> at ( 3 )) -> method ( 'exec' ) -> with ( $this -> equalTo ( 'SAVEPOINT LEVEL1' )) -> will ( $this -> returnValue ( true ));
$conn -> expects ( $this -> at ( 4 )) -> method ( 'exec' ) -> with ( $this -> equalTo ( 'ROLLBACK TO SAVEPOINT LEVEL1' )) -> will ( $this -> returnValue ( true ));
$conn -> expects ( $this -> at ( 5 )) -> method ( 'commit' ) -> will ( $this -> returnValue ( true ));
2012-04-14 20:46:47 +00:00
$this -> _runTransactions ( $db );
2012-04-01 03:14:49 +00:00
}
2012-04-01 04:41:16 +00:00
/**
* Test nested transaction calls without support
*
* @ return void
*/
public function testTransactionNestedWithoutSupport () {
2012-04-14 20:41:08 +00:00
$conn = $this -> getMock ( 'MockPDO' );
$db = new DboTestSource ();
$db -> setConnection ( $conn );
2012-04-27 00:53:18 +00:00
$db -> useNestedTransactions = true ;
2012-04-25 02:28:47 +00:00
$db -> nestedSupport = false ;
2012-04-14 20:41:08 +00:00
$conn -> expects ( $this -> once ()) -> method ( 'beginTransaction' ) -> will ( $this -> returnValue ( true ));
$conn -> expects ( $this -> never ()) -> method ( 'exec' );
$conn -> expects ( $this -> once ()) -> method ( 'commit' ) -> will ( $this -> returnValue ( true ));
2012-04-14 20:46:47 +00:00
$this -> _runTransactions ( $db );
2012-04-14 20:41:08 +00:00
}
/**
* Test nested transaction disabled
*
* @ return void
*/
public function testTransactionNestedDisabled () {
2012-04-01 04:41:16 +00:00
$conn = $this -> getMock ( 'MockPDO' );
$db = new DboTestSource ();
$db -> setConnection ( $conn );
2012-04-27 00:53:18 +00:00
$db -> useNestedTransactions = false ;
2012-04-25 02:28:47 +00:00
$db -> nestedSupport = true ;
2012-04-01 04:41:16 +00:00
$conn -> expects ( $this -> once ()) -> method ( 'beginTransaction' ) -> will ( $this -> returnValue ( true ));
$conn -> expects ( $this -> never ()) -> method ( 'exec' );
$conn -> expects ( $this -> once ()) -> method ( 'commit' ) -> will ( $this -> returnValue ( true ));
2012-04-14 20:46:47 +00:00
$this -> _runTransactions ( $db );
}
/**
* Nested transaction calls
*
* @ param DboTestSource $db
* @ return void
*/
protected function _runTransactions ( $db ) {
2012-04-01 04:41:16 +00:00
$db -> begin ();
$db -> begin ();
$db -> commit ();
$db -> begin ();
$db -> rollback ();
$db -> commit ();
}
2012-03-13 17:37:17 +00:00
/**
2012-04-05 21:27:21 +00:00
* Test build statement with some fields missing
2012-04-03 03:23:53 +00:00
*
2012-03-13 17:37:17 +00:00
* @ return void
*/
public function testBuildStatementDefaults () {
2013-01-23 12:45:50 +00:00
$conn = $this -> getMock ( 'MockPDO' , array ( 'quote' ));
$conn -> expects ( $this -> at ( 0 ))
-> method ( 'quote' )
-> will ( $this -> returnValue ( 'foo bar' ));
2014-04-10 18:11:58 +00:00
$db = new DboTestSource ();
2012-03-13 17:37:17 +00:00
$db -> setConnection ( $conn );
$subQuery = $db -> buildStatement (
array (
'fields' => array ( 'DISTINCT(AssetsTag.asset_id)' ),
'table' => " assets_tags " ,
2012-04-03 03:23:53 +00:00
'alias' => " AssetsTag " ,
'conditions' => array ( " Tag.name " => 'foo bar' ),
'limit' => null ,
2012-03-13 17:37:17 +00:00
'group' => " AssetsTag.asset_id "
),
$this -> Model
);
2013-10-22 12:29:36 +00:00
$expected = 'SELECT DISTINCT(AssetsTag.asset_id) FROM assets_tags AS AssetsTag WHERE Tag.name = foo bar GROUP BY AssetsTag.asset_id' ;
2013-01-23 12:45:50 +00:00
$this -> assertEquals ( $expected , $subQuery );
2012-03-13 17:37:17 +00:00
}
2012-04-03 03:23:53 +00:00
2012-04-02 16:46:30 +00:00
/**
* data provider for testBuildJoinStatement
*
* @ return array
*/
2013-09-05 16:45:48 +00:00
public static function joinStatements () {
2012-04-02 16:46:30 +00:00
return array (
2013-09-05 16:45:48 +00:00
array ( array (
'type' => 'CROSS' ,
'alias' => 'PostsTag' ,
'table' => 'posts_tags' ,
'conditions' => array ( '1 = 1' )
), 'CROSS JOIN cakephp.posts_tags AS PostsTag' ),
2014-08-08 14:02:09 +00:00
array ( array (
'type' => 'LEFT' ,
'alias' => 'PostsTag' ,
'table' => 'posts_tags' ,
), 'LEFT JOIN cakephp.posts_tags AS PostsTag' ),
2012-04-02 16:46:30 +00:00
array ( array (
'type' => 'LEFT' ,
'alias' => 'PostsTag' ,
'table' => 'posts_tags' ,
'conditions' => array ( 'PostsTag.post_id = Post.id' )
), 'LEFT JOIN cakephp.posts_tags AS PostsTag ON (PostsTag.post_id = Post.id)' ),
array ( array (
'type' => 'LEFT' ,
'alias' => 'Stock' ,
'table' => '(SELECT Stock.article_id, sum(quantite) quantite FROM stocks AS Stock GROUP BY Stock.article_id)' ,
'conditions' => 'Stock.article_id = Article.id'
), 'LEFT JOIN (SELECT Stock.article_id, sum(quantite) quantite FROM stocks AS Stock GROUP BY Stock.article_id) AS Stock ON (Stock.article_id = Article.id)' )
);
}
/**
* Test buildJoinStatement ()
* ensure that schemaName is not added when table value is a subquery
*
* @ dataProvider joinStatements
* @ return void
*/
public function testBuildJoinStatement ( $join , $expected ) {
$db = $this -> getMock ( 'DboTestSource' , array ( 'getSchemaName' ));
$db -> expects ( $this -> any ())
-> method ( 'getSchemaName' )
-> will ( $this -> returnValue ( 'cakephp' ));
$result = $db -> buildJoinStatement ( $join );
$this -> assertEquals ( $expected , $result );
}
2012-04-11 01:32:37 +00:00
2013-01-31 09:01:14 +00:00
/**
* data provider for testBuildJoinStatementWithTablePrefix
*
* @ return array
*/
public static function joinStatementsWithPrefix ( $schema ) {
return array (
array ( array (
'type' => 'LEFT' ,
'alias' => 'PostsTag' ,
'table' => 'posts_tags' ,
'conditions' => array ( 'PostsTag.post_id = Post.id' )
), 'LEFT JOIN pre_posts_tags AS PostsTag ON (PostsTag.post_id = Post.id)' ),
array ( array (
'type' => 'LEFT' ,
'alias' => 'Stock' ,
'table' => '(SELECT Stock.article_id, sum(quantite) quantite FROM stocks AS Stock GROUP BY Stock.article_id)' ,
'conditions' => 'Stock.article_id = Article.id'
), 'LEFT JOIN (SELECT Stock.article_id, sum(quantite) quantite FROM stocks AS Stock GROUP BY Stock.article_id) AS Stock ON (Stock.article_id = Article.id)' )
);
}
/**
* Test buildJoinStatement ()
* ensure that prefix is not added when table value is a subquery
*
* @ dataProvider joinStatementsWithPrefix
* @ return void
*/
public function testBuildJoinStatementWithTablePrefix ( $join , $expected ) {
2014-04-10 18:11:58 +00:00
$db = new DboTestSource ();
2013-01-31 09:01:14 +00:00
$db -> config [ 'prefix' ] = 'pre_' ;
$result = $db -> buildJoinStatement ( $join );
$this -> assertEquals ( $expected , $result );
}
2012-11-17 22:14:40 +00:00
/**
* Test conditionKeysToString ()
*
* @ return void
*/
public function testConditionKeysToString () {
$Article = ClassRegistry :: init ( 'Article' );
$conn = $this -> getMock ( 'MockPDO' , array ( 'quote' ));
2014-04-10 18:11:58 +00:00
$db = new DboTestSource ();
2012-11-17 22:14:40 +00:00
$db -> setConnection ( $conn );
$conn -> expects ( $this -> at ( 0 ))
-> method ( 'quote' )
-> will ( $this -> returnValue ( 'just text' ));
$conditions = array ( 'Article.name' => 'just text' );
$result = $db -> conditionKeysToString ( $conditions , true , $Article );
$expected = " Article.name = just text " ;
$this -> assertEquals ( $expected , $result [ 0 ]);
$conn -> expects ( $this -> at ( 0 ))
-> method ( 'quote' )
-> will ( $this -> returnValue ( 'just text' ));
$conn -> expects ( $this -> at ( 1 ))
-> method ( 'quote' )
-> will ( $this -> returnValue ( 'other text' ));
$conditions = array ( 'Article.name' => array ( 'just text' , 'other text' ));
$result = $db -> conditionKeysToString ( $conditions , true , $Article );
$expected = " Article.name IN (just text, other text) " ;
$this -> assertEquals ( $expected , $result [ 0 ]);
}
/**
* Test conditionKeysToString () with virtual field
*
* @ return void
*/
public function testConditionKeysToStringVirtualField () {
$Article = ClassRegistry :: init ( 'Article' );
$Article -> virtualFields = array (
'extra' => 'something virtual'
);
$conn = $this -> getMock ( 'MockPDO' , array ( 'quote' ));
2014-04-10 18:11:58 +00:00
$db = new DboTestSource ();
2012-11-17 22:14:40 +00:00
$db -> setConnection ( $conn );
$conn -> expects ( $this -> at ( 0 ))
-> method ( 'quote' )
-> will ( $this -> returnValue ( 'just text' ));
$conditions = array ( 'Article.extra' => 'just text' );
$result = $db -> conditionKeysToString ( $conditions , true , $Article );
$expected = " ( " . $Article -> virtualFields [ 'extra' ] . " ) = just text " ;
$this -> assertEquals ( $expected , $result [ 0 ]);
$conn -> expects ( $this -> at ( 0 ))
-> method ( 'quote' )
-> will ( $this -> returnValue ( 'just text' ));
$conn -> expects ( $this -> at ( 1 ))
-> method ( 'quote' )
-> will ( $this -> returnValue ( 'other text' ));
$conditions = array ( 'Article.extra' => array ( 'just text' , 'other text' ));
$result = $db -> conditionKeysToString ( $conditions , true , $Article );
$expected = " ( " . $Article -> virtualFields [ 'extra' ] . " ) IN (just text, other text) " ;
$this -> assertEquals ( $expected , $result [ 0 ]);
}
2013-05-03 02:13:09 +00:00
/**
* Test the limit function .
*
* @ return void
*/
public function testLimit () {
2014-04-10 18:11:58 +00:00
$db = new DboTestSource ();
2013-05-03 02:13:09 +00:00
$result = $db -> limit ( '0' );
$this -> assertNull ( $result );
$result = $db -> limit ( '10' );
$this -> assertEquals ( ' LIMIT 10' , $result );
$result = $db -> limit ( 'FARTS' , 'BOOGERS' );
$this -> assertEquals ( ' LIMIT 0, 0' , $result );
$result = $db -> limit ( 20 , 10 );
$this -> assertEquals ( ' LIMIT 10, 20' , $result );
$result = $db -> limit ( 10 , 300000000000000000000000000000 );
2013-06-06 15:45:52 +00:00
$scientificNotation = sprintf ( '%.1E' , 300000000000000000000000000000 );
$this -> assertNotContains ( $scientificNotation , $result );
2013-05-03 02:13:09 +00:00
}
2013-09-09 23:43:15 +00:00
/**
* Test insertMulti with id position .
*
* @ return void
*/
public function testInsertMultiId () {
$this -> loadFixtures ( 'Article' );
$Article = ClassRegistry :: init ( 'Article' );
$db = $Article -> getDatasource ();
$datetime = date ( 'Y-m-d H:i:s' );
$data = array (
array (
'user_id' => 1 ,
'title' => 'test' ,
'body' => 'test' ,
'published' => 'N' ,
'created' => $datetime ,
'updated' => $datetime ,
'id' => 100 ,
),
array (
'user_id' => 1 ,
'title' => 'test 101' ,
'body' => 'test 101' ,
'published' => 'N' ,
'created' => $datetime ,
'updated' => $datetime ,
'id' => 101 ,
)
);
$result = $db -> insertMulti ( 'articles' , array_keys ( $data [ 0 ]), $data );
$this -> assertTrue ( $result , 'Data was saved' );
$data = array (
array (
'id' => 102 ,
'user_id' => 1 ,
'title' => 'test' ,
'body' => 'test' ,
'published' => 'N' ,
'created' => $datetime ,
'updated' => $datetime ,
),
array (
'id' => 103 ,
'user_id' => 1 ,
'title' => 'test 101' ,
'body' => 'test 101' ,
'published' => 'N' ,
'created' => $datetime ,
'updated' => $datetime ,
)
);
$result = $db -> insertMulti ( 'articles' , array_keys ( $data [ 0 ]), $data );
$this -> assertTrue ( $result , 'Data was saved' );
2013-09-10 00:24:43 +00:00
}
2014-07-12 02:56:36 +00:00
/**
* Test defaultConditions ()
*
2014-07-13 16:21:09 +00:00
* @ return void
2014-07-12 02:56:36 +00:00
*/
public function testDefaultConditions () {
$this -> loadFixtures ( 'Article' );
$Article = ClassRegistry :: init ( 'Article' );
$db = $Article -> getDataSource ();
// Creates a default set of conditions from the model if $conditions is null/empty.
$Article -> id = 1 ;
$result = $db -> defaultConditions ( $Article , null );
$this -> assertEquals ( array ( 'Article.id' => 1 ), $result );
// $useAlias == false
$Article -> id = 1 ;
$result = $db -> defaultConditions ( $Article , null , false );
$this -> assertEquals ( array ( $db -> fullTableName ( $Article , false ) . '.id' => 1 ), $result );
// If conditions are supplied then they will be returned.
$Article -> id = 1 ;
$result = $db -> defaultConditions ( $Article , array ( 'Article.title' => 'First article' ));
$this -> assertEquals ( array ( 'Article.title' => 'First article' ), $result );
// If a model doesn't exist and no conditions were provided either null or false will be returned based on what was input.
$Article -> id = 1000000 ;
$result = $db -> defaultConditions ( $Article , null );
$this -> assertNull ( $result );
$Article -> id = 1000000 ;
$result = $db -> defaultConditions ( $Article , false );
$this -> assertFalse ( $result );
// Safe update mode
$Article -> id = 1000000 ;
$Article -> __safeUpdateMode = true ;
$result = $db -> defaultConditions ( $Article , null );
$this -> assertFalse ( $result );
}
2014-08-05 21:49:04 +00:00
/**
2014-08-10 15:08:33 +00:00
* Test that count how many times afterFind is called
2014-08-05 21:49:04 +00:00
*
* @ return void
*/
public function testCountAfterFindCalls () {
$this -> loadFixtures ( 'Article' , 'User' , 'Comment' , 'Attachment' , 'Tag' , 'ArticlesTag' );
// Use alias to make testing "primary = true" easy
$Primary = $this -> getMock ( 'Comment' , array ( 'afterFind' ), array ( array ( 'alias' => 'Primary' )), '' , true );
$Article = $this -> getMock ( 'Article' , array ( 'afterFind' ), array (), '' , true );
$User = $this -> getMock ( 'User' , array ( 'afterFind' ), array (), '' , true );
$Comment = $this -> getMock ( 'Comment' , array ( 'afterFind' ), array (), '' , true );
$Tag = $this -> getMock ( 'Tag' , array ( 'afterFind' ), array (), '' , true );
$Attachment = $this -> getMock ( 'Attachment' , array ( 'afterFind' ), array (), '' , true );
$Primary -> Article = $Article ;
$Primary -> Article -> User = $User ;
$Primary -> Article -> Tag = $Tag ;
$Primary -> Article -> Comment = $Comment ;
$Primary -> Attachment = $Attachment ;
$Primary -> Attachment -> Comment = $Comment ;
$Primary -> User = $User ;
// primary = true
$Primary -> expects ( $this -> once ())
-> method ( 'afterFind' ) -> with ( $this -> anything (), $this -> isTrue ()) -> will ( $this -> returnArgument ( 0 ));
// primary = false
$Article -> expects ( $this -> once ()) // Primary belongs to 1 Article
-> method ( 'afterFind' ) -> with ( $this -> anything (), $this -> isFalse ()) -> will ( $this -> returnArgument ( 0 ));
$User -> expects ( $this -> exactly ( 2 )) // Article belongs to 1 User and Primary belongs to 1 User
-> method ( 'afterFind' ) -> with ( $this -> anything (), $this -> isFalse ()) -> will ( $this -> returnArgument ( 0 ));
$Tag -> expects ( $this -> exactly ( 2 )) // Article has 2 Tags
-> method ( 'afterFind' ) -> with ( $this -> anything (), $this -> isFalse ()) -> will ( $this -> returnArgument ( 0 ));
$Comment -> expects ( $this -> exactly ( 3 )) // Article has 2 Comments and Attachment belongs to 1 Comment
-> method ( 'afterFind' ) -> with ( $this -> anything (), $this -> isFalse ()) -> will ( $this -> returnArgument ( 0 ));
$Attachment -> expects ( $this -> once ()) // Primary has 1 Attachment
-> method ( 'afterFind' ) -> with ( $this -> anything (), $this -> isFalse ()) -> will ( $this -> returnArgument ( 0 ));
$result = $Primary -> find ( 'first' , array ( 'conditions' => array ( 'Primary.id' => 5 ), 'recursive' => 2 ));
$this -> assertCount ( 2 , $result [ 'Article' ][ 'Tag' ]);
$this -> assertCount ( 2 , $result [ 'Article' ][ 'Comment' ]);
2014-08-10 15:08:33 +00:00
// hasMany special case
// Both User and Article has many Comments
$User = $this -> getMock ( 'User' , array ( 'afterFind' ), array (), '' , true );
$Article = $this -> getMock ( 'Article' , array ( 'afterFind' ), array (), '' , true );
$Comment = $this -> getMock ( 'Comment' , array ( 'afterFind' ), array (), '' , true );
$User -> bindModel ( array ( 'hasMany' => array ( 'Comment' , 'Article' )));
$Article -> unbindModel ( array ( 'belongsTo' => array ( 'User' ), 'hasAndBelongsToMany' => array ( 'Tag' )));
$Comment -> unbindModel ( array ( 'belongsTo' => array ( 'User' , 'Article' ), 'hasOne' => 'Attachment' ));
$User -> Comment = $Comment ;
$User -> Article = $Article ;
$User -> Article -> Comment = $Comment ;
// primary = true
$User -> expects ( $this -> once ())
-> method ( 'afterFind' ) -> with ( $this -> anything (), $this -> isTrue ()) -> will ( $this -> returnArgument ( 0 ));
$Article -> expects ( $this -> exactly ( 2 )) // User has 2 Articles
-> method ( 'afterFind' ) -> with ( $this -> anything (), $this -> isFalse ()) -> will ( $this -> returnArgument ( 0 ));
$Comment -> expects ( $this -> exactly ( 7 )) // User1 has 3 Comments, Article[id=1] has 4 Comments and Article[id=3] has 0 Comments
-> method ( 'afterFind' ) -> with ( $this -> anything (), $this -> isFalse ()) -> will ( $this -> returnArgument ( 0 ));
$result = $User -> find ( 'first' , array ( 'conditions' => array ( 'User.id' => 1 ), 'recursive' => 2 ));
$this -> assertCount ( 3 , $result [ 'Comment' ]);
$this -> assertCount ( 2 , $result [ 'Article' ]);
$this -> assertCount ( 4 , $result [ 'Article' ][ 0 ][ 'Comment' ]);
$this -> assertCount ( 0 , $result [ 'Article' ][ 1 ][ 'Comment' ]);
2014-08-05 21:49:04 +00:00
}
2014-08-10 15:21:51 +00:00
/**
* Test format of $results in afterFind
*
* @ return void
*/
public function testUseConsistentAfterFind () {
$this -> loadFixtures ( 'Author' , 'Post' );
$expected = array (
'Author' => array (
'id' => '1' ,
'user' => 'mariano' ,
'password' => '5f4dcc3b5aa765d61d8327deb882cf99' ,
'created' => '2007-03-17 01:16:23' ,
'updated' => '2007-03-17 01:18:31' ,
'test' => 'working' ,
),
'Post' => array (
array (
'id' => '1' ,
'author_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' ,
),
array (
'id' => '3' ,
'author_id' => '1' ,
'title' => 'Third Post' ,
'body' => 'Third Post Body' ,
'published' => 'Y' ,
'created' => '2007-03-18 10:43:23' ,
'updated' => '2007-03-18 10:45:31' ,
),
),
);
$Author = new Author ();
$Post = $this -> getMock ( 'Post' , array ( 'afterFind' ), array (), '' , true );
$Post -> expects ( $this -> at ( 0 )) -> method ( 'afterFind' ) -> with ( array ( array ( 'Post' => $expected [ 'Post' ][ 0 ])), $this -> isFalse ()) -> will ( $this -> returnArgument ( 0 ));
$Post -> expects ( $this -> at ( 1 )) -> method ( 'afterFind' ) -> with ( array ( array ( 'Post' => $expected [ 'Post' ][ 1 ])), $this -> isFalse ()) -> will ( $this -> returnArgument ( 0 ));
$Author -> bindModel ( array ( 'hasMany' => array ( 'Post' => array ( 'limit' => 2 , 'order' => 'Post.id' ))));
$Author -> Post = $Post ;
$result = $Author -> find ( 'first' , array ( 'conditions' => array ( 'Author.id' => 1 ), 'recursive' => 1 ));
$this -> assertEquals ( $expected , $result );
// Backward compatiblity
$Author = new Author ();
$Post = $this -> getMock ( 'Post' , array ( 'afterFind' ), array (), '' , true );
$Post -> expects ( $this -> once ()) -> method ( 'afterFind' ) -> with ( $expected [ 'Post' ], $this -> isFalse ()) -> will ( $this -> returnArgument ( 0 ));
$Post -> useConsistentAfterFind = false ;
$Author -> bindModel ( array ( 'hasMany' => array ( 'Post' => array ( 'limit' => 2 , 'order' => 'Post.id' ))));
$Author -> Post = $Post ;
$result = $Author -> find ( 'first' , array ( 'conditions' => array ( 'Author.id' => 1 ), 'recursive' => 1 ));
$this -> assertEquals ( $expected , $result );
2014-08-05 21:49:04 +00:00
}
2014-08-27 00:32:00 +00:00
2014-08-27 06:09:58 +00:00
/**
* Test that afterFind is called correctly for 'joins'
*
* @ return void
*/
public function testJoinsAfterFind () {
$this -> loadFixtures ( 'Article' , 'User' );
$User = new User ();
$User -> bindModel ( array ( 'hasOne' => array ( 'Article' )));
$Article = $this -> getMock ( 'Article' , array ( 'afterFind' ), array (), '' , true );
$Article -> expects ( $this -> once ())
-> method ( 'afterFind' )
-> with (
array (
0 => 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'
)
)
),
$this -> isFalse ()
)
-> will ( $this -> returnArgument ( 0 ));
$User -> Article = $Article ;
$User -> find ( 'first' , array (
2014-08-27 07:06:28 +00:00
'fields' => array (
'Article.id' ,
'Article.user_id' ,
'Article.title' ,
'Article.body' ,
'Article.published' ,
'Article.created' ,
'Article.updated'
),
2014-08-27 06:09:58 +00:00
'conditions' => array ( 'User.id' => 1 ),
'recursive' => - 1 ,
'joins' => array (
array (
'table' => 'articles' ,
'alias' => 'Article' ,
'type' => 'LEFT' ,
'conditions' => array (
'Article.user_id = User.id'
),
)
),
'order' => array ( 'Article.id' )
));
}
2014-08-27 00:32:00 +00:00
/**
* Test that afterFind is called correctly for 'hasOne' association .
*
* @ return void
*/
public function testHasOneAfterFind () {
$this -> loadFixtures ( 'Article' , 'User' , 'Comment' );
$User = new User ();
$User -> bindModel ( array ( 'hasOne' => array ( 'Article' )));
$Article = $this -> getMock ( 'Article' , array ( 'afterFind' ), array (), '' , true );
$Article -> unbindModel ( array (
'belongsTo' => array ( 'User' ),
'hasMany' => array ( 'Comment' ),
'hasAndBelongsToMany' => array ( 'Tag' )
));
$Article -> bindModel ( array (
'hasOne' => array ( 'Comment' ),
));
$Article -> expects ( $this -> once ())
-> method ( 'afterFind' )
-> with (
$this -> equalTo (
array (
0 => 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 (
'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' ,
)
)
)
)
),
$this -> isFalse ()
)
-> will ( $this -> returnArgument ( 0 ));
$User -> Article = $Article ;
$User -> find ( 'first' , array ( 'conditions' => array ( 'User.id' => 1 ), 'recursive' => 2 ));
}
2016-04-18 15:01:06 +00:00
/**
* Test that flushQueryCache works as expected
*
* @ return void
*/
public function testFlushQueryCache () {
$this -> db -> flushQueryCache ();
$this -> db -> query ( 'SELECT 1' );
$this -> db -> query ( 'SELECT 1' );
$this -> db -> query ( 'SELECT 2' );
$this -> assertAttributeCount ( 2 , '_queryCache' , $this -> db );
$this -> db -> flushQueryCache ();
$this -> assertAttributeCount ( 0 , '_queryCache' , $this -> db );
}
2016-10-01 02:25:25 +00:00
/**
* Test length parsing .
*
* @ return void
*/
public function testLength () {
$result = $this -> db -> length ( 'varchar(255)' );
$this -> assertEquals ( 255 , $result );
$result = $this -> db -> length ( 'integer(11)' );
$this -> assertEquals ( 11 , $result );
$result = $this -> db -> length ( 'integer unsigned' );
$this -> assertNull ( $result );
$result = $this -> db -> length ( 'integer(11) unsigned' );
$this -> assertEquals ( 11 , $result );
$result = $this -> db -> length ( 'integer(11) zerofill' );
$this -> assertEquals ( 11 , $result );
$result = $this -> db -> length ( 'decimal(20,3)' );
$this -> assertEquals ( '20,3' , $result );
$result = $this -> db -> length ( 'enum("one", "longer")' );
$this -> assertEquals ( 6 , $result );
$result = $this -> db -> length ( " enum('One Value','ANOTHER ... VALUE ...') " );
$this -> assertEquals ( 21 , $result );
}
2008-08-07 15:36:26 +00:00
}