mirror of
https://github.com/yiisoft/yii.git
synced 2026-03-03 14:54:04 +01:00
207 lines
6.4 KiB
PHP
207 lines
6.4 KiB
PHP
<?php
|
|
|
|
Yii::import('system.db.CDbConnection');
|
|
Yii::import('system.db.schema.mysql.CMysqlSchema');
|
|
|
|
class CDbCommandBuilderTest extends CTestCase
|
|
{
|
|
/**
|
|
* @var CDbConnection
|
|
*/
|
|
private $db;
|
|
|
|
public function setUp()
|
|
{
|
|
if(!extension_loaded('pdo') || !extension_loaded('pdo_mysql'))
|
|
$this->markTestSkipped('PDO and MySQL extensions are required.');
|
|
|
|
$this->db=new CDbConnection('mysql:host=127.0.0.1;dbname=yii','test','test');
|
|
$this->db->charset='UTF8';
|
|
$this->db->enableParamLogging=true;
|
|
try
|
|
{
|
|
$this->db->active=true;
|
|
}
|
|
catch(Exception $e)
|
|
{
|
|
$schemaFile=realpath(dirname(__FILE__).'/data/mysql.sql');
|
|
$this->markTestSkipped("Please read $schemaFile for details on setting up the test environment for MySQL test case.");
|
|
}
|
|
|
|
$tables=array('comments','post_category','posts','categories','profiles','users','items','orders','types');
|
|
foreach($tables as $table)
|
|
$this->db->createCommand("DROP TABLE IF EXISTS $table CASCADE")->execute();
|
|
|
|
$sqls=file_get_contents(dirname(__FILE__).'/data/mysql.sql');
|
|
foreach(explode(';',$sqls) as $sql)
|
|
{
|
|
if(trim($sql)!=='')
|
|
$this->db->createCommand($sql)->execute();
|
|
}
|
|
}
|
|
|
|
public function tearDown()
|
|
{
|
|
$this->db->active=false;
|
|
}
|
|
|
|
public function testIssue1407_1()
|
|
{
|
|
// :parameter1 and :parameter2 should be removed inside CDbCommandBuilder::createCountCommand()
|
|
$tableSchema=$this->db->getSchema()->getTable('users');
|
|
$builder=$this->db->getSchema()->getCommandBuilder();
|
|
|
|
$criteria1=new CDbCriteria();
|
|
$criteria1->select=array('t.*',':parameter1 AS test');
|
|
$criteria1->params[':parameter1']='testingValue';
|
|
$criteria1->order='IF (t.username=:parameter2,t.username,t.email) DESC';
|
|
$criteria1->params[':parameter2']='user2';
|
|
$criteria1->addCondition('t.email LIKE :parameter4');
|
|
$criteria1->params[':parameter4']='email%';
|
|
$criteria1->addInCondition('t.id',array(1,2,3));
|
|
|
|
$criteria2=clone $criteria1;
|
|
|
|
$this->assertEquals(3,$builder->createCountCommand($tableSchema,$criteria1)->queryScalar());
|
|
|
|
$result=$builder->createFindCommand($tableSchema,$criteria2)->queryAll();
|
|
$this->assertCount(3,$result);
|
|
$this->assertEquals(array(
|
|
array(
|
|
'id'=>'2',
|
|
'username'=>'user2',
|
|
'email'=>'email2',
|
|
'test'=>'testingValue',
|
|
'password'=>'pass2',
|
|
),
|
|
array(
|
|
'id'=>'3',
|
|
'username'=>'user3',
|
|
'email'=>'email3',
|
|
'test'=>'testingValue',
|
|
'password'=>'pass3',
|
|
),
|
|
array(
|
|
'id'=>'1',
|
|
'username'=>'user1',
|
|
'email'=>'email1',
|
|
'test'=>'testingValue',
|
|
'password'=>'pass1',
|
|
),
|
|
),$result);
|
|
}
|
|
|
|
public function testIssue1407_2()
|
|
{
|
|
// :parameter1 is not used in SQL, thus exception should be thrown
|
|
$tableSchema=$this->db->getSchema()->getTable('users');
|
|
$builder=$this->db->getSchema()->getCommandBuilder();
|
|
|
|
$criteria=new CDbCriteria();
|
|
$criteria->select=array('t.*');
|
|
$criteria->params[':parameter1']='testingValue';
|
|
$criteria->order='IF (t.username=:parameter2,t.username,t.email) DESC';
|
|
$criteria->params[':parameter2']='user2';
|
|
$criteria->addCondition('t.email LIKE :parameter4');
|
|
$criteria->params[':parameter4']='email%';
|
|
$criteria->addInCondition('t.id',array(1,2,3));
|
|
|
|
$this->setExpectedException('CDbException');
|
|
$builder->createCountCommand($tableSchema,$criteria)->queryScalar();
|
|
}
|
|
|
|
public function testIssue1407_3()
|
|
{
|
|
// :parameter2 is not used in SQL, thus exception should be thrown
|
|
$tableSchema=$this->db->getSchema()->getTable('users');
|
|
$builder=$this->db->getSchema()->getCommandBuilder();
|
|
|
|
$criteria=new CDbCriteria();
|
|
$criteria->select=array('t.*',':parameter1 AS test');
|
|
$criteria->params[':parameter1']='testingValue';
|
|
$criteria->order='IF (t.username="user2",t.username,t.email) DESC';
|
|
$criteria->params[':parameter2']='user2';
|
|
$criteria->addCondition('t.email LIKE :parameter4');
|
|
$criteria->params[':parameter4']='email%';
|
|
$criteria->addInCondition('t.id',array(1,2,3));
|
|
|
|
$this->setExpectedException('CDbException');
|
|
$builder->createCountCommand($tableSchema,$criteria)->queryScalar();
|
|
}
|
|
|
|
public function testIssue1407_4()
|
|
{
|
|
// both :parameter1 and :parameter2 are not used in SQL, thus exception should be thrown
|
|
$tableSchema=$this->db->getSchema()->getTable('users');
|
|
$builder=$this->db->getSchema()->getCommandBuilder();
|
|
|
|
$criteria=new CDbCriteria();
|
|
$criteria->select=array('t.*');
|
|
$criteria->params[':parameter1']='testingValue';
|
|
$criteria->order='IF (t.username="user2",t.username,t.email) DESC';
|
|
$criteria->params[':parameter2']='user2';
|
|
$criteria->addCondition('t.email LIKE :parameter4');
|
|
$criteria->params[':parameter4']='email%';
|
|
$criteria->addInCondition('t.id',array(1,2,3));
|
|
|
|
$this->setExpectedException('CDbException');
|
|
$builder->createCountCommand($tableSchema,$criteria)->queryScalar();
|
|
}
|
|
|
|
public function testIssue1407_5()
|
|
{
|
|
// :parameter3 is not used
|
|
$tableSchema=$this->db->getSchema()->getTable('users');
|
|
$builder=$this->db->getSchema()->getCommandBuilder();
|
|
|
|
$criteria=new CDbCriteria();
|
|
$criteria->select=array('t.*',':parameter1 AS test');
|
|
$criteria->params[':parameter1']='testingValue';
|
|
$criteria->order='IF (t.username=:parameter2,t.username,t.email) DESC';
|
|
$criteria->params[':parameter2']='user2';
|
|
$criteria->params[':parameter3']='parameter3Value';
|
|
$criteria->addCondition('t.email LIKE :parameter4');
|
|
$criteria->params[':parameter4']='email%';
|
|
$criteria->addInCondition('t.id',array(1,2,3));
|
|
|
|
$this->setExpectedException('CDbException');
|
|
$builder->createCountCommand($tableSchema,$criteria)->queryScalar();
|
|
}
|
|
|
|
public function testMultipleInsert()
|
|
{
|
|
$builder=$this->db->getSchema()->getCommandBuilder();
|
|
$tableName='types';
|
|
$data=array(
|
|
array(
|
|
'int_col'=>1,
|
|
'char_col'=>'char_col_1',
|
|
'char_col2'=>'char_col_2_1',
|
|
'float_col'=>1.1,
|
|
'bool_col'=>true,
|
|
),
|
|
array(
|
|
'int_col'=>2,
|
|
'char_col'=>'char_col_2',
|
|
'float_col'=>2.2,
|
|
'bool_col'=>false,
|
|
),
|
|
);
|
|
$command=$builder->createMultipleInsertCommand($tableName,$data);
|
|
$command->execute();
|
|
|
|
$rows=$builder->dbConnection->createCommand('SELECT * FROM '.$builder->dbConnection->quoteTableName($tableName))->queryAll();
|
|
|
|
$this->assertEquals(count($data),count($rows),'Records count miss matches!');
|
|
foreach($rows as $rowIndex=>$row)
|
|
foreach($row as $columnName=>$value)
|
|
{
|
|
$columnIndex=array_search($columnName,$data[$rowIndex],true);
|
|
if($columnIndex==false)
|
|
continue;
|
|
$expectedValue=$data[$rowIndex][$columnIndex];
|
|
$this->assertTrue($expectedValue==$value,"Value for column '{$columnName}' incorrect!");
|
|
}
|
|
}
|
|
}
|