array( 'className' => 'TestTask.TestTaskComment', 'foreignKey' => 'article_id', ) ); /** * Has and Belongs To Many Associations * * @var array */ public $hasAndBelongsToMany = array( 'Tag' => array( 'className' => 'TestTaskTag', 'joinTable' => 'articles_tags', 'foreignKey' => 'article_id', 'associationForeignKey' => 'tag_id' ) ); /** * Example public method * * @return void */ public function doSomething() { } /** * Example Secondary public method * * @return void */ public function doSomethingElse() { } /** * Example protected method * * @return void */ protected function _innerMethod() { } } /** * Tag Testing Model * * @package Cake.Test.Case.Console.Command.Task */ class TestTaskTag extends Model { /** * Table name * * @var string */ public $useTable = 'tags'; /** * Has and Belongs To Many Associations * * @var array */ public $hasAndBelongsToMany = array( 'Article' => array( 'className' => 'TestTaskArticle', 'joinTable' => 'articles_tags', 'foreignKey' => 'tag_id', 'associationForeignKey' => 'article_id' ) ); } /** * Simulated plugin * * @package Cake.Test.Case.Console.Command.Task */ class TestTaskAppModel extends Model { } /** * Testing AppMode (TaskComment) * * @package Cake.Test.Case.Console.Command.Task */ class TestTaskComment extends TestTaskAppModel { /** * Table name * * @var string */ public $useTable = 'comments'; /** * Belongs To Associations * * @var array */ public $belongsTo = array( 'Article' => array( 'className' => 'TestTaskArticle', 'foreignKey' => 'article_id', ) ); } /** * Test Task Comments Controller * * @package Cake.Test.Case.Console.Command.Task */ class TestTaskCommentsController extends Controller { /** * Models to use * * @var array */ public $uses = array('TestTaskComment', 'TestTaskTag'); } /** * TestTaskTest class * * @package Cake.Test.Case.Console.Command.Task */ class TestTaskTest extends CakeTestCase { /** * Fixtures * * @var string */ public $fixtures = array('core.article', 'core.comment', 'core.articles_tag', 'core.tag'); /** * setUp method * * @return void */ public function setUp() { parent::setUp(); $out = $this->getMock('ConsoleOutput', array(), array(), '', false); $in = $this->getMock('ConsoleInput', array(), array(), '', false); $this->Task = $this->getMock('TestTask', array('in', 'err', 'createFile', '_stop', 'isLoadableClass'), array($out, $out, $in) ); $this->Task->name = 'Test'; $this->Task->Template = new TemplateTask($out, $out, $in); } /** * tearDown method * * @return void */ public function tearDown() { parent::tearDown(); unset($this->Task); CakePlugin::unload(); } /** * Test that file path generation doesn't continuously append paths. * * @return void */ public function testFilePathGenerationModelRepeated() { $this->Task->expects($this->never())->method('err'); $this->Task->expects($this->never())->method('_stop'); $file = TESTS . 'Case' . DS . 'Model' . DS . 'MyClassTest.php'; $this->Task->expects($this->at(1))->method('createFile') ->with($file, $this->anything()); $this->Task->expects($this->at(3))->method('createFile') ->with($file, $this->anything()); $file = TESTS . 'Case' . DS . 'Controller' . DS . 'CommentsControllerTest.php'; $this->Task->expects($this->at(5))->method('createFile') ->with($file, $this->anything()); $this->Task->bake('Model', 'MyClass'); $this->Task->bake('Model', 'MyClass'); $this->Task->bake('Controller', 'Comments'); } /** * Test that method introspection pulls all relevant non parent class * methods into the test case. * * @return void */ public function testMethodIntrospection() { $result = $this->Task->getTestableMethods('TestTaskArticle'); $expected = array('dosomething', 'dosomethingelse'); $this->assertEquals($expected, array_map('strtolower', $result)); } /** * test that the generation of fixtures works correctly. * * @return void */ public function testFixtureArrayGenerationFromModel() { $subject = ClassRegistry::init('TestTaskArticle'); $result = $this->Task->generateFixtureList($subject); $expected = array('plugin.test_task.test_task_comment', 'app.articles_tags', 'app.test_task_article', 'app.test_task_tag'); $this->assertEquals(sort($expected), sort($result)); } /** * test that the generation of fixtures works correctly. * * @return void */ public function testFixtureArrayGenerationFromController() { $subject = new TestTaskCommentsController(); $result = $this->Task->generateFixtureList($subject); $expected = array('plugin.test_task.test_task_comment', 'app.articles_tags', 'app.test_task_article', 'app.test_task_tag'); $this->assertEquals(sort($expected), sort($result)); } /** * test user interaction to get object type * * @return void */ public function testGetObjectType() { $this->Task->expects($this->once())->method('_stop'); $this->Task->expects($this->at(0))->method('in')->will($this->returnValue('q')); $this->Task->expects($this->at(2))->method('in')->will($this->returnValue(2)); $this->Task->getObjectType(); $result = $this->Task->getObjectType(); $this->assertEquals($this->Task->classTypes['Controller'], $result); } /** * creating test subjects should clear the registry so the registry is always fresh * * @return void */ public function testRegistryClearWhenBuildingTestObjects() { ClassRegistry::flush(); $model = ClassRegistry::init('TestTaskComment'); $model->bindModel(array( 'belongsTo' => array( 'Random' => array( 'className' => 'TestTaskArticle', 'foreignKey' => 'article_id', ) ) )); $keys = ClassRegistry::keys(); $this->assertTrue(in_array('test_task_comment', $keys)); $this->Task->buildTestSubject('Model', 'TestTaskComment'); $keys = ClassRegistry::keys(); $this->assertFalse(in_array('random', $keys)); } /** * test that getClassName returns the user choice as a class name. * * @return void */ public function testGetClassName() { $objects = App::objects('model'); $this->skipIf(empty($objects), 'No models in app.'); $this->Task->expects($this->at(0))->method('in')->will($this->returnValue('MyCustomClass')); $this->Task->expects($this->at(1))->method('in')->will($this->returnValue(1)); $result = $this->Task->getClassName('Model'); $this->assertEquals('MyCustomClass', $result); $result = $this->Task->getClassName('Model'); $options = App::objects('model'); $this->assertEquals($options[0], $result); } /** * Test the user interaction for defining additional fixtures. * * @return void */ public function testGetUserFixtures() { $this->Task->expects($this->at(0))->method('in')->will($this->returnValue('y')); $this->Task->expects($this->at(1))->method('in') ->will($this->returnValue('app.pizza, app.topping, app.side_dish')); $result = $this->Task->getUserFixtures(); $expected = array('app.pizza', 'app.topping', 'app.side_dish'); $this->assertEquals($expected, $result); } /** * test that resolving class names works * * @return void */ public function testGetRealClassname() { $result = $this->Task->getRealClassname('Model', 'Post'); $this->assertEquals('Post', $result); $result = $this->Task->getRealClassname('Controller', 'Posts'); $this->assertEquals('PostsController', $result); $result = $this->Task->getRealClassname('Controller', 'PostsController'); $this->assertEquals('PostsController', $result); $result = $this->Task->getRealClassname('Controller', 'AlertTypes'); $this->assertEquals('AlertTypesController', $result); $result = $this->Task->getRealClassname('Helper', 'Form'); $this->assertEquals('FormHelper', $result); $result = $this->Task->getRealClassname('Helper', 'FormHelper'); $this->assertEquals('FormHelper', $result); $result = $this->Task->getRealClassname('Behavior', 'Containable'); $this->assertEquals('ContainableBehavior', $result); $result = $this->Task->getRealClassname('Behavior', 'ContainableBehavior'); $this->assertEquals('ContainableBehavior', $result); $result = $this->Task->getRealClassname('Component', 'Auth'); $this->assertEquals('AuthComponent', $result); } /** * test baking files. The conditionally run tests are known to fail in PHP4 * as PHP4 class names are all lower case, breaking the plugin path inflection. * * @return void */ public function testBakeModelTest() { $this->Task->expects($this->once())->method('createFile')->will($this->returnValue(true)); $this->Task->expects($this->once())->method('isLoadableClass')->will($this->returnValue(true)); $result = $this->Task->bake('Model', 'TestTaskArticle'); $this->assertContains("App::uses('TestTaskArticle', 'Model')", $result); $this->assertContains('class TestTaskArticleTest extends CakeTestCase', $result); $this->assertContains('function setUp()', $result); $this->assertContains("\$this->TestTaskArticle = ClassRegistry::init('TestTaskArticle')", $result); $this->assertContains('function tearDown()', $result); $this->assertContains('unset($this->TestTaskArticle)', $result); $this->assertContains('function testDoSomething()', $result); $this->assertContains('function testDoSomethingElse()', $result); $this->assertContains("'app.test_task_article'", $result); $this->assertContains("'app.test_task_comment'", $result); $this->assertContains("'app.test_task_tag'", $result); $this->assertContains("'app.articles_tag'", $result); } /** * test baking controller test files * * @return void */ public function testBakeControllerTest() { $this->Task->expects($this->once())->method('createFile')->will($this->returnValue(true)); $this->Task->expects($this->once())->method('isLoadableClass')->will($this->returnValue(true)); $result = $this->Task->bake('Controller', 'TestTaskComments'); $this->assertContains("App::uses('TestTaskCommentsController', 'Controller')", $result); $this->assertContains('class TestTaskCommentsControllerTest extends ControllerTestCase', $result); $this->assertNotContains('function setUp()', $result); $this->assertNotContains("\$this->TestTaskComments = new TestTaskCommentsController()", $result); $this->assertNotContains("\$this->TestTaskComments->constructClasses()", $result); $this->assertNotContains('function tearDown()', $result); $this->assertNotContains('unset($this->TestTaskComments)', $result); $this->assertContains("'app.test_task_article'", $result); $this->assertContains("'app.test_task_comment'", $result); $this->assertContains("'app.test_task_tag'", $result); $this->assertContains("'app.articles_tag'", $result); } /** * test baking component test files, * * @return void */ public function testBakeComponentTest() { $this->Task->expects($this->once())->method('createFile')->will($this->returnValue(true)); $result = $this->Task->bake('Component', 'Example'); $this->assertContains("App::uses('Component', 'Controller')", $result); $this->assertContains("App::uses('ComponentCollection', 'Controller')", $result); $this->assertContains("App::uses('ExampleComponent', 'Controller/Component')", $result); $this->assertContains('class ExampleComponentTest extends CakeTestCase', $result); $this->assertContains('function setUp()', $result); $this->assertContains("\$Collection = new ComponentCollection()", $result); $this->assertContains("\$this->Example = new ExampleComponent(\$Collection)", $result); $this->assertContains('function tearDown()', $result); $this->assertContains('unset($this->Example)', $result); } /** * test baking behavior test files, * * @return void */ public function testBakeBehaviorTest() { $this->Task->expects($this->once())->method('createFile')->will($this->returnValue(true)); $result = $this->Task->bake('Behavior', 'Example'); $this->assertContains("App::uses('ExampleBehavior', 'Model/Behavior')", $result); $this->assertContains('class ExampleBehaviorTest extends CakeTestCase', $result); $this->assertContains('function setUp()', $result); $this->assertContains("\$this->Example = new ExampleBehavior()", $result); $this->assertContains('function tearDown()', $result); $this->assertContains('unset($this->Example)', $result); } /** * test baking helper test files, * * @return void */ public function testBakeHelperTest() { $this->Task->expects($this->once())->method('createFile')->will($this->returnValue(true)); $result = $this->Task->bake('Helper', 'Example'); $this->assertContains("App::uses('ExampleHelper', 'View/Helper')", $result); $this->assertContains('class ExampleHelperTest extends CakeTestCase', $result); $this->assertContains('function setUp()', $result); $this->assertContains("\$View = new View()", $result); $this->assertContains("\$this->Example = new ExampleHelper(\$View)", $result); $this->assertContains('function tearDown()', $result); $this->assertContains('unset($this->Example)', $result); } /** * test Constructor generation ensure that constructClasses is called for controllers * * @return void */ public function testGenerateConstructor() { $result = $this->Task->generateConstructor('controller', 'PostsController', null); $expected = array('', '', ''); $this->assertEquals($expected, $result); $result = $this->Task->generateConstructor('model', 'Post', null); $expected = array('', "ClassRegistry::init('Post');\n", ''); $this->assertEquals($expected, $result); $result = $this->Task->generateConstructor('helper', 'FormHelper', null); $expected = array("\$View = new View();\n", "new FormHelper(\$View);\n", ''); $this->assertEquals($expected, $result); } /** * Test generateUses() */ public function testGenerateUses() { $result = $this->Task->generateUses('model', 'Model', 'Post'); $expected = array( array('Post', 'Model') ); $this->assertEquals($expected, $result); $result = $this->Task->generateUses('controller', 'Controller', 'PostsController'); $expected = array( array('PostsController', 'Controller') ); $this->assertEquals($expected, $result); $result = $this->Task->generateUses('helper', 'View/Helper', 'FormHelper'); $expected = array( array('View', 'View'), array('Helper', 'View'), array('FormHelper', 'View/Helper'), ); $this->assertEquals($expected, $result); $result = $this->Task->generateUses('component', 'Controller/Component', 'AuthComponent'); $expected = array( array('ComponentCollection', 'Controller'), array('Component', 'Controller'), array('AuthComponent', 'Controller/Component') ); $this->assertEquals($expected, $result); } /** * Test that mock class generation works for the appropriate classes * * @return void */ public function testMockClassGeneration() { $result = $this->Task->hasMockClass('controller'); $this->assertTrue($result); } /** * test bake() with a -plugin param * * @return void */ public function testBakeWithPlugin() { $this->Task->plugin = 'TestTest'; //fake plugin path 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, $this->anything()); $this->Task->bake('Helper', 'Form'); CakePlugin::unload(); } /** * test interactive with plugins lists from the plugin * * @return void */ public function testInteractiveWithPlugin() { $testApp = CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS; App::build(array( 'Plugin' => array($testApp) ), App::RESET); CakePlugin::load('TestPlugin'); $this->Task->plugin = 'TestPlugin'; $path = $testApp . 'TestPlugin' . DS . 'Test' . DS . 'Case' . DS . 'View' . DS . 'Helper' . DS . 'OtherHelperTest.php'; $this->Task->expects($this->any()) ->method('in') ->will($this->onConsecutiveCalls( 5, //helper 1 //OtherHelper )); $this->Task->expects($this->once()) ->method('createFile') ->with($path, $this->anything()); $this->Task->stdout->expects($this->at(21)) ->method('write') ->with('1. OtherHelperHelper'); $this->Task->execute(); } public static function caseFileNameProvider() { return array( array('Model', 'Post', 'Case' . DS . 'Model' . DS . 'PostTest.php'), array('Helper', 'Form', 'Case' . DS . 'View' . DS . 'Helper' . DS . 'FormHelperTest.php'), array('Controller', 'Posts', 'Case' . DS . 'Controller' . DS . 'PostsControllerTest.php'), array('Behavior', 'Containable', 'Case' . DS . 'Model' . DS . 'Behavior' . DS . 'ContainableBehaviorTest.php'), array('Component', 'Auth', 'Case' . DS . 'Controller' . DS . 'Component' . DS . 'AuthComponentTest.php'), array('model', 'Post', 'Case' . DS . 'Model' . DS . 'PostTest.php'), array('helper', 'Form', 'Case' . DS . 'View' . DS . 'Helper' . DS . 'FormHelperTest.php'), array('controller', 'Posts', 'Case' . DS . 'Controller' . DS . 'PostsControllerTest.php'), array('behavior', 'Containable', 'Case' . DS . 'Model' . DS . 'Behavior' . DS . 'ContainableBehaviorTest.php'), array('component', 'Auth', 'Case' . DS . 'Controller' . DS . 'Component' . DS . 'AuthComponentTest.php'), ); } /** * Test filename generation for each type + plugins * * @dataProvider caseFileNameProvider * @return void */ public function testTestCaseFileName($type, $class, $expected) { $this->Task->path = DS . 'my' . DS . 'path' . DS . 'tests' . DS; $result = $this->Task->testCaseFileName($type, $class); $expected = $this->Task->path . $expected; $this->assertEquals($expected, $result); } /** * Test filename generation for plugins. * * @return void */ public function testTestCaseFileNamePlugin() { $this->Task->path = DS . 'my' . DS . 'path' . DS . 'tests' . DS; CakePlugin::load('TestTest', array('path' => APP . 'Plugin' . DS . 'TestTest' . DS)); $this->Task->plugin = 'TestTest'; $result = $this->Task->testCaseFileName('Model', 'Post'); $expected = APP . 'Plugin' . DS . 'TestTest' . DS . 'Test' . DS . 'Case' . DS . 'Model' . DS . 'PostTest.php'; $this->assertEquals($expected, $result); } /** * test execute with a type defined * * @return void */ public function testExecuteWithOneArg() { $this->Task->args[0] = 'Model'; $this->Task->expects($this->at(0))->method('in')->will($this->returnValue('TestTaskTag')); $this->Task->expects($this->once())->method('isLoadableClass')->will($this->returnValue(true)); $this->Task->expects($this->once())->method('createFile') ->with( $this->anything(), $this->stringContains('class TestTaskTagTest extends CakeTestCase') ); $this->Task->execute(); } /** * test execute with type and class name defined * * @return void */ public function testExecuteWithTwoArgs() { $this->Task->args = array('Model', 'TestTaskTag'); $this->Task->expects($this->at(0))->method('in')->will($this->returnValue('TestTaskTag')); $this->Task->expects($this->once())->method('createFile') ->with( $this->anything(), $this->stringContains('class TestTaskTagTest extends CakeTestCase') ); $this->Task->expects($this->any())->method('isLoadableClass')->will($this->returnValue(true)); $this->Task->execute(); } /** * test execute with type and class name defined and lower case. * * @return void */ public function testExecuteWithTwoArgsLowerCase() { $this->Task->args = array('model', 'TestTaskTag'); $this->Task->expects($this->at(0))->method('in')->will($this->returnValue('TestTaskTag')); $this->Task->expects($this->once())->method('createFile') ->with( $this->anything(), $this->stringContains('class TestTaskTagTest 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)); } }