Permalink
Browse files

Fixing issue baking controller tests.

During interactive controller baking, controller tests
would be generated with the wrong filename.
During interactive baking fixtures would not be detected.
Fixes #2052
  • Loading branch information...
1 parent adcb80b commit aae2b0c2572ed74fd0f41a8aafa7852c0d5973ba @markstory markstory committed Oct 3, 2011
@@ -116,18 +116,22 @@ protected function _interactive($type = null) {
* @return string|boolean
*/
public function bake($type, $className) {
- if ($this->typeCanDetectFixtures($type) && $this->isLoadableClass($type, $className)) {
+ $plugin = null;
+ if ($this->plugin) {
+ $plugin = $this->plugin . '.';
+ }
+
+ $realType = $this->mapType($type, $plugin);
+ $fullClassName = $this->getRealClassName($type, $className);
+
+ if ($this->typeCanDetectFixtures($type) && $this->isLoadableClass($realType, $fullClassName)) {
$this->out(__d('cake_console', 'Bake is detecting possible fixtures...'));
$testSubject = $this->buildTestSubject($type, $className);
$this->generateFixtureList($testSubject);
} elseif ($this->interactive) {
$this->getUserFixtures();
}
- $fullClassName = $className;
-
- if (!$this->interactive) {
- $fullClassName = $this->getRealClassName($type, $className);
- }
+ App::uses($fullClassName, $realType);
$methods = array();
if (class_exists($fullClassName)) {
@@ -136,15 +140,14 @@ public function bake($type, $className) {
$mock = $this->hasMockClass($type, $fullClassName);
$construction = $this->generateConstructor($type, $fullClassName);
- $plugin = null;
- if ($this->plugin) {
- $plugin = $this->plugin . '.';
- }
$this->out("\n" . __d('cake_console', 'Baking test case for %s %s ...', $className, $type), 1, Shell::QUIET);
$this->Template->set('fixtures', $this->_fixtures);
$this->Template->set('plugin', $plugin);
- $this->Template->set(compact('className', 'methods', 'type', 'fullClassName', 'mock', 'construction'));
+ $this->Template->set(compact(
+ 'className', 'methods', 'type', 'fullClassName', 'mock',
+ 'construction', 'realType'
+ ));
$out = $this->Template->generate('classes', 'test');
$filename = $this->testCaseFileName($type, $className);
@@ -223,18 +226,19 @@ public function getClassName($objectType) {
*/
public function typeCanDetectFixtures($type) {
$type = strtolower($type);
- return ($type == 'controller' || $type == 'model');
+ return in_array($type, array('controller', 'model'));
}
/**
- * Check if a class with the given type is loaded or can be loaded.
+ * Check if a class with the given package is loaded or can be loaded.
*
- * @param string $type The Type of object you are generating tests for eg. controller
+ * @param string $package The package of object you are generating tests for eg. controller
* @param string $class the Classname of the class the test is being generated for.
* @return boolean
*/
- public function isLoadableClass($type, $class) {
- return App::import($type, $class);
+ public function isLoadableClass($package, $class) {
+ App::uses($class, $package);
+ return class_exists($class);
}
/**
@@ -258,7 +262,8 @@ public function &buildTestSubject($type, $class) {
}
/**
- * Gets the real class name from the cake short form.
+ * Gets the real class name from the cake short form. If the class name is already
+ * suffixed with the type, the type will not be duplicated.
*
* @param string $type The Type of object you are generating tests for eg. controller
* @param string $class the Classname of the class the test is being generated for.
@@ -268,10 +273,32 @@ public function getRealClassName($type, $class) {
if (strtolower($type) == 'model' || empty($this->classTypes[$type])) {
return $class;
}
+ if (strlen($class) - strpos($class, $type) == strlen($type)) {
+ return $class;
+ }
return $class . $type;
}
/**
+ * Map the types that TestTask uses to concrete types that App::uses can use.
+ *
+ * @param string $type The type of thing having a test generated.
+ * @param string $plugin The plugin name.
+ * @return string
+ */
+ public function mapType($type, $plugin) {
+ $type = ucfirst($type);
+ if (empty($this->classTypes[$type])) {
+ throw new CakeException(__d('cake_dev', 'Invalid object type.'));
+ }
+ $real = $this->classTypes[$type];
+ if ($plugin) {
+ $real = trim($plugin, '.') . '.' . $real;
+ }
+ return $real;
+ }
+
+/**
* Get methods declared in the class given.
* No parent methods will be returned
*
@@ -429,9 +456,7 @@ public function testCaseFileName($type, $className) {
if (isset($this->classTypes[$type])) {
$path .= $this->classTypes[$type] . DS;
}
- if (!$this->interactive) {
- $className = $this->getRealClassName($type, $className);
- }
+ $className = $this->getRealClassName($type, $className);
return str_replace('/', DS, $path) . Inflector::camelize($className) . 'Test.php';
}
@@ -20,7 +20,7 @@
echo "<?php\n";
echo "/* ". $className ." Test cases generated on: " . date('Y-m-d H:i:s') . " : ". time() . "*/\n";
?>
-App::uses('<?php echo $fullClassName; ?>', '<?php echo $plugin . $type;?>');
+App::uses('<?php echo $fullClassName; ?>', '<?php echo $realType; ?>');
<?php if ($mock and strtolower($type) == 'controller'): ?>
/**
@@ -260,14 +260,14 @@ public function testFilePathGenerationModelRepeated() {
$file = TESTS . 'Case' . DS . 'Model' . DS . 'MyClassTest.php';
$this->Task->expects($this->at(1))->method('createFile')
- ->with($file, new PHPUnit_Framework_Constraint_IsAnything());
+ ->with($file, $this->anything());
$this->Task->expects($this->at(3))->method('createFile')
- ->with($file, new PHPUnit_Framework_Constraint_IsAnything());
+ ->with($file, $this->anything());
$file = TESTS . 'Case' . DS . 'Controller' . DS . 'CommentsControllerTest.php';
$this->Task->expects($this->at(5))->method('createFile')
- ->with($file, new PHPUnit_Framework_Constraint_IsAnything());
+ ->with($file, $this->anything());
$this->Task->bake('Model', 'MyClass');
$this->Task->bake('Model', 'MyClass');
@@ -401,12 +401,21 @@ public function testGetRealClassname() {
$result = $this->Task->getRealClassname('Controller', 'Posts');
$this->assertEqual($result, 'PostsController');
+ $result = $this->Task->getRealClassname('Controller', 'PostsController');
+ $this->assertEqual($result, 'PostsController');
+
$result = $this->Task->getRealClassname('Helper', 'Form');
$this->assertEqual($result, 'FormHelper');
+ $result = $this->Task->getRealClassname('Helper', 'FormHelper');
+ $this->assertEqual($result, 'FormHelper');
+
$result = $this->Task->getRealClassname('Behavior', 'Containable');
$this->assertEqual($result, 'ContainableBehavior');
+ $result = $this->Task->getRealClassname('Behavior', 'ContainableBehavior');
+ $this->assertEqual($result, 'ContainableBehavior');
+
$result = $this->Task->getRealClassname('Component', 'Auth');
$this->assertEqual($result, 'AuthComponent');
}
@@ -515,7 +524,7 @@ public function testBakeWithPlugin() {
CakePlugin::load('TestTest', array('path' => APP . 'Plugin' . DS . 'TestTest' . DS));
$path = APP . 'Plugin' . DS . 'TestTest' . DS . 'Test' . DS . 'Case' . DS . 'View' . DS . 'Helper' . DS .'FormHelperTest.php';
$this->Task->expects($this->once())->method('createFile')
- ->with($path, new PHPUnit_Framework_Constraint_IsAnything());
+ ->with($path, $this->anything());
$this->Task->bake('Helper', 'Form');
CakePlugin::unload();
@@ -599,7 +608,7 @@ public function testExecuteWithOneArg() {
$this->Task->expects($this->once())->method('isLoadableClass')->will($this->returnValue(true));
$this->Task->expects($this->once())->method('createFile')
->with(
- new PHPUnit_Framework_Constraint_IsAnything(),
+ $this->anything(),
$this->stringContains('class TestTaskTagTestCase extends CakeTestCase')
);
$this->Task->execute();
@@ -615,10 +624,41 @@ public function testExecuteWithTwoArgs() {
$this->Task->expects($this->at(0))->method('in')->will($this->returnValue('TestTaskTag'));
$this->Task->expects($this->once())->method('createFile')
->with(
- new PHPUnit_Framework_Constraint_IsAnything(),
+ $this->anything(),
$this->stringContains('class TestTaskTagTestCase extends CakeTestCase')
);
$this->Task->expects($this->any())->method('isLoadableClass')->will($this->returnValue(true));
$this->Task->execute();
}
+
+/**
+ * Data provider for mapType() tests.
+ *
+ * @return array
+ */
+ public static function mapTypeProvider() {
+ return array(
+ array('controller', null, 'Controller'),
+ array('Controller', null, 'Controller'),
+ array('component', null, 'Controller/Component'),
+ array('Component', null, 'Controller/Component'),
+ array('model', null, 'Model'),
+ array('Model', null, 'Model'),
+ array('behavior', null, 'Model/Behavior'),
+ array('Behavior', null, 'Model/Behavior'),
+ array('helper', null, 'View/Helper'),
+ array('Helper', null, 'View/Helper'),
+ array('Helper', 'DebugKit', 'DebugKit.View/Helper'),
+ );
+ }
+
+/**
+ * Test that mapType returns the correct package names.
+ *
+ * @dataProvider mapTypeProvider
+ * @return void
+ */
+ public function testMapType($original, $plugin, $expected) {
+ $this->assertEquals($expected, $this->Task->mapType($original, $plugin));
+ }
}

0 comments on commit aae2b0c

Please sign in to comment.