Fixing modeltask to use correct table

ModelTask will now bake correct primaryKey when not id
This commit is contained in:
Ceeram 2011-11-25 16:25:11 +01:00
parent 1668067740
commit 57a1a2814d
3 changed files with 125 additions and 11 deletions

View file

@ -57,6 +57,13 @@ class ModelTask extends BakeTask {
*/
protected $_tables = array();
/**
* Holds the model names
*
* @var array
*/
protected $_modelNames = array();
/**
* Holds validation method map.
*
@ -118,9 +125,9 @@ class ModelTask extends BakeTask {
}
$modelClass = Inflector::classify($table);
$this->out(__d('cake_console', 'Baking %s', $modelClass));
$object = $this->_getModelObject($modelClass);
$object = $this->_getModelObject($modelClass, $table);
if ($this->bake($object, false) && $unitTestExists) {
$this->bakeFixture($modelClass);
$this->bakeFixture($modelClass, $table);
$this->bakeTest($modelClass);
}
}
@ -133,11 +140,18 @@ class ModelTask extends BakeTask {
* @param string $table Table name
* @return Model Model instance
*/
protected function &_getModelObject($className, $table = null) {
protected function _getModelObject($className, $table = null) {
if (!$table) {
$table = Inflector::tableize($className);
}
$object = new Model(array('name' => $className, 'table' => $table, 'ds' => $this->connection));
$fields = $object->schema(true);
foreach ($fields as $name => $field) {
if (isset($field['key']) && $field['key'] == 'primary') {
$object->primaryKey = $name;
break;
}
}
return $object;
}
@ -452,7 +466,7 @@ class ModelTask extends BakeTask {
* Handles associations
*
* @param Model $model
* @return array $assocaitons
* @return array $associations
*/
public function doAssociations($model) {
if (!is_object($model)) {
@ -464,7 +478,7 @@ class ModelTask extends BakeTask {
$fields = $model->schema(true);
if (empty($fields)) {
return false;
return array();
}
if (empty($this->_tables)) {
@ -730,8 +744,8 @@ class ModelTask extends BakeTask {
public function bake($name, $data = array()) {
if (is_object($name)) {
if ($data == false) {
$data = $associations = array();
$data['associations'] = $this->doAssociations($name, $associations);
$data = array();
$data['associations'] = $this->doAssociations($name);
$data['validate'] = $this->doValidation($name);
}
$data['primaryKey'] = $name->primaryKey;
@ -808,6 +822,10 @@ class ModelTask extends BakeTask {
$db = ConnectionManager::getDataSource($useDbConfig);
$useTable = Inflector::tableize($modelName);
if (in_array($modelName, $this->_modelNames)) {
$modelNames = array_flip($this->_modelNames);
$useTable = $this->_tables[$modelNames[$modelName]];
}
$fullTableName = $db->fullTableName($useTable, false);
$tableIsGood = false;

View file

@ -200,6 +200,39 @@ class ModelTaskTest extends CakeTestCase {
$this->assertEquals($expected, $result);
}
/**
* test getTable with non-conventional tablenames
*
* @return void
*/
public function testGetTableOddTable() {
$out = $this->getMock('ConsoleOutput', array(), array(), '', false);
$in = $this->getMock('ConsoleInput', array(), array(), '', false);
$this->Task = $this->getMock('ModelTask',
array('in', 'err', '_stop', '_checkUnitTest', 'getAllTables'),
array($out, $out, $in)
);
$this->_setupOtherMocks();
$this->Task->connection = 'test';
$this->Task->path = '/my/path/';
$this->Task->interactive = true;
$this->Task->expects($this->once())->method('getAllTables')->will($this->returnValue(array('articles', 'bake_odd')));
$this->Task->expects($this->any())->method('in')
->will($this->onConsecutiveCalls(
2 // bake_odd
));
$result = $this->Task->getName();
$expected = 'BakeOdd';
$this->assertEquals($expected, $result);
$result = $this->Task->getTable($result);
$expected = 'bake_odd';
$this->assertEquals($expected, $result);
}
/**
* test that initializing the validations works.
*
@ -548,7 +581,7 @@ class ModelTaskTest extends CakeTestCase {
}
/**
* Ensure that the fixutre object is correctly called.
* Ensure that the fixture object is correctly called.
*
* @return void
*/
@ -860,9 +893,17 @@ STRINGEND;
$this->Task->expects($this->at(3))->method('createFile')
->with($filename, $this->stringContains('class BakeComment'));
$filename = '/my/path/BakeComment.php';
$this->Task->expects($this->at(3))->method('createFile')
->with($filename, $this->stringContains('public $primaryKey = \'otherid\';'));
$filename = '/my/path/BakeTag.php';
$this->Task->expects($this->at(4))
->method('createFile')->with($filename, $this->stringContains('class BakeTag'));
$this->Task->expects($this->at(4))->method('createFile')
->with($filename, $this->stringContains('class BakeTag'));
$filename = '/my/path/BakeTag.php';
$this->Task->expects($this->at(4))->method('createFile')
->with($filename, $this->logicalNot($this->stringContains('public $primaryKey')));
$filename = '/my/path/CategoryThread.php';
$this->Task->expects($this->at(5))->method('createFile')
@ -874,6 +915,61 @@ STRINGEND;
$this->assertEquals(count(ClassRegistry::mapKeys()), 0);
}
/**
* test that odd tablenames arent inflected back from modelname
*
* @return void
*/
public function testExecuteIntoAllOddTables() {
$out = $this->getMock('ConsoleOutput', array(), array(), '', false);
$in = $this->getMock('ConsoleInput', array(), array(), '', false);
$this->Task = $this->getMock('ModelTask',
array('in', 'err', '_stop', '_checkUnitTest', 'getAllTables', '_getModelObject', 'bake', 'bakeFixture'),
array($out, $out, $in)
);
$this->_setupOtherMocks();
$this->Task->connection = 'test';
$this->Task->path = '/my/path/';
$this->Task->args = array('all');
$this->Task->expects($this->once())->method('_checkUnitTest')->will($this->returnValue(true));
$this->Task->expects($this->once())->method('getAllTables')->will($this->returnValue(array('bake_odd')));
$object = new Model(array('name' => 'BakeOdd', 'table' => 'bake_odd', 'ds' => 'test'));
$this->Task->expects($this->once())->method('_getModelObject')->with('BakeOdd', 'bake_odd')->will($this->returnValue($object));
$this->Task->expects($this->at(3))->method('bake')->with($object, false)->will($this->returnValue(true));
$this->Task->expects($this->once())->method('bakeFixture')->with('BakeOdd', 'bake_odd');
$this->Task->execute();
$out = $this->getMock('ConsoleOutput', array(), array(), '', false);
$in = $this->getMock('ConsoleInput', array(), array(), '', false);
$this->Task = $this->getMock('ModelTask',
array('in', 'err', '_stop', '_checkUnitTest', 'getAllTables', '_getModelObject', 'doAssociations', 'doValidation', 'createFile'),
array($out, $out, $in)
);
$this->_setupOtherMocks();
$this->Task->connection = 'test';
$this->Task->path = '/my/path/';
$this->Task->args = array('all');
$this->Task->expects($this->once())->method('_checkUnitTest')->will($this->returnValue(true));
$this->Task->expects($this->once())->method('getAllTables')->will($this->returnValue(array('bake_odd')));
$object = new Model(array('name' => 'BakeOdd', 'table' => 'bake_odd', 'ds' => 'test'));
$this->Task->expects($this->once())->method('_getModelObject')->will($this->returnValue($object));
$this->Task->expects($this->once())->method('doAssociations')->will($this->returnValue(array()));
$this->Task->expects($this->once())->method('doValidation')->will($this->returnValue(array()));
$filename = '/my/path/BakeOdd.php';
$this->Task->expects($this->once())->method('createFile')
->with($filename, $this->stringContains('class BakeOdd'));
$filename = '/my/path/BakeOdd.php';
$this->Task->expects($this->once())->method('createFile')
->with($filename, $this->stringContains('public $useTable = \'bake_odd\''));
$this->Task->execute();
}
/**
* test that skipTables changes how all() works.
*

View file

@ -37,7 +37,7 @@ class BakeCommentFixture extends CakeTestFixture {
* @var array
*/
public $fields = array(
'id' => array('type' => 'integer', 'key' => 'primary'),
'otherid' => array('type' => 'integer', 'key' => 'primary'),
'bake_article_id' => array('type' => 'integer', 'null'=>false),
'bake_user_id' => array('type' => 'integer', 'null'=>false),
'comment' => 'text',