You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
480 lines
14 KiB
480 lines
14 KiB
<?php
|
|
|
|
/*
|
|
* @copyright NetMonsters <team@netmonsters.ru>
|
|
* @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;
|
|
}
|
|
}
|