* @link http://netmonsters.ru * @package Majestic * @subpackage UnitTests * @since 2011-11-3 * * Unit tests for DbDriver class */ require_once dirname(__FILE__) . '/../../model/DbExpr.php'; require_once dirname(__FILE__) . '/../../model/Db.php'; require_once dirname(__FILE__) . '/../../model/DbDriver.php'; require_once dirname(__FILE__) . '/../../exception/GeneralException.php'; class DbDriverTest extends PHPUnit_Framework_TestCase { private $driver; public function setUp() { $conf = array('hostname' => 'localhost', 'database' => 'db', 'username' => 'test', 'password' => '1234'); $this->driver = $this->getMockForAbstractClass('DbDriver', array($conf)); } public function testConstruct() { $conf = array('hostname' => 'localhost', 'database' => 'db', 'username' => 'test', 'password' => '1234'); try { $this->driver = $this->getMockForAbstractClass('DbDriver', array($conf)); } catch (GeneralException $expected) { $this->fail($expected->getMessage()); } $this->assertInstanceOf('DbDriver', $this->driver); } public function testConstructWrongConfig() { $conf = array('hostname' => 'localhost', 'database' => 'db'); $this->setExpectedException('GeneralException', 'Configuration must have a "username"'); $this->getMockForAbstractClass('DbDriver', array($conf)); } public function testGetConnection() { $this->assertNull($this->driver->getConnection()); } public function testBeginTransaction() { $this->assertSame($this->driver, $this->driver->beginTransaction()); } public function testCommit() { $this->assertSame($this->driver, $this->driver->commit()); } public function testRollback() { $this->assertSame($this->driver, $this->driver->rollback()); } public function testQuery() { $this->setDriverPrepareFunction(); $stmt = $this->driver->query('SELECT * FROM table'); $this->assertInstanceOf('DbStmt', $stmt); $this->assertSame('SELECT * FROM table', $stmt->string()); $stmt = $this->driver->query('SELECT * FROM table', 'simple'); $this->assertInstanceOf('DbStmt', $stmt); $this->assertSame('SELECT * FROM table', $stmt->string()); } public function testInsert() { $this->setDriverPrepareFunction() ->setDriverQuoteFunction(); $bind = array('table.name' => 'tony', 'chair.age' => 21, 'height' => 185); $sql = $this->driver->insert('users', $bind); $this->assertSame('INSERT INTO `users` (`table`.`name`, `chair`.`age`, `height`) VALUES (tony, 21, 185)', $sql); } public function testUpdate() { $this->setDriverPrepareFunction() ->setDriverQuoteFunction(); $bind = array('table.name' => 'tony', 'chair.age' => 21, 'height' => 185); $sql = $this->driver->update('users', $bind); $this->assertSame('UPDATE `users` SET `table`.`name`=tony, `chair`.`age`=21, `height`=185', $sql); } public function testDeleteNoWHERE() { $this->setDriverPrepareFunction(); $sql = $this->driver->delete('users'); $this->assertSame('DELETE FROM `users`', $sql); } public function testDeleteWithWHEREArray() { $this->setDriverPrepareFunction() ->setDriverQuoteFunction(); $sql = $this->driver->delete('users', array('name?tony' => new DbExpr('='), 'height?185' => '>')); $this->assertSame('DELETE FROM `users` WHERE name=tony AND height>185', $sql); } public function testDeleteWithWHERESimpleCond() { $this->setDriverPrepareFunction(); $sql = $this->driver->delete('users', 'name=tony'); $this->assertSame('DELETE FROM `users` WHERE name=tony', $sql); } public function testDeleteWithWHEREKeyArray() { $this->setDriverPrepareFunction(); $sql = $this->driver->delete('users', array('name=tony' => 0)); $this->assertSame('DELETE FROM `users` WHERE name=tony', $sql); } public function testDeleteWithWHEREDbExpr() { $this->setDriverPrepareFunction(); $sql = $this->driver->delete('users', new DbExpr('name=tony')); $this->assertSame('DELETE FROM `users` WHERE name=tony', $sql); } protected function setDriverPrepareFunction() { $this->driver ->expects($this->any()) ->method('prepare') ->with($this->anything()) ->will($this->returnCallback(array($this, 'dbDriverPrepare'))); return $this; } protected function setDriverQuoteFunction() { $this->driver ->expects($this->any()) ->method('driverQuote') ->with($this->anything()) ->will($this->returnArgument(0)); return $this; } public function dbDriverPrepare($sql) { $stmt = $this->getMock('DbStmt', array('execute', 'string', 'affectedRows')); $stmt->expects($this->any()) ->method('execute') ->with($this->anything()); $stmt->expects($this->any()) ->method('string') ->will($this->returnValue($sql)); $stmt->expects($this->any()) ->method('affectedRows') ->will($this->returnValue($sql)); return $stmt; } }