Commit: 996e7bed03ce9ce1f909865a41581a9c4993a768

Author: Nate Abele | Date: 2010-07-11 12:43:58 -0400
Refactored `entities()` method in `MySql` adapter to properly return an array. Added test coverage.
diff --git a/libraries/lithium/data/source/database/adapter/MySql.php b/libraries/lithium/data/source/database/adapter/MySql.php index 5d0b4ad..c5c0fa2 100644 --- a/libraries/lithium/data/source/database/adapter/MySql.php +++ b/libraries/lithium/data/source/database/adapter/MySql.php @@ -156,12 +156,20 @@ class MySql extends \lithium\data\source\Database { * @filter This method can be filtered. */ public function entities($model = null) { - $config = $this->_config; - $method = function($self, $params, $chain) use ($config) { - $name = $this->name($config['database']); - return $self->query("SHOW TABLES FROM {$name};"); - }; - return $this->_filter(__METHOD__, compact('model'), $method); + $_config = $this->_config; + $params = compact('model'); + + return $this->_filter(__METHOD__, $params, function($self, $params) use ($_config) { + $name = $self->name($_config['database']); + $result = $self->invokeMethod('_execute', array("SHOW TABLES FROM {$name};")); + $entities = array(); + + while ($data = $self->result('next', $result, null)) { + list($entities[]) = $data; + } + $self->result('close', $result, null); + return $entities; + }); } /** diff --git a/libraries/lithium/tests/cases/data/source/database/adapter/MySqlTest.php b/libraries/lithium/tests/cases/data/source/database/adapter/MySqlTest.php index 5cd6ec6..f03de65 100644 --- a/libraries/lithium/tests/cases/data/source/database/adapter/MySqlTest.php +++ b/libraries/lithium/tests/cases/data/source/database/adapter/MySqlTest.php @@ -9,6 +9,7 @@ namespace lithium\tests\cases\data\source\database\adapter; use \lithium\data\Connections; +use \lithium\data\model\Query; use \lithium\data\source\database\adapter\MySql; use \lithium\tests\mocks\data\source\database\adapter\MockMySql; @@ -157,6 +158,69 @@ class MySqlTest extends \lithium\test\Unit { $this->expectException(); $this->db->read('SELECT deliberate syntax error'); } + + public function testEnabledFeatures() { + $this->assertTrue(MySql::enabled()); + $this->assertTrue(MySql::enabled('relationships')); + $this->assertFalse(MySql::enabled('arrays')); + } + + public function testEntityQuerying() { + $sources = $this->db->entities(); + $this->assertTrue(is_array($sources)); + $this->assertFalse(empty($sources)); + } + + public function testQueryOrdering() { + $insert = new Query(array( + 'type' => 'create', + 'source' => 'companies', + 'data' => array( + 'name' => 'Foo', + 'active' => true, + 'created' => date('Y-m-d H:i:s') + ) + )); + $this->assertIdentical(true, $this->db->create($insert)); + + $insert->data(array( + 'name' => 'Bar', + 'created' => date('Y-m-d H:i:s', strtotime('-5 minutes')) + )); + $this->assertIdentical(true, $this->db->create($insert)); + + $insert->data(array( + 'name' => 'Baz', + 'created' => date('Y-m-d H:i:s', strtotime('-10 minutes')) + )); + $this->assertIdentical(true, $this->db->create($insert)); + + $read = new Query(array( + 'type' => 'read', + 'source' => 'companies', + 'fields' => array('name'), + 'order' => array('created' => 'asc') + )); + $result = $this->db->read($read, array('return' => 'array')); + $expected = array( + array('name' => 'Baz'), + array('name' => 'Bar'), + array('name' => 'Foo') + ); + $this->assertEqual($expected, $result); + + $read->order(array('created' => 'desc')); + $result = $this->db->read($read, array('return' => 'array')); + $expected = array( + array('name' => 'Foo'), + array('name' => 'Bar'), + array('name' => 'Baz') + ); + $this->assertEqual($expected, $result); + + $delete = new Query(array('type' => 'delete', 'source' => 'companies')); + $this->assertTrue($this->db->delete($delete)); + } } ?> \ No newline at end of file