Skip to content
Permalink
Browse files

Fixing bug in Model::escapeField() where it would return the wrong st…

…ring id the datasource's name method returs the unmodified string.

Tests added. Closes #473
  • Loading branch information...
lorenzo committed Mar 17, 2010
1 parent bc990f4 commit 28cb57a92c54a223fed4aacc738db5ccc8bc71c3
Showing with 53 additions and 1 deletion.
  1. +1 −1 cake/libs/model/model.php
  2. +52 −0 cake/tests/cases/libs/model/model_integration.test.php
@@ -2631,7 +2631,7 @@ function escapeField($field = null, $alias = null) {
$field = $this->primaryKey;
}
$db =& ConnectionManager::getDataSource($this->useDbConfig);
if (strpos($field, $db->name($alias)) === 0) {
if (strpos($field, $db->name($alias) . '.') === 0) {
return $field;
}
return $db->name($alias . '.' . $field);
@@ -24,6 +24,27 @@
* @license http://www.opensource.org/licenses/opengroup.php The Open Group Test Suite License
*/
require_once dirname(__FILE__) . DS . 'model.test.php';
App::import('Core', 'DboSource');
/**
* DboMock class
* A Dbo Source driver to mock a connection and a identity name() method
*/
class DboMock extends DboSource {
/**
* Returns the $field without modifications
*/
function name($field) {
return $field;
}
/**
* Returns true to fake a database connection
*/
function connect() {
return true;
}
}
/**
* ModelIntegrationTest
@@ -1831,5 +1852,36 @@ function testCreation() {
$this->assertEqual($FeaturedModel->create($data), $expected);
}
/**
* testEscapeField to prove it escapes the field well even when it has part of the alias on it
* @see ttp://cakephp.lighthouseapp.com/projects/42648-cakephp-1x/tickets/473-escapefield-doesnt-consistently-prepend-modelname
*
* @access public
* @return void
*/
function testEscapeField() {
$TestModel =& new Test();
$db =& $TestModel->getDataSource();
$result = $TestModel->escapeField('test_field');
$expected = $db->name('Test.test_field');
$this->assertEqual($result, $expected);
$result = $TestModel->escapeField('TestField');
$expected = $db->name('Test.TestField');
$this->assertEqual($result, $expected);
$result = $TestModel->escapeField('DomainHandle', 'Domain');
$expected = $db->name('Domain.DomainHandle');
$this->assertEqual($result, $expected);
ConnectionManager::create('mock', array('driver' => 'mock'));
$TestModel->setDataSource('mock');
$db =& $TestModel->getDataSource();
$result = $TestModel->escapeField('DomainHandle', 'Domain');
$expected = $db->name('Domain.DomainHandle');
$this->assertEqual($result, $expected);
}
}
?>

0 comments on commit 28cb57a

Please sign in to comment.
You can’t perform that action at this time.