2008-05-30 11:40:08 +00:00
< ? php
/**
2011-05-23 03:19:13 +00:00
* SqlserverTest file
2008-05-30 11:40:08 +00:00
*
2009-11-06 06:46:59 +00:00
* CakePHP ( tm ) : Rapid Development Framework ( http :// cakephp . org )
2013-02-08 11:59:49 +00:00
* Copyright ( c ) Cake Software Foundation , Inc . ( http :// cakefoundation . org )
2008-05-30 11:40:08 +00:00
*
* Licensed under The MIT License
2013-02-08 12:22:51 +00:00
* For full copyright and license information , please see the LICENSE . txt
2008-05-30 11:40:08 +00:00
* Redistributions of files must retain the above copyright notice .
*
2013-02-08 11:59:49 +00:00
* @ copyright Copyright ( c ) Cake Software Foundation , Inc . ( http :// cakefoundation . org )
2009-11-06 06:00:11 +00:00
* @ link http :// cakephp . org CakePHP ( tm ) Project
2011-07-26 06:16:14 +00:00
* @ package Cake . Test . Case . Model . Datasource . Database
2008-10-30 17:30:26 +00:00
* @ since CakePHP ( tm ) v 1.2 . 0
2013-05-30 22:11:14 +00:00
* @ license http :// www . opensource . org / licenses / mit - license . php MIT License
2008-05-30 11:40:08 +00:00
*/
2010-11-21 20:13:33 +00:00
2011-04-26 13:17:51 +00:00
App :: uses ( 'Model' , 'Model' );
2011-06-22 18:08:14 +00:00
App :: uses ( 'AppModel' , 'Model' );
2011-05-23 03:19:13 +00:00
App :: uses ( 'Sqlserver' , 'Model/Datasource/Database' );
2009-07-24 19:18:37 +00:00
2011-06-22 18:08:14 +00:00
require_once dirname ( dirname ( dirname ( __FILE__ ))) . DS . 'models.php' ;
2008-06-02 19:22:55 +00:00
/**
2011-05-23 03:19:13 +00:00
* SqlserverTestDb class
2008-11-08 02:58:37 +00:00
*
2011-07-26 06:16:14 +00:00
* @ package Cake . Test . Case . Model . Datasource . Database
2008-06-02 19:22:55 +00:00
*/
2011-05-23 03:19:13 +00:00
class SqlserverTestDb extends Sqlserver {
2009-07-24 19:18:37 +00:00
2008-06-02 19:22:55 +00:00
/**
* simulated property
2008-11-08 02:58:37 +00:00
*
2008-06-02 19:22:55 +00:00
* @ var array
*/
2010-04-04 07:14:00 +00:00
public $simulated = array ();
2009-07-24 19:18:37 +00:00
2008-11-14 02:00:02 +00:00
/**
2011-05-18 18:12:36 +00:00
* execute results stack
2009-03-17 21:10:28 +00:00
*
2008-11-14 02:00:02 +00:00
* @ var array
*/
2011-05-18 18:12:36 +00:00
public $executeResultsStack = array ();
2009-07-24 19:18:37 +00:00
2008-06-02 19:22:55 +00:00
/**
* execute method
2008-11-08 02:58:37 +00:00
*
* @ param mixed $sql
2011-11-13 01:43:55 +00:00
* @ param mixed $params
* @ param mixed $prepareOptions
2011-05-22 02:18:57 +00:00
* @ return mixed
2008-06-02 19:22:55 +00:00
*/
2011-11-13 01:43:55 +00:00
protected function _execute ( $sql , $params = array (), $prepareOptions = array ()) {
2011-05-22 02:10:05 +00:00
$this -> simulated [] = $sql ;
return empty ( $this -> executeResultsStack ) ? null : array_pop ( $this -> executeResultsStack );
2008-09-01 19:00:00 +00:00
}
2009-07-24 19:18:37 +00:00
2009-01-16 19:08:44 +00:00
/**
* fetchAll method
2009-03-17 21:10:28 +00:00
*
* @ param mixed $sql
2009-01-16 19:08:44 +00:00
* @ return void
*/
2012-02-26 01:06:48 +00:00
protected function _matchRecords ( Model $model , $conditions = null ) {
2009-01-16 19:08:44 +00:00
return $this -> conditions ( array ( 'id' => array ( 1 , 2 )));
}
2009-07-24 19:18:37 +00:00
2008-06-02 19:22:55 +00:00
/**
* getLastQuery method
2008-11-08 02:58:37 +00:00
*
2011-05-22 02:18:57 +00:00
* @ return string
2008-06-02 19:22:55 +00:00
*/
2011-05-22 02:18:57 +00:00
public function getLastQuery () {
2008-09-01 19:00:00 +00:00
return $this -> simulated [ count ( $this -> simulated ) - 1 ];
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2009-04-29 16:26:03 +00:00
/**
* getPrimaryKey method
*
2011-05-18 18:59:17 +00:00
* @ param mixed $model
2011-05-22 02:18:57 +00:00
* @ return string
2009-04-29 16:26:03 +00:00
*/
2011-05-22 02:18:57 +00:00
public function getPrimaryKey ( $model ) {
2011-05-18 18:59:17 +00:00
return parent :: _getPrimaryKey ( $model );
2009-04-29 16:26:03 +00:00
}
2011-05-18 18:59:17 +00:00
2009-08-02 06:47:28 +00:00
/**
* clearFieldMappings method
*
* @ return void
*/
2011-05-22 02:18:57 +00:00
public function clearFieldMappings () {
2011-04-29 02:20:11 +00:00
$this -> _fieldMappings = array ();
2009-08-02 06:47:28 +00:00
}
2011-10-28 05:01:17 +00:00
2011-05-18 18:59:17 +00:00
/**
* describe method
*
2016-04-08 13:12:48 +00:00
* @ param Model $model
2011-05-18 18:59:17 +00:00
* @ return void
*/
2011-05-22 02:18:57 +00:00
public function describe ( $model ) {
2011-05-18 18:59:17 +00:00
return empty ( $this -> describe ) ? parent :: describe ( $model ) : $this -> describe ;
}
2012-03-18 17:08:27 +00:00
2008-09-01 19:00:00 +00:00
}
2009-07-24 19:18:37 +00:00
2008-09-01 19:00:00 +00:00
/**
2011-05-23 03:19:13 +00:00
* SqlserverTestModel class
2008-09-01 19:00:00 +00:00
*
2011-07-26 06:16:14 +00:00
* @ package Cake . Test . Case . Model . Datasource . Database
2008-09-01 19:00:00 +00:00
*/
2012-01-07 06:39:47 +00:00
class SqlserverTestModel extends CakeTestModel {
2009-07-24 19:18:37 +00:00
2008-06-02 19:22:55 +00:00
/**
* useTable property
2008-11-08 02:58:37 +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 $useTable = false ;
2009-07-24 19:18:37 +00:00
2009-04-29 16:26:03 +00:00
/**
* _schema property
*
* @ var array
*/
2010-04-04 06:36:12 +00:00
protected $_schema = array (
2012-03-18 17:08:27 +00:00
'id' => array ( 'type' => 'integer' , 'null' => '' , 'default' => '' , 'length' => '8' , 'key' => 'primary' ),
'client_id' => array ( 'type' => 'integer' , 'null' => '' , 'default' => '0' , 'length' => '11' ),
'name' => array ( 'type' => 'string' , 'null' => '' , 'default' => '' , 'length' => '255' ),
'login' => array ( 'type' => 'string' , 'null' => '' , 'default' => '' , 'length' => '255' ),
'passwd' => array ( 'type' => 'string' , 'null' => '1' , 'default' => '' , 'length' => '255' ),
'addr_1' => array ( 'type' => 'string' , 'null' => '1' , 'default' => '' , 'length' => '255' ),
'addr_2' => array ( 'type' => 'string' , 'null' => '1' , 'default' => '' , 'length' => '25' ),
'zip_code' => array ( 'type' => 'string' , 'null' => '1' , 'default' => '' , 'length' => '155' ),
'city' => array ( 'type' => 'string' , 'null' => '1' , 'default' => '' , 'length' => '155' ),
'country' => array ( 'type' => 'string' , 'null' => '1' , 'default' => '' , 'length' => '155' ),
'phone' => array ( 'type' => 'string' , 'null' => '1' , 'default' => '' , 'length' => '155' ),
'fax' => array ( 'type' => 'string' , 'null' => '1' , 'default' => '' , 'length' => '155' ),
'url' => array ( 'type' => 'string' , 'null' => '1' , 'default' => '' , 'length' => '255' ),
'email' => array ( 'type' => 'string' , 'null' => '1' , 'default' => '' , 'length' => '155' ),
'comments' => array ( 'type' => 'text' , 'null' => '1' , 'default' => '' , 'length' => '' ),
'last_login' => array ( 'type' => 'datetime' , 'null' => '1' , 'default' => '' , 'length' => '' ),
'created' => array ( 'type' => 'date' , 'null' => '1' , 'default' => '' , 'length' => '' ),
'updated' => array ( 'type' => 'datetime' , 'null' => '1' , 'default' => '' , 'length' => null )
2009-04-29 16:26:03 +00:00
);
2009-07-24 19:18:37 +00:00
2009-08-02 06:47:28 +00:00
/**
* belongsTo property
*
* @ var array
*/
2010-04-04 07:14:00 +00:00
public $belongsTo = array (
2011-05-23 03:19:13 +00:00
'SqlserverClientTestModel' => array (
2009-08-02 06:47:28 +00:00
'foreignKey' => 'client_id'
)
);
2011-12-06 20:52:48 +00:00
2008-06-02 19:22:55 +00:00
/**
* find method
2008-11-08 02:58:37 +00:00
*
* @ param mixed $conditions
* @ param mixed $fields
* @ param mixed $order
* @ param mixed $recursive
2008-06-02 19:22:55 +00:00
* @ return void
*/
2011-05-22 02:18:57 +00:00
public function find ( $conditions = null , $fields = null , $order = null , $recursive = null ) {
2008-09-01 19:00:00 +00:00
return $conditions ;
}
2012-03-18 17:08:27 +00:00
2008-09-01 19:00:00 +00:00
}
2009-07-24 19:18:37 +00:00
2009-08-02 06:47:28 +00:00
/**
2011-05-23 03:19:13 +00:00
* SqlserverClientTestModel class
2009-08-02 06:47:28 +00:00
*
2011-07-26 06:16:14 +00:00
* @ package Cake . Test . Case . Model . Datasource . Database
2009-08-02 06:47:28 +00:00
*/
2012-01-07 06:39:47 +00:00
class SqlserverClientTestModel extends CakeTestModel {
2012-03-18 17:08:27 +00:00
2009-08-02 06:47:28 +00:00
/**
* useTable property
*
2014-07-03 13:36:42 +00:00
* @ var bool
2009-08-02 06:47:28 +00:00
*/
2010-04-04 07:14:00 +00:00
public $useTable = false ;
2011-05-22 02:18:57 +00:00
2009-08-02 06:47:28 +00:00
/**
* _schema property
*
* @ var array
*/
2010-04-04 06:36:12 +00:00
protected $_schema = array (
2009-08-02 06:47:28 +00:00
'id' => array ( 'type' => 'integer' , 'null' => '' , 'default' => '' , 'length' => '8' , 'key' => 'primary' ),
'name' => array ( 'type' => 'string' , 'null' => '' , 'default' => '' , 'length' => '255' ),
'email' => array ( 'type' => 'string' , 'null' => '1' , 'default' => '' , 'length' => '155' ),
'created' => array ( 'type' => 'datetime' , 'null' => '1' , 'default' => '' , 'length' => '' ),
'updated' => array ( 'type' => 'datetime' , 'null' => '1' , 'default' => '' , 'length' => null )
);
}
2011-05-18 18:12:36 +00:00
/**
2011-05-23 03:19:13 +00:00
* SqlserverTestResultIterator class
2011-05-18 18:12:36 +00:00
*
2011-07-26 06:16:14 +00:00
* @ package Cake . Test . Case . Model . Datasource . Database
2011-05-18 18:12:36 +00:00
*/
2011-05-23 03:19:13 +00:00
class SqlserverTestResultIterator extends ArrayIterator {
2012-03-18 17:08:27 +00:00
2011-05-18 18:12:36 +00:00
/**
* closeCursor method
*
2011-05-22 02:18:57 +00:00
* @ return void
2011-05-18 18:12:36 +00:00
*/
2012-03-18 17:08:27 +00:00
public function closeCursor () {
}
2012-01-07 06:39:47 +00:00
/**
* fetch method
*
* @ return void
*/
public function fetch () {
if ( ! $this -> valid ()) {
return null ;
}
$current = $this -> current ();
$this -> next ();
return $current ;
}
2012-03-18 17:08:27 +00:00
2011-05-18 18:12:36 +00:00
}
2008-05-30 11:40:08 +00:00
/**
2011-05-23 03:19:13 +00:00
* SqlserverTest class
2008-05-30 11:40:08 +00:00
*
2011-07-26 06:16:14 +00:00
* @ package Cake . Test . Case . Model . Datasource . Database
2008-05-30 11:40:08 +00:00
*/
2011-05-23 03:19:13 +00:00
class SqlserverTest extends CakeTestCase {
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* The Dbo instance to be tested
*
2009-03-17 21:10:28 +00:00
* @ var DboSource
2008-05-30 11:40:08 +00:00
*/
2010-04-04 07:14:00 +00:00
public $db = null ;
2009-07-24 19:18:37 +00:00
2009-08-02 06:47:28 +00:00
/**
* autoFixtures property
*
2014-07-03 13:36:42 +00:00
* @ var bool
2009-08-02 06:47:28 +00:00
*/
2010-04-04 07:14:00 +00:00
public $autoFixtures = false ;
2011-05-22 02:18:57 +00:00
2009-08-02 06:47:28 +00:00
/**
* fixtures property
*
* @ var array
*/
2011-06-23 00:01:36 +00:00
public $fixtures = array ( 'core.user' , 'core.category' , 'core.author' , 'core.post' );
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Sets up a Dbo class instance for testing
*
2014-04-02 01:02:37 +00:00
* @ return void
2008-05-30 11:40:08 +00:00
*/
2010-04-05 03:19:38 +00:00
public function setUp () {
2013-07-28 23:22:52 +00:00
parent :: setUp ();
2011-04-29 13:14:09 +00:00
$this -> Dbo = ConnectionManager :: getDataSource ( 'test' );
2011-05-23 03:19:13 +00:00
if ( ! ( $this -> Dbo instanceof Sqlserver )) {
2011-04-29 13:14:09 +00:00
$this -> markTestSkipped ( 'Please configure the test datasource to use SQL Server.' );
}
2011-05-23 03:19:13 +00:00
$this -> db = new SqlserverTestDb ( $this -> Dbo -> config );
$this -> model = new SqlserverTestModel ();
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2009-03-18 17:55:58 +00:00
/**
* tearDown method
*
* @ return void
*/
2011-05-22 02:18:57 +00:00
public function tearDown () {
2013-07-28 23:22:52 +00:00
parent :: tearDown ();
2011-05-22 02:18:57 +00:00
unset ( $this -> Dbo );
2009-03-18 17:55:58 +00:00
unset ( $this -> model );
}
2009-07-24 19:18:37 +00:00
2008-06-02 19:22:55 +00:00
/**
* testQuoting method
2008-11-08 02:58:37 +00:00
*
2008-06-02 19:22:55 +00:00
* @ return void
*/
2011-05-22 02:18:57 +00:00
public function testQuoting () {
2012-01-07 06:39:47 +00:00
$expected = " 1.2 " ;
2009-08-02 06:47:28 +00:00
$result = $this -> db -> value ( 1.2 , 'float' );
2011-11-16 00:07:56 +00:00
$this -> assertSame ( $expected , $result );
2009-08-02 06:47:28 +00:00
$expected = " '1,2' " ;
$result = $this -> db -> value ( '1,2' , 'float' );
2011-11-16 00:07:56 +00:00
$this -> assertSame ( $expected , $result );
2009-09-06 17:57:24 +00:00
$expected = 'NULL' ;
$result = $this -> db -> value ( '' , 'integer' );
2011-11-16 00:07:56 +00:00
$this -> assertSame ( $expected , $result );
2009-09-06 17:57:24 +00:00
$expected = 'NULL' ;
$result = $this -> db -> value ( '' , 'float' );
2011-11-16 00:07:56 +00:00
$this -> assertSame ( $expected , $result );
2009-09-06 17:57:24 +00:00
2011-06-21 22:37:05 +00:00
$expected = " '' " ;
2009-09-06 17:57:24 +00:00
$result = $this -> db -> value ( '' , 'binary' );
2011-11-16 00:07:56 +00:00
$this -> assertSame ( $expected , $result );
2013-09-09 16:20:54 +00:00
2013-09-09 14:14:09 +00:00
$expected = 'NULL' ;
$result = $this -> db -> value ( null , 'string' );
$this -> assertSame ( $expected , $result );
2009-08-02 06:47:28 +00:00
}
2011-12-06 20:52:48 +00:00
2009-08-02 06:47:28 +00:00
/**
* testFields method
*
* @ return void
*/
2011-05-22 02:18:57 +00:00
public function testFields () {
2009-08-02 06:47:28 +00:00
$fields = array (
2011-06-21 23:28:33 +00:00
'[SqlserverTestModel].[id] AS [SqlserverTestModel__id]' ,
'[SqlserverTestModel].[client_id] AS [SqlserverTestModel__client_id]' ,
'[SqlserverTestModel].[name] AS [SqlserverTestModel__name]' ,
'[SqlserverTestModel].[login] AS [SqlserverTestModel__login]' ,
'[SqlserverTestModel].[passwd] AS [SqlserverTestModel__passwd]' ,
'[SqlserverTestModel].[addr_1] AS [SqlserverTestModel__addr_1]' ,
'[SqlserverTestModel].[addr_2] AS [SqlserverTestModel__addr_2]' ,
'[SqlserverTestModel].[zip_code] AS [SqlserverTestModel__zip_code]' ,
'[SqlserverTestModel].[city] AS [SqlserverTestModel__city]' ,
'[SqlserverTestModel].[country] AS [SqlserverTestModel__country]' ,
'[SqlserverTestModel].[phone] AS [SqlserverTestModel__phone]' ,
'[SqlserverTestModel].[fax] AS [SqlserverTestModel__fax]' ,
'[SqlserverTestModel].[url] AS [SqlserverTestModel__url]' ,
'[SqlserverTestModel].[email] AS [SqlserverTestModel__email]' ,
'[SqlserverTestModel].[comments] AS [SqlserverTestModel__comments]' ,
'CONVERT(VARCHAR(20), [SqlserverTestModel].[last_login], 20) AS [SqlserverTestModel__last_login]' ,
'[SqlserverTestModel].[created] AS [SqlserverTestModel__created]' ,
'CONVERT(VARCHAR(20), [SqlserverTestModel].[updated], 20) AS [SqlserverTestModel__updated]'
2008-05-30 11:40:08 +00:00
);
2009-08-02 06:47:28 +00:00
$result = $this -> db -> fields ( $this -> model );
$expected = $fields ;
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2008-05-30 11:40:08 +00:00
2009-08-02 06:47:28 +00:00
$this -> db -> clearFieldMappings ();
2011-05-23 03:19:13 +00:00
$result = $this -> db -> fields ( $this -> model , null , 'SqlserverTestModel.*' );
2009-08-02 06:47:28 +00:00
$expected = $fields ;
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2008-05-30 11:40:08 +00:00
2009-08-02 06:47:28 +00:00
$this -> db -> clearFieldMappings ();
$result = $this -> db -> fields ( $this -> model , null , array ( '*' , 'AnotherModel.id' , 'AnotherModel.name' ));
$expected = array_merge ( $fields , array (
2011-06-21 23:28:33 +00:00
'[AnotherModel].[id] AS [AnotherModel__id]' ,
'[AnotherModel].[name] AS [AnotherModel__name]' ));
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2009-08-02 06:47:28 +00:00
$this -> db -> clearFieldMappings ();
2011-05-23 03:19:13 +00:00
$result = $this -> db -> fields ( $this -> model , null , array ( '*' , 'SqlserverClientTestModel.*' ));
2009-08-02 06:47:28 +00:00
$expected = array_merge ( $fields , array (
2011-06-21 23:28:33 +00:00
'[SqlserverClientTestModel].[id] AS [SqlserverClientTestModel__id]' ,
'[SqlserverClientTestModel].[name] AS [SqlserverClientTestModel__name]' ,
'[SqlserverClientTestModel].[email] AS [SqlserverClientTestModel__email]' ,
'CONVERT(VARCHAR(20), [SqlserverClientTestModel].[created], 20) AS [SqlserverClientTestModel__created]' ,
'CONVERT(VARCHAR(20), [SqlserverClientTestModel].[updated], 20) AS [SqlserverClientTestModel__updated]' ));
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
/**
* testDistinctFields method
2008-11-08 02:58:37 +00:00
*
2008-06-05 15:20:45 +00:00
* @ return void
*/
2011-05-22 02:18:57 +00:00
public function testDistinctFields () {
2008-05-30 11:40:08 +00:00
$result = $this -> db -> fields ( $this -> model , null , array ( 'DISTINCT Car.country_code' ));
2011-06-21 23:28:33 +00:00
$expected = array ( 'DISTINCT [Car].[country_code] AS [Car__country_code]' );
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2008-05-30 11:40:08 +00:00
$result = $this -> db -> fields ( $this -> model , null , 'DISTINCT Car.country_code' );
2011-06-21 23:28:33 +00:00
$expected = array ( 'DISTINCT [Car].[country_code] AS [Car__country_code]' );
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
/**
* testDistinctWithLimit method
2008-11-08 02:58:37 +00:00
*
2008-06-05 15:20:45 +00:00
* @ return void
*/
2011-05-22 02:18:57 +00:00
public function testDistinctWithLimit () {
2008-05-30 11:40:08 +00:00
$this -> db -> read ( $this -> model , array (
2011-05-23 03:19:13 +00:00
'fields' => array ( 'DISTINCT SqlserverTestModel.city' , 'SqlserverTestModel.country' ),
2008-05-30 11:40:08 +00:00
'limit' => 5
));
$result = $this -> db -> getLastQuery ();
2011-11-16 00:07:56 +00:00
$this -> assertRegExp ( '/^SELECT DISTINCT TOP 5/' , $result );
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-11-14 02:00:02 +00:00
/**
* testDescribe method
2009-03-17 21:10:28 +00:00
*
2008-11-14 02:00:02 +00:00
* @ return void
*/
2011-05-22 02:18:57 +00:00
public function testDescribe () {
2011-05-23 03:19:13 +00:00
$SqlserverTableDescription = new SqlserverTestResultIterator ( array (
2012-03-18 17:08:27 +00:00
( object ) array (
2011-05-18 18:12:36 +00:00
'Default' => '((0))' ,
'Field' => 'count' ,
'Key' => 0 ,
'Length' => '4' ,
'Null' => 'NO' ,
'Type' => 'integer'
2011-06-22 15:59:51 +00:00
),
2012-03-18 17:08:27 +00:00
( object ) array (
2011-06-22 15:59:51 +00:00
'Default' => '' ,
'Field' => 'body' ,
'Key' => 0 ,
2011-06-22 18:08:14 +00:00
'Length' => '-1' ,
2011-06-22 15:59:51 +00:00
'Null' => 'YES' ,
'Type' => 'nvarchar'
2011-06-22 17:24:45 +00:00
),
2012-03-18 17:08:27 +00:00
( object ) array (
2011-06-22 17:24:45 +00:00
'Default' => '' ,
'Field' => 'published' ,
'Key' => 0 ,
'Type' => 'datetime2' ,
'Length' => 8 ,
'Null' => 'YES' ,
'Size' => ''
),
2012-03-18 17:08:27 +00:00
( object ) array (
2011-06-22 18:35:02 +00:00
'Default' => '' ,
'Field' => 'id' ,
'Key' => 1 ,
'Type' => 'nchar' ,
'Length' => 72 ,
'Null' => 'NO' ,
'Size' => ''
2013-03-20 01:02:27 +00:00
),
( object ) array (
'Default' => null ,
'Field' => 'parent_id' ,
'Key' => '0' ,
'Type' => 'bigint' ,
'Length' => 8 ,
'Null' => 'YES' ,
'Size' => '0' ,
),
2014-12-29 21:47:50 +00:00
( object ) array (
'Default' => null ,
'Field' => 'description' ,
'Key' => '0' ,
'Type' => 'text' ,
'Length' => 16 ,
'Null' => 'YES' ,
'Size' => '0' ,
),
2011-05-18 18:12:36 +00:00
));
2011-05-23 03:19:13 +00:00
$this -> db -> executeResultsStack = array ( $SqlserverTableDescription );
2008-11-14 02:00:02 +00:00
$dummyModel = $this -> model ;
$result = $this -> db -> describe ( $dummyModel );
$expected = array (
'count' => array (
'type' => 'integer' ,
'null' => false ,
'default' => '0' ,
'length' => 4
2011-06-22 15:59:51 +00:00
),
'body' => array (
'type' => 'text' ,
'null' => true ,
'default' => null ,
'length' => null
2011-06-22 17:24:45 +00:00
),
'published' => array (
'type' => 'datetime' ,
'null' => true ,
'default' => '' ,
'length' => null
2011-06-22 18:35:02 +00:00
),
'id' => array (
'type' => 'string' ,
'null' => false ,
'default' => '' ,
'length' => 36 ,
'key' => 'primary'
2013-03-20 01:02:27 +00:00
),
'parent_id' => array (
'type' => 'biginteger' ,
'null' => true ,
'default' => null ,
'length' => 8 ,
),
2014-12-29 21:47:50 +00:00
'description' => array (
'type' => 'text' ,
'null' => true ,
'default' => null ,
'length' => null ,
)
2008-11-14 02:00:02 +00:00
);
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2013-03-20 01:02:27 +00:00
$this -> assertSame ( $expected [ 'parent_id' ], $result [ 'parent_id' ]);
2008-11-14 02:00:02 +00:00
}
2011-12-06 20:52:48 +00:00
2009-07-29 22:30:20 +00:00
/**
* testBuildColumn
*
2011-05-22 02:18:57 +00:00
* @ return void
2009-07-29 22:30:20 +00:00
*/
2010-04-05 03:19:38 +00:00
public function testBuildColumn () {
2011-05-18 18:12:36 +00:00
$column = array ( 'name' => 'id' , 'type' => 'integer' , 'null' => false , 'default' => '' , 'length' => '8' , 'key' => 'primary' );
2009-07-29 22:30:20 +00:00
$result = $this -> db -> buildColumn ( $column );
$expected = '[id] int IDENTITY (1, 1) NOT NULL' ;
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2009-07-29 22:30:20 +00:00
2011-05-18 18:12:36 +00:00
$column = array ( 'name' => 'client_id' , 'type' => 'integer' , 'null' => false , 'default' => '0' , 'length' => '11' );
2009-07-29 22:30:20 +00:00
$result = $this -> db -> buildColumn ( $column );
$expected = '[client_id] int DEFAULT 0 NOT NULL' ;
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2009-07-29 22:30:20 +00:00
2009-07-31 02:08:20 +00:00
$column = array ( 'name' => 'client_id' , 'type' => 'integer' , 'null' => true );
2009-07-29 22:30:20 +00:00
$result = $this -> db -> buildColumn ( $column );
2009-07-31 02:08:20 +00:00
$expected = '[client_id] int NULL' ;
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2009-08-02 06:47:28 +00:00
// 'name' => 'type' format for columns
$column = array ( 'type' => 'integer' , 'name' => 'client_id' );
$result = $this -> db -> buildColumn ( $column );
$expected = '[client_id] int NULL' ;
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2009-08-02 06:47:28 +00:00
2017-03-05 17:25:14 +00:00
$column = array ( 'type' => 'smallint' , 'name' => 'client_id' );
$result = $this -> db -> buildColumn ( $column );
$expected = '[client_id] smallint NULL' ;
$this -> assertEquals ( $expected , $result );
$column = array ( 'type' => 'tinyint' , 'name' => 'client_id' );
$result = $this -> db -> buildColumn ( $column );
$expected = '[client_id] tinyint NULL' ;
$this -> assertEquals ( $expected , $result );
2009-08-02 06:47:28 +00:00
$column = array ( 'type' => 'string' , 'name' => 'name' );
$result = $this -> db -> buildColumn ( $column );
2011-06-24 06:01:17 +00:00
$expected = '[name] nvarchar(255) NULL' ;
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2009-08-02 06:47:28 +00:00
2011-05-18 18:12:36 +00:00
$column = array ( 'name' => 'name' , 'type' => 'string' , 'null' => false , 'default' => '' , 'length' => '255' );
2009-08-02 06:47:28 +00:00
$result = $this -> db -> buildColumn ( $column );
2011-06-24 06:01:17 +00:00
$expected = '[name] nvarchar(255) DEFAULT \'\' NOT NULL' ;
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2009-08-02 06:47:28 +00:00
$column = array ( 'name' => 'name' , 'type' => 'string' , 'null' => false , 'length' => '255' );
$result = $this -> db -> buildColumn ( $column );
2011-06-24 06:01:17 +00:00
$expected = '[name] nvarchar(255) NOT NULL' ;
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2009-08-02 06:47:28 +00:00
$column = array ( 'name' => 'name' , 'type' => 'string' , 'null' => false , 'default' => null , 'length' => '255' );
$result = $this -> db -> buildColumn ( $column );
2011-06-24 06:01:17 +00:00
$expected = '[name] nvarchar(255) NOT NULL' ;
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2009-08-02 06:47:28 +00:00
$column = array ( 'name' => 'name' , 'type' => 'string' , 'null' => true , 'default' => null , 'length' => '255' );
$result = $this -> db -> buildColumn ( $column );
2011-06-24 06:01:17 +00:00
$expected = '[name] nvarchar(255) NULL' ;
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2009-08-02 06:47:28 +00:00
$column = array ( 'name' => 'name' , 'type' => 'string' , 'null' => true , 'default' => '' , 'length' => '255' );
$result = $this -> db -> buildColumn ( $column );
2011-06-24 06:01:17 +00:00
$expected = '[name] nvarchar(255) DEFAULT \'\'' ;
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2011-06-24 06:01:17 +00:00
$column = array ( 'name' => 'body' , 'type' => 'text' );
$result = $this -> db -> buildColumn ( $column );
$expected = '[body] nvarchar(MAX)' ;
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2012-04-02 02:10:05 +00:00
$column = array (
'name' => 'checked' ,
'type' => 'boolean' ,
'length' => 10 ,
'default' => '1'
);
$result = $this -> db -> buildColumn ( $column );
$expected = " [checked] bit DEFAULT '1' " ;
$this -> assertEquals ( $expected , $result );
2012-08-30 15:35:36 +00:00
$column = array (
'name' => 'huge' ,
'type' => 'biginteger' ,
);
$result = $this -> db -> buildColumn ( $column );
$expected = " [huge] bigint " ;
$this -> assertEquals ( $expected , $result );
2009-08-02 06:47:28 +00:00
}
2011-12-06 20:52:48 +00:00
2009-09-03 01:07:58 +00:00
/**
* testBuildIndex method
*
* @ return void
*/
2010-04-05 03:19:38 +00:00
public function testBuildIndex () {
2009-09-03 01:07:58 +00:00
$indexes = array (
'PRIMARY' => array ( 'column' => 'id' , 'unique' => 1 ),
'client_id' => array ( 'column' => 'client_id' , 'unique' => 1 )
);
$result = $this -> db -> buildIndex ( $indexes , 'items' );
$expected = array (
'PRIMARY KEY ([id])' ,
'ALTER TABLE items ADD CONSTRAINT client_id UNIQUE([client_id]);'
);
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2009-09-03 01:07:58 +00:00
$indexes = array ( 'client_id' => array ( 'column' => 'client_id' ));
$result = $this -> db -> buildIndex ( $indexes , 'items' );
2012-10-26 22:18:05 +00:00
$this -> assertSame ( array (), $result );
2009-09-03 01:07:58 +00:00
$indexes = array ( 'client_id' => array ( 'column' => array ( 'client_id' , 'period_id' ), 'unique' => 1 ));
$result = $this -> db -> buildIndex ( $indexes , 'items' );
$expected = array ( 'ALTER TABLE items ADD CONSTRAINT client_id UNIQUE([client_id], [period_id]);' );
2011-11-16 00:07:56 +00:00
$this -> assertEquals ( $expected , $result );
2009-09-03 01:07:58 +00:00
}
2011-12-06 20:52:48 +00:00
2009-03-18 17:55:58 +00:00
/**
* testUpdateAllSyntax method
*
* @ return void
*/
2010-04-05 03:19:38 +00:00
public function testUpdateAllSyntax () {
2011-05-23 03:19:13 +00:00
$fields = array ( 'SqlserverTestModel.client_id' => '[SqlserverTestModel].[client_id] + 1' );
$conditions = array ( 'SqlserverTestModel.updated <' => date ( '2009-01-01 00:00:00' ));
2009-04-28 22:20:04 +00:00
$this -> db -> update ( $this -> model , $fields , null , $conditions );
2009-01-16 19:08:44 +00:00
$result = $this -> db -> getLastQuery ();
2011-11-16 00:07:56 +00:00
$this -> assertNotRegExp ( '/SqlserverTestModel/' , $result );
$this -> assertRegExp ( '/^UPDATE \[sqlserver_test_models\]/' , $result );
$this -> assertRegExp ( '/SET \[client_id\] = \[client_id\] \+ 1/' , $result );
2009-01-16 19:08:44 +00:00
}
2009-07-24 19:18:37 +00:00
2009-04-29 16:26:03 +00:00
/**
* testGetPrimaryKey method
*
* @ return void
*/
2010-04-05 03:19:38 +00:00
public function testGetPrimaryKey () {
2009-04-29 16:26:03 +00:00
$schema = $this -> model -> schema ();
2011-10-28 05:01:17 +00:00
2011-05-18 18:59:17 +00:00
$this -> db -> describe = $schema ;
$result = $this -> db -> getPrimaryKey ( $this -> model );
2012-03-23 06:37:12 +00:00
$this -> assertEquals ( 'id' , $result );
2011-10-28 05:01:17 +00:00
2009-04-29 16:26:03 +00:00
unset ( $schema [ 'id' ][ 'key' ]);
2011-05-18 18:59:17 +00:00
$this -> db -> describe = $schema ;
$result = $this -> db -> getPrimaryKey ( $this -> model );
2009-04-29 16:26:03 +00:00
$this -> assertNull ( $result );
}
2009-07-24 19:18:37 +00:00
2011-06-21 20:17:49 +00:00
/**
* SQL server < 11 doesn ' t have proper limit / offset support , test that our hack works .
*
* @ return void
*/
public function testLimitOffsetHack () {
2011-06-23 00:01:36 +00:00
$this -> loadFixtures ( 'Author' , 'Post' , 'User' );
2011-06-21 20:17:49 +00:00
$query = array (
2011-06-23 00:01:36 +00:00
'limit' => 2 ,
2011-06-21 20:17:49 +00:00
'page' => 1 ,
2011-06-23 00:01:36 +00:00
'order' => 'User.user ASC' ,
2011-06-21 20:17:49 +00:00
);
2011-06-23 00:01:36 +00:00
$User = ClassRegistry :: init ( 'User' );
$results = $User -> find ( 'all' , $query );
2011-06-21 20:17:49 +00:00
2011-06-23 00:01:36 +00:00
$this -> assertEquals ( 2 , count ( $results ));
$this -> assertEquals ( 'garrett' , $results [ 0 ][ 'User' ][ 'user' ]);
$this -> assertEquals ( 'larry' , $results [ 1 ][ 'User' ][ 'user' ]);
2011-06-21 20:17:49 +00:00
$query = array (
2011-06-23 00:01:36 +00:00
'limit' => 2 ,
2011-06-21 20:17:49 +00:00
'page' => 2 ,
2011-06-23 00:01:36 +00:00
'order' => 'User.user ASC' ,
2011-06-21 20:17:49 +00:00
);
2011-06-23 00:01:36 +00:00
$User = ClassRegistry :: init ( 'User' );
$results = $User -> find ( 'all' , $query );
$this -> assertEquals ( 2 , count ( $results ));
2011-06-21 20:17:49 +00:00
$this -> assertFalse ( isset ( $results [ 0 ][ 0 ]));
2011-06-23 00:01:36 +00:00
$this -> assertEquals ( 'mariano' , $results [ 0 ][ 'User' ][ 'user' ]);
$this -> assertEquals ( 'nate' , $results [ 1 ][ 'User' ][ 'user' ]);
2011-06-21 20:17:49 +00:00
}
2011-06-23 00:01:36 +00:00
2012-02-10 03:27:30 +00:00
/**
* Test that the return of stored procedures is honoured
*
* @ return void
*/
public function testStoredProcedureReturn () {
$sql = <<< SQL
CREATE PROCEDURE cake_test_procedure
AS
BEGIN
RETURN 2 ;
END
SQL ;
$this -> Dbo -> execute ( $sql );
$sql = <<< SQL
DECLARE @ return_value int
EXEC @ return_value = [ cake_test_procedure ]
SELECT 'value' = @ return_value
SQL ;
$query = $this -> Dbo -> execute ( $sql );
$this -> Dbo -> execute ( 'DROP PROC cake_test_procedure' );
$result = $query -> fetch ();
$this -> assertEquals ( 2 , $result [ 'value' ]);
}
2017-02-03 05:35:15 +00:00
/**
2017-02-05 12:27:06 +00:00
* Test build statement with having option
2017-02-03 05:35:15 +00:00
*
* @ return void
*/
2017-02-05 12:27:06 +00:00
public function testBuildStatementWithHaving () {
2017-02-03 05:35:15 +00:00
$db = $this -> getMock ( 'SqlserverTestDb' , array ( 'getVersion' ), array ( $this -> Dbo -> config ));
$db -> expects ( $this -> any ())
-> method ( 'getVersion' )
-> will ( $this -> returnValue ( '11.00.0000' ));
$query = array (
'fields' => array ( 'user_id' , 'COUNT(*) AS count' ),
'table' => 'articles' ,
'alias' => 'Article' ,
'group' => 'user_id' ,
'order' => array ( 'COUNT(*)' => 'DESC' ),
'limit' => 5 ,
'having' => array ( 'COUNT(*) >' => 10 ),
);
$sql = $db -> buildStatement ( $query , $this -> model );
$expected = 'SELECT TOP 5 user_id, COUNT(*) AS count FROM articles AS [Article] WHERE 1 = 1 GROUP BY user_id HAVING COUNT(*) > 10 ORDER BY COUNT(*) DESC' ;
$this -> assertEquals ( $expected , $sql );
$sql = $db -> buildStatement ( array ( 'offset' => 15 ) + $query , $this -> model );
$expected = 'SELECT user_id, COUNT(*) AS count FROM articles AS [Article] WHERE 1 = 1 GROUP BY user_id HAVING COUNT(*) > 10 ORDER BY COUNT(*) DESC OFFSET 15 ROWS FETCH FIRST 5 ROWS ONLY' ;
$this -> assertEquals ( $expected , $sql );
2017-02-05 12:27:06 +00:00
}
/**
* Test build statement with lock option
*
* @ return void
*/
public function testBuildStatementWithLockingHint () {
$db = $this -> getMock ( 'SqlserverTestDb' , array ( 'getVersion' ), array ( $this -> Dbo -> config ));
$db -> expects ( $this -> any ())
-> method ( 'getVersion' )
-> will ( $this -> returnValue ( '11.00.0000' ));
2017-02-03 05:35:15 +00:00
$query = array (
'fields' => array ( 'id' ),
'table' => 'users' ,
'alias' => 'User' ,
'order' => array ( 'id' ),
'limit' => 1 ,
'lock' => true ,
);
$sql = $db -> buildStatement ( $query , $this -> model );
$expected = 'SELECT TOP 1 id FROM users AS [User] WITH (UPDLOCK) WHERE 1 = 1 ORDER BY [id] ASC' ;
$this -> assertEquals ( $expected , $sql );
$sql = $db -> buildStatement ( array ( 'offset' => 15 ) + $query , $this -> model );
$expected = 'SELECT id FROM users AS [User] WITH (UPDLOCK) WHERE 1 = 1 ORDER BY [id] ASC OFFSET 15 ROWS FETCH FIRST 1 ROWS ONLY' ;
$this -> assertEquals ( $expected , $sql );
}
/**
2017-02-05 12:27:06 +00:00
* Test build statement with having option for legacy version
2017-02-03 05:35:15 +00:00
*
* @ return void
*/
2017-02-05 12:27:06 +00:00
public function testBuildStatementWithHavingForLegacyVersion () {
2017-02-03 05:35:15 +00:00
$db = $this -> getMock ( 'SqlserverTestDb' , array ( 'getVersion' ), array ( $this -> Dbo -> config ));
$db -> expects ( $this -> any ())
-> method ( 'getVersion' )
-> will ( $this -> returnValue ( '10.00.0000' ));
$query = array (
'fields' => array ( 'user_id' , 'COUNT(*) AS count' ),
'table' => 'articles' ,
'alias' => 'Article' ,
'group' => 'user_id' ,
'order' => array ( 'COUNT(*)' => 'DESC' ),
'limit' => 5 ,
'having' => array ( 'COUNT(*) >' => 10 ),
);
$sql = $db -> buildStatement ( $query , $this -> model );
$expected = 'SELECT TOP 5 user_id, COUNT(*) AS count FROM articles AS [Article] WHERE 1 = 1 GROUP BY user_id HAVING COUNT(*) > 10 ORDER BY COUNT(*) DESC' ;
$this -> assertEquals ( $expected , $sql );
$sql = $db -> buildStatement ( array ( 'offset' => 15 ) + $query , $this -> model );
$expected = <<< SQL
SELECT TOP 5 * FROM (
SELECT user_id , COUNT ( * ) AS count , ROW_NUMBER () OVER ( ORDER BY COUNT ( * ) DESC ) AS _cake_page_rownum_
FROM articles AS [ Article ] WHERE 1 = 1 GROUP BY user_id HAVING COUNT ( * ) > 10
) AS _cake_paging_
WHERE _cake_paging_ . _cake_page_rownum_ > 15
ORDER BY _cake_paging_ . _cake_page_rownum_
SQL ;
$this -> assertEquals ( $expected , preg_replace ( '/^\s+|\s+$/m' , '' , $sql ));
2017-02-05 12:27:06 +00:00
}
/**
* Test build statement with lock option for legacy version
*
* @ return void
*/
public function testBuildStatementWithLockingHintForLegacyVersion () {
$db = $this -> getMock ( 'SqlserverTestDb' , array ( 'getVersion' ), array ( $this -> Dbo -> config ));
$db -> expects ( $this -> any ())
-> method ( 'getVersion' )
-> will ( $this -> returnValue ( '10.00.0000' ));
2017-02-03 05:35:15 +00:00
$query = array (
'fields' => array ( 'id' ),
'table' => 'users' ,
'alias' => 'User' ,
'order' => array ( 'id' ),
'limit' => 1 ,
'lock' => true ,
);
$sql = $db -> buildStatement ( $query , $this -> model );
$expected = 'SELECT TOP 1 id FROM users AS [User] WITH (UPDLOCK) WHERE 1 = 1 ORDER BY [id] ASC' ;
$this -> assertEquals ( $expected , $sql );
$sql = $db -> buildStatement ( array ( 'offset' => 15 ) + $query , $this -> model );
$expected = <<< SQL
SELECT TOP 1 * FROM (
SELECT id , ROW_NUMBER () OVER ( ORDER BY [ id ] ASC ) AS _cake_page_rownum_
FROM users AS [ User ] WITH ( UPDLOCK ) WHERE 1 = 1
) AS _cake_paging_
WHERE _cake_paging_ . _cake_page_rownum_ > 15
ORDER BY _cake_paging_ . _cake_page_rownum_
SQL ;
$this -> assertEquals ( $expected , preg_replace ( '/^\s+|\s+$/m' , '' , $sql ));
}
2008-05-30 11:40:08 +00:00
}