* @link http://netmonsters.ru * @package Majestic * @subpackage UnitTests * @since 2011-11-4 * * Unit tests for MySQLiStatement class */ 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 { private $driver; private $stmt; 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); } } /** * @runInSeparateProcess */ public function testFetchNoResult() { if (!defined('DEBUG')) { define('DEBUG', false); } $this->assertFalse($this->stmt->fetch()); } /** * @runInSeparateProcess */ public function testDriverExecuteNoResult() { if (!defined('DEBUG')) { define('DEBUG', false); } $this->setDriverGetConnectionWrongResultMethod(); $this->setExpectedException('GeneralException', 'ERROR'); $this->stmt->execute(array('place' => 'place_val', 'new' => 'new_val')); } /** * @runInSeparateProcess */ public function testFetch() { if (!defined('DEBUG')) { define('DEBUG', 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 */ public function testFetchObject() { if (!defined('DEBUG')) { define('DEBUG', false); } $this->setDriverGetConnectionMethod(); $this->stmt->execute(array('place' => 'place_val', 'new' => 'new_val')); $this->assertSame('OBJECT', $this->stmt->fetchObject()); } /** * @runInSeparateProcess */ public function testFetchWithDebug() { if (!defined('DEBUG')) { define('DEBUG', true); } $this->setDriverGetConnectionMethod(); $this->stmt->execute(array('place' => 'place_val', 'new' => 'new_val')); $this->assertSame('OBJECT', $this->stmt->fetch()); } /** * @runInSeparateProcess */ public function testClose() { if (!defined('DEBUG')) { define('DEBUG', 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); } 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()); } public function testNumRowsNoResult() { $this->assertFalse($this->stmt->numRows()); } /** * @runInSeparateProcess * @TODO: exception just for code coverage - could not mock mysqli properties */ public function testNumRows() { $this->markTestSkipped('Unable to execute a method or access a property of an incomplete object.'); if (!defined('DEBUG')) { define('DEBUG', false); } $this->setDriverGetConnectionMethod(); $this->stmt->execute(array('place' => 'place_val', 'new' => 'new_val')); $this->assertNull($this->stmt->numRows()); } /** * @runInSeparateProcess */ public function testFetchInvalidMode() { if (!defined('DEBUG')) { define('DEBUG', 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; } }