* @link http://netmonsters.ru * @package Majestic * @subpackage UnitTests * @since 2011-11-10 * * Unit tests for MongoDriver class */ require_once dirname(__FILE__) . '/../../model/DbDriver.php'; require_once dirname(__FILE__) . '/../../model/NoSqlDbDriver.php'; require_once dirname(__FILE__) . '/../../model/MongoDriver.php'; require_once dirname(__FILE__) . '/../../model/MongoDbCommand.php'; require_once dirname(__FILE__) . '/../../exception/GeneralException.php'; class MongoDbCommandTest extends PHPUnit_Framework_TestCase { private $conf = array(); private $driver; private $collection; public function setUp() { $this->conf = array( 'hostname' => 'localhost', 'database' => 'test', 'username' => 'test', 'password' => '1234', 'port' => 27017 ); $this->driver = new MongoDriver($this->conf); $connection = $this->driver->getConnection(); $db = $connection->selectDB($this->conf['database']); $db->authenticate($this->conf['username'], $this->conf['password']); $collection = 'items'; $db->dropCollection($collection); $this->collection = $db->selectCollection($collection); } public function testCommandFactory() { $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::FIND); $this->assertInstanceOf('MongoDbCommand', $cmd); $this->assertInstanceOf('FindMongoCommand', $cmd); $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::INSERT); $this->assertInstanceOf('MongoDbCommand', $cmd); $this->assertInstanceOf('InsertMongoCommand', $cmd); $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::UPDATE); $this->assertInstanceOf('MongoDbCommand', $cmd); $this->assertInstanceOf('UpdateMongoCommand', $cmd); $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::REMOVE); $this->assertInstanceOf('MongoDbCommand', $cmd); $this->assertInstanceOf('RemoveMongoCommand', $cmd); } public function testFindCommand() { $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::FIND, $this->collection); $cmd->bindParam('condition', array('name' => 'bread'))->bindParam('fields', array()); $result = $cmd->execute(); $this->assertEquals(0, $result->count()); $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::INSERT, $this->collection); $cmd ->bindParam('data', array('name' => 'insert')) ->bindParam('safe', true); $cmd->execute(); $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::INSERT, $this->collection); $cmd ->bindParam('data', array('name' => 'insert')) ->bindParam('safe', true); $cmd->execute(); $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::FIND, $this->collection); $cmd->bindParam('condition', array('name' => 'insert'))->bindParam('fields', array()); $this->assertEquals(2, $cmd->execute()->count()); $cmd ->bindParam('condition', array('name' => 'insert')) ->bindParam('fields', array()) ->bindParam('multiple', false); $result = $cmd->execute(); $this->assertEquals('insert', $result['name']); } /** * @expectedException GeneralException * @expectedExceptionMessage FindMongoCommand error. Bind all required params first. */ public function testFindCommandNotAllParamsBinded() { $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::FIND, $this->collection); $cmd->bindParam('condition', array('name' => 'bread')); $cmd->execute(); } public function testInsertCommand() { $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::INSERT, $this->collection); $cmd ->bindParam('data', array('name' => 'insert')) ->bindParam('safe', true); $this->assertFalse($cmd->getInsertId()); $this->assertArrayHasKey('n', $cmd->execute()); $this->assertNotEmpty($cmd->getInsertId()); $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::FIND, $this->collection); $cmd->bindParam('condition', array('name' => 'insert'))->bindParam('fields', array()); $result = $cmd->execute(); $this->assertEquals(1, $result->count()); } /** * @expectedException GeneralException * @expectedExceptionMessage InsertMongoCommand error. Bind all required params first. */ public function testInsertCommandNotAllParamsBinded() { $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::INSERT, $this->collection); $cmd->execute(); } public function testUpdateCommand() { $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::INSERT, $this->collection); $cmd ->bindParam('data', array('name' => 'insert')) ->bindParam('safe', true); $this->assertArrayHasKey('n', $cmd->execute()); $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::UPDATE, $this->collection); $cmd ->bindParam('condition', array('name' => 'insert')) ->bindParam('data', array('$set' => array('name' => 'update'))) ->bindParam('upsert', false) ->bindParam('safe', true); $this->assertArrayHasKey('n', $cmd->execute()); $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::FIND, $this->collection); $cmd->bindParam('condition', array('name' => 'insert'))->bindParam('fields', array()); $result = $cmd->execute(); $this->assertEquals(0, $result->count()); $cmd->bindParam('condition', array('name' => 'update'))->bindParam('fields', array()); $result = $cmd->execute(); $this->assertEquals(1, $result->count()); } /** * @expectedException GeneralException * @expectedExceptionMessage UpdateMongoCommand error. Bind all required params first. */ public function testUpdateCommandNotAllParamsBinded() { $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::UPDATE, $this->collection); $cmd->bindParam('data', array('name' => 'bread')); $cmd->execute(); } public function testRemoveCommand() { $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::INSERT, $this->collection); $cmd ->bindParam('data', array('name' => 'insert')) ->bindParam('safe', true); $this->assertArrayHasKey('n', $cmd->execute()); $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::FIND, $this->collection); $cmd->bindParam('condition', array('name' => 'insert'))->bindParam('fields', array()); $result = $cmd->execute(); $this->assertEquals(1, $result->count()); $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::REMOVE, $this->collection); $cmd ->bindParam('condition', array('name' => 'insert')) ->bindParam('safe', true); $this->assertArrayHasKey('n', $cmd->execute()); $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::FIND, $this->collection); $cmd->bindParam('condition', array('name' => 'insert'))->bindParam('fields', array()); $result = $cmd->execute(); $this->assertEquals(0, $result->count()); } /** * @expectedException GeneralException * @expectedExceptionMessage RemoveMongoCommand error. Bind all required params first. */ public function testRemoveCommandNotAllParamsBinded() { $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::REMOVE, $this->collection); $cmd->execute(); } /** * @expectedException GeneralException * @expectedExceptionMessage CommandMongoCommand error. Bind all required params first. */ public function testCommandCommandNotAllParamsBinded() { $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::COMMAND, $this->collection); $cmd->execute(); } public function testCommandCommandNotMongoDb() { $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::COMMAND, new CollectionMock()); $cmd->bindParam('command', array()); $this->assertFalse($cmd->execute()); } } class CollectionMock { public $db = array(); }