From 1f0bfb131bc0f0d898646966e9c5ed9729f94d24 Mon Sep 17 00:00:00 2001 From: Anton Grebnev Date: Tue, 15 Nov 2011 12:41:05 +0400 Subject: [PATCH] MongoCommand hierarchy created --- model/MongoDbCommand.php | 120 ++++++++++++++++++++++++ tests/model/MongoDbCommandTest.php | 183 +++++++++++++++++++++++++++++++++++++ 2 files changed, 303 insertions(+) create mode 100644 model/MongoDbCommand.php create mode 100644 tests/model/MongoDbCommandTest.php diff --git a/model/MongoDbCommand.php b/model/MongoDbCommand.php new file mode 100644 index 0000000..663f73e --- /dev/null +++ b/model/MongoDbCommand.php @@ -0,0 +1,120 @@ + + * @link http://netmonsters.ru + * @package Majestic + * @subpackage db + * @since 2011-11-15 + */ + +class MongoCommandBuilder +{ + + const FIND = 'Find'; + + const INSERT = 'Insert'; + + const UPDATE = 'Update'; + + const REMOVE = 'Remove'; + + static public function factory($type) + { + $class = ucfirst($type) . 'MongoCommand'; + return new $class(); + } +} + +abstract class MongoDbCommand +{ + public function execute() + { + if ($this->checkParams()) { + return $this->concreteExecute(); + } else { + throw new Exception(get_called_class() . ' error. Bind all required params first.'); + } + } + + public function bindParam($name, $value) + { + $this->$name = $value; + return $this; + } + + abstract protected function concreteExecute(); + + abstract protected function checkParams(); +} + +class FindMongoCommand extends MongoDbCommand +{ + protected function concreteExecute() + { + return $this->collection->find($this->condition, $this->fields); + } + + protected function checkParams() + { + if (isset($this->collection) && isset($this->condition) && isset($this->fields)) { + return true; + } else { + return false; + } + } +} + +class InsertMongoCommand extends MongoDbCommand +{ + protected function concreteExecute() + { + return $this->collection->insert($this->data, array('safe' => $this->safe)); + } + + protected function checkParams() + { + if (isset($this->collection) && isset($this->data) && isset($this->safe)) { + return true; + } else { + return false; + } + } +} + +class UpdateMongoCommand extends MongoDbCommand +{ + protected function concreteExecute() + { + return $this->collection->update($this->condition, $this->data, array('upsert' => $this->upsert, 'safe' => $this->safe)); + } + + protected function checkParams() + { + if (isset($this->collection) && isset($this->condition) && isset($this->data) && + isset($this->upsert) && isset($this->safe) + ) { + return true; + } else { + return false; + } + } +} + +class RemoveMongoCommand extends MongoDbCommand +{ + protected function concreteExecute() + { + return $this->collection->remove($this->condition, array('safe' => $this->safe)); + } + + protected function checkParams() + { + if (isset($this->collection) && isset($this->condition) && isset($this->safe)) { + return true; + } else { + return false; + } + } +} + + diff --git a/tests/model/MongoDbCommandTest.php b/tests/model/MongoDbCommandTest.php new file mode 100644 index 0000000..1cc2973 --- /dev/null +++ b/tests/model/MongoDbCommandTest.php @@ -0,0 +1,183 @@ + + * @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'; + +class MongoDbCommandTest extends PHPUnit_Framework_TestCase +{ + + private $conf = array(); + + private $driver; + + 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); + } + + 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() + { + $collection = $this->driver->getCollection('items'); + $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::FIND); + $cmd->bindParam('collection', $collection)->bindParam('condition', array('name' => 'bread'))->bindParam('fields', array()); + $result = $cmd->execute(); + $this->assertEquals(0, $result->count()); + } + + /** + * @expectedException Exception + * @expectedExceptionMessage FindMongoCommand error. Bind all required params first. + */ + public function testFindCommandNotAllParamsBinded() + { + $collection = $this->driver->getCollection('items'); + $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::FIND); + $cmd->bindParam('collection', $collection)->bindParam('condition', array('name' => 'bread')); + $cmd->execute(); + } + + public function testInsertCommand() + { + $collection = $this->driver->getCollection('items'); + $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::INSERT); + $cmd->bindParam('collection', $collection) + ->bindParam('data', array('name' => 'insert')) + ->bindParam('safe', true); + $this->assertArrayHasKey('n', $cmd->execute()); + + $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::FIND); + $cmd->bindParam('collection', $collection)->bindParam('condition', array('name' => 'insert'))->bindParam('fields', array()); + $result = $cmd->execute(); + $this->assertEquals(1, $result->count()); + } + + /** + * @expectedException Exception + * @expectedExceptionMessage InsertMongoCommand error. Bind all required params first. + */ + public function testInsertCommandNotAllParamsBinded() + { + $collection = $this->driver->getCollection('items'); + $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::INSERT); + $cmd->bindParam('collection', $collection)->bindParam('data', array('name' => 'bread')); + $cmd->execute(); + } + + public function testUpdateCommand() + { + $collection = $this->driver->getCollection('items'); + $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::INSERT); + $cmd->bindParam('collection', $collection) + ->bindParam('data', array('name' => 'insert')) + ->bindParam('safe', true); + $this->assertArrayHasKey('n', $cmd->execute()); + + $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::UPDATE); + $cmd->bindParam('collection', $collection) + ->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); + $cmd->bindParam('collection', $collection)->bindParam('condition', array('name' => 'insert'))->bindParam('fields', array()); + $result = $cmd->execute(); + $this->assertEquals(0, $result->count()); + $cmd->bindParam('collection', $collection)->bindParam('condition', array('name' => 'update'))->bindParam('fields', array()); + $result = $cmd->execute(); + $this->assertEquals(1, $result->count()); + } + + /** + * @expectedException Exception + * @expectedExceptionMessage UpdateMongoCommand error. Bind all required params first. + */ + public function testUpdateCommandNotAllParamsBinded() + { + $collection = $this->driver->getCollection('items'); + $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::UPDATE); + $cmd->bindParam('collection', $collection)->bindParam('data', array('name' => 'bread')); + $cmd->execute(); + } + + public function testRemoveCommand() + { + $collection = $this->driver->getCollection('items'); + $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::INSERT); + $cmd->bindParam('collection', $collection) + ->bindParam('data', array('name' => 'insert')) + ->bindParam('safe', true); + $this->assertArrayHasKey('n', $cmd->execute()); + + $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::FIND); + $cmd->bindParam('collection', $collection)->bindParam('condition', array('name' => 'insert'))->bindParam('fields', array()); + $result = $cmd->execute(); + $this->assertEquals(1, $result->count()); + + $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::REMOVE); + $cmd->bindParam('collection', $collection) + ->bindParam('condition', array('name' => 'insert')) + ->bindParam('safe', true); + $this->assertArrayHasKey('n', $cmd->execute()); + + $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::FIND); + $cmd->bindParam('collection', $collection)->bindParam('condition', array('name' => 'insert'))->bindParam('fields', array()); + $result = $cmd->execute(); + $this->assertEquals(0, $result->count()); + } + + /** + * @expectedException Exception + * @expectedExceptionMessage RemoveMongoCommand error. Bind all required params first. + */ + public function testRemoveCommandNotAllParamsBinded() + { + $collection = $this->driver->getCollection('items'); + $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::REMOVE); + $cmd->bindParam('collection', $collection); + $cmd->execute(); + } + +}