Add namespace.
This commit is contained in:
360
Tests/model/MySQLiStatementTest.php
Normal file
360
Tests/model/MySQLiStatementTest.php
Normal file
@ -0,0 +1,360 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* @copyright NetMonsters <team@netmonsters.ru>
|
||||
* @link http://netmonsters.ru
|
||||
* @package Majestic
|
||||
* @subpackage UnitTests
|
||||
* @since 2011-11-4
|
||||
*
|
||||
* Unit tests for MySQLiStatement class
|
||||
*/
|
||||
|
||||
require_once dirname(__FILE__) . '/../../Registry.php';
|
||||
require_once dirname(__FILE__) . '/../../Config.php';
|
||||
require_once dirname(__FILE__) . '/../../util/profiler/CommandProfiler.php';
|
||||
require_once dirname(__FILE__) . '/../../util/profiler/Profiler.php';
|
||||
require_once dirname(__FILE__) . '/../../model/Db.php';
|
||||
require_once dirname(__FILE__) . '/../../model/DbDriver.php';
|
||||
require_once dirname(__FILE__) . '/../../model/DbStatement.php';
|
||||
require_once dirname(__FILE__) . '/../../model/MySQLiStatement.php';
|
||||
require_once dirname(__FILE__) . '/../../exception/GeneralException.php';
|
||||
|
||||
class MySQLiStatementTest extends PHPUnit_Framework_TestCase
|
||||
{
|
||||
|
||||
/**
|
||||
* @var MySQLiDriver|PHPUnit_Framework_MockObject_MockObject
|
||||
*/
|
||||
private $driver;
|
||||
|
||||
/**
|
||||
* @var MySQLiStatement
|
||||
*/
|
||||
private $stmt;
|
||||
|
||||
private $sql;
|
||||
|
||||
private $testData = array(
|
||||
array('one' => 11, 'two' => 12),
|
||||
array('one' => 21, 'two' => 22),
|
||||
array('one' => 31, 'two' => 32),
|
||||
);
|
||||
|
||||
|
||||
public function run(PHPUnit_Framework_TestResult $result = NULL)
|
||||
{
|
||||
$this->setPreserveGlobalState(false);
|
||||
return parent::run($result);
|
||||
}
|
||||
|
||||
public function setUp()
|
||||
{
|
||||
if (!isset($this->stmt)) {
|
||||
$this->driver = $this->getMockBuilder('DbDriverMock')
|
||||
->disableOriginalConstructor()
|
||||
->setMethods(array('quote', 'getConnection'))
|
||||
->getMock();
|
||||
$this->sql = 'SELECT * :place FROM :place AND :new';
|
||||
$this->stmt = new MySQLiStatement($this->driver, $this->sql);
|
||||
}
|
||||
}
|
||||
|
||||
public function testBindParam()
|
||||
{
|
||||
$val = $this->getMockBuilder('DbExpr')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
$this->assertFalse($this->stmt->bindParam('var', $val));
|
||||
$this->assertTrue($this->stmt->bindParam('place', $val));
|
||||
}
|
||||
|
||||
public function testBindParamExceptionParam()
|
||||
{
|
||||
$val = 1;
|
||||
$this->setExpectedException('GeneralException', 'Placeholder must be an integer or string');
|
||||
$this->stmt->bindParam(array(), $val);
|
||||
}
|
||||
|
||||
public function testBindParamExceptionWrongObject()
|
||||
{
|
||||
$val = $this->getMock('NotDbExpr');
|
||||
$this->setExpectedException('GeneralException', 'Objects excepts DbExpr not allowed.');
|
||||
$this->stmt->bindParam('paa', $val);
|
||||
}
|
||||
|
||||
/**
|
||||
* @runInSeparateProcess
|
||||
*/
|
||||
public function testExecute()
|
||||
{
|
||||
Config::set('PROFILER_DETAILS', false);
|
||||
|
||||
$this->driver
|
||||
->expects($this->any())
|
||||
->method('quote')
|
||||
->with($this->anything())
|
||||
->will($this->returnCallback(array($this, 'driverQuote')));
|
||||
|
||||
$this->setDriverGetConnectionMethod();
|
||||
|
||||
$result = $this->stmt->execute(array('place' => 'place_val', 'new' => 'new_val'));
|
||||
$this->assertTrue($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* @runInSeparateProcess
|
||||
*/
|
||||
public function testExecuteNoPlaceholders()
|
||||
{
|
||||
Config::set('PROFILER_DETAILS', false);
|
||||
$this->setDriverGetConnectionMethod();
|
||||
|
||||
$this->sql = 'PLAIN SQL';
|
||||
$result = $this->stmt->execute(array());
|
||||
$this->assertTrue($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* @runInSeparateProcess
|
||||
* @group MySQL
|
||||
*/
|
||||
public function testFetchNoResult()
|
||||
{
|
||||
Config::set('PROFILER_DETAILS', false);
|
||||
$this->assertFalse($this->stmt->fetch());
|
||||
}
|
||||
|
||||
/**
|
||||
* @runInSeparateProcess
|
||||
* @group MySQL
|
||||
*/
|
||||
public function testDriverExecuteNoResult()
|
||||
{
|
||||
Config::set('PROFILER_DETAILS', false);
|
||||
$this->setDriverGetConnectionWrongResultMethod();
|
||||
$this->setExpectedException('GeneralException', 'ERROR');
|
||||
$this->stmt->execute(array('place' => 'place_val', 'new' => 'new_val'));
|
||||
}
|
||||
|
||||
/**
|
||||
* @runInSeparateProcess
|
||||
* @group MySQL
|
||||
*/
|
||||
public function testFetch()
|
||||
{
|
||||
Config::set('PROFILER_DETAILS', false);
|
||||
$this->setDriverGetConnectionMethod();
|
||||
$this->stmt->execute(array('place' => 'place_val', 'new' => 'new_val'));
|
||||
$this->assertSame('OBJECT', $this->stmt->fetch());
|
||||
$this->assertSame('ARRAY', $this->stmt->fetch(Db::FETCH_NUM));
|
||||
$this->assertSame('ASSOC', $this->stmt->fetch(Db::FETCH_ASSOC));
|
||||
$this->assertSame('ARRAY', $this->stmt->fetch(Db::FETCH_BOTH));
|
||||
}
|
||||
|
||||
/**
|
||||
* @runInSeparateProcess
|
||||
* @group MySQL
|
||||
*/
|
||||
public function testFetchObject()
|
||||
{
|
||||
Config::set('PROFILER_DETAILS', false);
|
||||
$this->setDriverGetConnectionMethod();
|
||||
$this->stmt->execute(array('place' => 'place_val', 'new' => 'new_val'));
|
||||
$this->assertSame('OBJECT', $this->stmt->fetchObject());
|
||||
}
|
||||
|
||||
/**
|
||||
* @runInSeparateProcess
|
||||
* @group MySQL
|
||||
*/
|
||||
public function testFetchPairs()
|
||||
{
|
||||
Config::set('PROFILER_DETAILS', false);
|
||||
|
||||
$resultMock = $this->getMockBuilder('mysqli_result')
|
||||
->disableOriginalConstructor()
|
||||
->setMethods(array('fetch_array', 'close'))
|
||||
->setMockClassName('Mysqli_Result_Mock')
|
||||
->getMock();
|
||||
$resultMock
|
||||
->expects($this->at(0))
|
||||
->method('fetch_array')
|
||||
->will($this->returnValue(array('pair', 'value')));
|
||||
$resultMock
|
||||
->expects($this->at(1))
|
||||
->method('fetch_array')
|
||||
->will($this->returnValue(false));
|
||||
$resultMock
|
||||
->expects($this->any())
|
||||
->method('close')
|
||||
->will($this->returnValue(TRUE));
|
||||
|
||||
$mysqliMock = $this->getMock('MysqliDrvr', array('query'));
|
||||
$mysqliMock
|
||||
->expects($this->any())
|
||||
->method('query')
|
||||
->with($this->anything())
|
||||
->will($this->returnValue($resultMock));
|
||||
|
||||
$this->driver
|
||||
->expects($this->any())
|
||||
->method('getConnection')
|
||||
->will($this->returnValue($mysqliMock));
|
||||
|
||||
$this->stmt->execute(array('place' => 'place_val', 'new' => 'new_val'));
|
||||
$this->assertSame(array('pair' => 'value'), $this->stmt->fetchPairs());
|
||||
}
|
||||
|
||||
/**
|
||||
* @runInSeparateProcess
|
||||
*/
|
||||
public function testFetchWithDebug()
|
||||
{
|
||||
Config::set('PROFILER', true);
|
||||
Config::set('PROFILER_DETAILS', true);
|
||||
$this->setDriverGetConnectionMethod();
|
||||
$this->stmt->execute(array('place' => 'place_val', 'new' => 'new_val'));
|
||||
$this->assertSame('OBJECT', $this->stmt->fetch());
|
||||
$this->assertContains('Queries: 1', Profiler::getInstance()->getCli());
|
||||
}
|
||||
|
||||
/**
|
||||
* @runInSeparateProcess
|
||||
* @group MySQL
|
||||
*/
|
||||
public function testClose()
|
||||
{
|
||||
Config::set('PROFILER', true);
|
||||
Config::set('PROFILER_DETAILS', false);
|
||||
$this->assertAttributeEquals(null, 'result', $this->stmt);
|
||||
$this->setDriverGetConnectionMethod();
|
||||
$this->stmt->execute(array('place' => 'place_val', 'new' => 'new_val'));
|
||||
$this->assertAttributeNotEquals(null, 'result', $this->stmt);
|
||||
$this->stmt->close();
|
||||
$this->assertAttributeEquals(null, 'result', $this->stmt);
|
||||
$this->assertContains('Queries not counted.', Profiler::getInstance()->getCli());
|
||||
}
|
||||
|
||||
/**
|
||||
* @group MySQL
|
||||
*/
|
||||
public function testAffectedRows()
|
||||
{
|
||||
$mysqliMock = $this->getMockBuilder('MysqliDrvr');
|
||||
$mysqliMock->affected_rows = 'AFFECTED_ROWS';
|
||||
|
||||
$this->driver
|
||||
->expects($this->any())
|
||||
->method('getConnection')
|
||||
->will($this->returnValue($mysqliMock));
|
||||
|
||||
$this->assertSame('AFFECTED_ROWS', $this->stmt->affectedRows());
|
||||
}
|
||||
|
||||
/**
|
||||
* @group MySQL
|
||||
*/
|
||||
public function testNumRowsNoResult()
|
||||
{
|
||||
$this->assertFalse($this->stmt->numRows());
|
||||
}
|
||||
|
||||
/**
|
||||
* @runInSeparateProcess
|
||||
* @TODO: exception just for code coverage - could not mock mysqli properties
|
||||
* @group MySQL
|
||||
*/
|
||||
public function testNumRows()
|
||||
{
|
||||
$this->markTestSkipped('Unable to execute a method or access a property of an incomplete object.');
|
||||
Config::set('PROFILER_DETAILS', false);
|
||||
$this->setDriverGetConnectionMethod();
|
||||
$this->stmt->execute(array('place' => 'place_val', 'new' => 'new_val'));
|
||||
$this->assertNull($this->stmt->numRows());
|
||||
}
|
||||
|
||||
/**
|
||||
* @runInSeparateProcess
|
||||
* @group MySQL
|
||||
*/
|
||||
public function testFetchInvalidMode()
|
||||
{
|
||||
Config::set('PROFILER_DETAILS', false);
|
||||
$this->setDriverGetConnectionMethod();
|
||||
$this->stmt->execute(array('place' => 'place_val', 'new' => 'new_val'));
|
||||
|
||||
$this->setExpectedException('GeneralException');
|
||||
|
||||
$this->stmt->fetch(324);
|
||||
}
|
||||
|
||||
private function setDriverGetConnectionMethod()
|
||||
{
|
||||
$resultMock = $this->getMockBuilder('mysqli_result')
|
||||
->disableOriginalConstructor()
|
||||
->setMethods(array('fetch_object', 'fetch_array', 'fetch_assoc', 'close'))
|
||||
->setMockClassName('Mysqli_Result_Mock')
|
||||
->getMock();
|
||||
$resultMock
|
||||
->expects($this->any())
|
||||
->method('fetch_object')
|
||||
->will($this->returnValue('OBJECT'));
|
||||
$resultMock
|
||||
->expects($this->any())
|
||||
->method('fetch_array')
|
||||
->will($this->returnValue('ARRAY'));
|
||||
$resultMock
|
||||
->expects($this->any())
|
||||
->method('fetch_assoc')
|
||||
->will($this->returnValue('ASSOC'));
|
||||
$resultMock
|
||||
->expects($this->any())
|
||||
->method('close')
|
||||
->will($this->returnValue(TRUE));
|
||||
|
||||
$mysqliMock = $this->getMock('MysqliDrvr', array('query'));
|
||||
$mysqliMock
|
||||
->expects($this->any())
|
||||
->method('query')
|
||||
->with($this->anything())
|
||||
->will($this->returnValue($resultMock));
|
||||
|
||||
$this->driver
|
||||
->expects($this->any())
|
||||
->method('getConnection')
|
||||
->will($this->returnValue($mysqliMock));
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
private function setDriverGetConnectionWrongResultMethod()
|
||||
{
|
||||
$mysqliMock = $this->getMock('MysqliDrvr', array('query'));
|
||||
$mysqliMock
|
||||
->expects($this->any())
|
||||
->method('query')
|
||||
->with($this->anything())
|
||||
->will($this->returnValue(false));
|
||||
$mysqliMock->error = 'ERROR';
|
||||
$mysqliMock->errno = 0;
|
||||
|
||||
$this->driver
|
||||
->expects($this->any())
|
||||
->method('getConnection')
|
||||
->will($this->returnValue($mysqliMock));
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function driverQuote($val)
|
||||
{
|
||||
return $val;
|
||||
}
|
||||
|
||||
public function dbStatementAssemble($val)
|
||||
{
|
||||
return $val;
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user