* @link http://netmonsters.ru * @package Majestic * @subpackage UnitTests * @since 2011-11-15 * * 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/MongoStatement.php'; require_once dirname(__FILE__) . '/../../exception/GeneralException.php'; class MongoStatementTest extends PHPUnit_Framework_TestCase { private $driver; private $stmt; private $request; 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('getConnection')) ->getMock(); $this->request = $this->getMockBuilder('MongoDbCommandMock') ->disableOriginalConstructor() ->setMethods(array('execute', 'bindParam', 'getInsertId', '__toString')) ->getMock(); $this->stmt = new MongoStatement($this->driver, $this->request); } } /** * @runInSeparateProcess * @group Mongo */ public function testAffectedNumRowsNoResult() { Config::set('PROFILER_DETAILS', false); $this->assertFalse($this->stmt->affectedRows()); $this->assertFalse($this->stmt->numRows()); $this->setDriverGetConnectionMethod(); $this->request ->expects($this->any()) ->method('execute') ->will($this->returnValue(array())); $this->stmt->execute(); $this->assertFalse($this->stmt->affectedRows()); } /** * @runInSeparateProcess * @group Mongo */ public function testAffectedNumRows() { Config::set('PROFILER_DETAILS', false); $this->setDriverGetConnectionMethod(); $this->request ->expects($this->once()) ->method('execute') ->will($this->returnValue(array('n' => 20, 'ok' => 1))); $this->stmt->execute(); $this->assertEquals(20, $this->stmt->affectedRows()); } /** * @runInSeparateProcess * @group Mongo */ public function testGetInsertId() { Config::set('PROFILER_DETAILS', false); $this->setDriverGetConnectionMethod(); $this->request = $this->getMockBuilder('InsertMongoCommand') ->disableOriginalConstructor() ->setMethods(array('execute', 'bindParam', 'getInsertId')) ->getMock(); $this->request ->expects($this->once()) ->method('execute') ->will($this->returnValue(array('n' => 20, 'ok' => 1))); $this->request ->expects($this->once()) ->method('getInsertId') ->will($this->returnValue('4b0rrs')); $this->stmt = new MongoStatement($this->driver, $this->request); $this->stmt->execute(); $this->assertEquals('4b0rrs', $this->stmt->getInsertId()); } /** * @runInSeparateProcess * @group Mongo */ public function testExecute() { Config::set('PROFILER_DETAILS', false); $this->setDriverGetConnectionMethod()->setRequestExecuteMethod(); $this->assertTrue($this->stmt->execute()); } /** * @runInSeparateProcess * @group Mongo */ public function testExecuteNoResult() { Config::set('PROFILER_DETAILS', false); $this->setDriverGetConnectionMethod(); $this->request ->expects($this->any()) ->method('execute') ->will($this->returnValue(false)); $this->setExpectedException('GeneralException', 'MongoDB request error.'); $this->stmt->execute(); } /** * @runInSeparateProcess * @group Mongo */ public function testExecuteNoConnection() { Config::set('PROFILER_DETAILS', false); $this->driver ->expects($this->any()) ->method('getConnection') ->will($this->returnValue(false)); $this->setExpectedException('GeneralException', 'No connection to MongoDB server.'); $this->stmt->execute(); } /** * @runInSeparateProcess * @group Mongo */ public function testExecuteWithDebug() { Config::set('PROFILER', true); Config::set('PROFILER_DETAILS', true); $this->setDriverGetConnectionMethod()->setRequestExecuteMethod(); $this->assertTrue($this->stmt->execute()); $this->assertEquals(10, $this->stmt->numRows()); $this->assertContains('Queries: 1', Profiler::getInstance()->getCli()); } /** * @runInSeparateProcess * @group Mongo */ public function testBindParam() { Config::set('PROFILER', true); Config::set('PROFILER_DETAILS', true); $this->request ->expects($this->once()) ->method('bindParam') ->will($this->returnValue(true)); $this->setDriverGetConnectionMethod()->setRequestExecuteMethod(); $this->assertTrue($this->stmt->execute(array('one' => 'two'))); $this->assertAttributeNotEquals(null, 'result', $this->stmt); $this->stmt->close(); $this->assertAttributeEquals(null, 'result', $this->stmt); } /** * @runInSeparateProcess * @group Mongo */ public function testFetch() { Config::set('PROFILER', true); Config::set('PROFILER_DETAILS', false); $this->assertFalse($this->stmt->fetch()); $this->setDriverGetConnectionMethod()->setRequestForFetch(); $this->stmt->execute(); $result = $this->stmt->fetch(); $this->assertEquals('prev', $result->next); $this->assertFalse($this->stmt->fetch()); $this->assertContains('Queries not counted.', Profiler::getInstance()->getCli()); } /** * @runInSeparateProcess * @group Mongo */ public function testFetchWithInitialArray() { Config::set('PROFILER', true); Config::set('PROFILER_DETAILS', true); $this->assertFalse($this->stmt->fetch()); $this->setDriverGetConnectionMethod(); $this->request ->expects($this->once()) ->method('execute') ->will($this->returnValue(array('retval' => 'val'))); $this->stmt->execute(); $this->assertEquals('val', $this->stmt->fetch()); } /** * @runInSeparateProcess * @group Mongo */ public function testFetchAssocFromCursor() { Config::set('PROFILER', true); Config::set('PROFILER_DETAILS', true); $this->assertFalse($this->stmt->fetch()); $this->setDriverGetConnectionMethod()->setRequestForFetch(); $this->stmt->execute(); $result = $this->stmt->fetch(Db::FETCH_ASSOC); $this->assertEquals('prev', $result['next']); $this->assertEquals(array(), $this->stmt->fetch(Db::FETCH_ASSOC)); } /** * @runInSeparateProcess * @group Mongo */ public function testFetchAssocFromArray() { Config::set('PROFILER', true); Config::set('PROFILER_DETAILS', true); $this->assertFalse($this->stmt->fetch()); $this->setDriverGetConnectionMethod(); $this->request ->expects($this->once()) ->method('execute') ->will($this->returnValue(array('some' => 'val'))); $this->stmt->execute(); $result = $this->stmt->fetch(Db::FETCH_ASSOC); $this->assertEquals('val', $result['some']); } /** * @runInSeparateProcess * @group Mongo */ public function testFetchWrongMode() { Config::set('PROFILER', true); Config::set('PROFILER_DETAILS', true); $this->assertFalse($this->stmt->fetch()); $this->setDriverGetConnectionMethod(); $this->request ->expects($this->once()) ->method('execute') ->will($this->returnValue(array('some' => 'val'))); $this->stmt->execute(); $this->setExpectedException('GeneralException', 'Invalid fetch mode "222" specified'); $this->stmt->fetch(222); } /** * @runInSeparateProcess * @group Mongo */ public function testSkipOrderLimit() { Config::set('PROFILER', true); Config::set('PROFILER_DETAILS', true); $this->setDriverGetConnectionMethod()->setRequestForFetch(); $this->stmt->execute(); $this->assertInstanceOf('MongoStatement', $this->stmt->order(array('id' => 1))); $this->assertInstanceOf('MongoStatement', $this->stmt->limit(10)); $this->assertInstanceOf('MongoStatement', $this->stmt->skip(1)); $this->stmt->fetch(); $this->stmt->fetch(); } /** * @runInSeparateProcess * @group Mongo */ public function testCount() { Config::set('PROFILER', true); Config::set('PROFILER_DETAILS', true); $this->setDriverGetConnectionMethod()->setRequestForFetch(); $this->stmt->execute(); $this->assertSame(10, $this->stmt->count()); $this->stmt->fetch(); } /** * @runInSeparateProcess * @group Mongo */ public function testCountException() { Config::set('PROFILER', true); Config::set('PROFILER_DETAILS', true); $this->setDriverGetConnectionMethod(); $this->request ->expects($this->once()) ->method('execute') ->will($this->returnValue(array('some' => 'val'))); $this->stmt->execute(); $this->setExpectedException('GeneralException', 'MongoStatement error. Impossible count result of opened cursor'); $this->stmt->count(); } /** * @runInSeparateProcess * @group Mongo */ public function testOrderException() { Config::set('PROFILER', true); Config::set('PROFILER_DETAILS', true); $this->setDriverGetConnectionMethod(); $this->request ->expects($this->once()) ->method('execute') ->will($this->returnValue(array('some' => 'val'))); $this->stmt->execute(); $this->setExpectedException('GeneralException', 'MongoStatement error. Impossible order results of opened cursor'); $this->stmt->order(array('id' => 1)); } /** * @runInSeparateProcess * @group Mongo */ public function testSkipException() { Config::set('PROFILER', true); Config::set('PROFILER_DETAILS', true); $this->setDriverGetConnectionMethod(); $this->request ->expects($this->once()) ->method('execute') ->will($this->returnValue(array('some' => 'val'))); $this->stmt->execute(); $this->setExpectedException('GeneralException', 'MongoStatement error. Impossible skip results of opened cursor'); $this->stmt->skip(array('id' => 1)); } /** * @runInSeparateProcess * @group Mongo */ public function testLimitException() { Config::set('PROFILER', true); Config::set('PROFILER_DETAILS', true); $this->setDriverGetConnectionMethod(); $this->request ->expects($this->once()) ->method('execute') ->will($this->returnValue(array('some' => 'val'))); $this->stmt->execute(); $this->setExpectedException('GeneralException', 'MongoStatement error. Impossible limit results of opened cursor'); $this->stmt->limit(array('id' => 1)); } private function setDriverGetConnectionMethod() { $mongoMock = $this->getMock('Mongo'); $this->driver ->expects($this->any()) ->method('getConnection') ->will($this->returnValue($mongoMock)); return $this; } public function setRequestExecuteMethod() { $resultMock = $this->getMockBuilder('MongoCursor') ->setMethods(array('count')) ->disableOriginalConstructor() ->getMock(); $resultMock ->expects($this->any()) ->method('count') ->will($this->returnValue(10)); $this->request ->expects($this->any()) ->method('execute') ->will($this->returnValue($resultMock)); return $this; } public function setRequestForFetch() { $resultMock = $this->getMockBuilder('MongoCursor') ->setMethods(array('count', 'getNext', 'limit', 'sort', 'skip')) ->disableOriginalConstructor() ->getMock(); $resultMock ->expects($this->any()) ->method('limit'); $resultMock ->expects($this->any()) ->method('sort'); $resultMock ->expects($this->any()) ->method('skip'); $resultMock ->expects($this->any()) ->method('count') ->will($this->returnValue(10)); $resultMock ->expects($this->at(0)) ->method('getNext') ->will($this->returnValue(array('next' => 'prev', '_id' => 10))); $resultMock ->expects($this->at(1)) ->method('getNext') ->will($this->returnValue(array())); $this->request ->expects($this->any()) ->method('execute') ->will($this->returnValue($resultMock)); return $this; } }