getMockBuilder('Cake\Http\ServerRequest')->getMock(); $response = $this->getMockBuilder('Cake\Http\Response')->getMock(); $this->View = new View($request, $response); } /** * tearDown method * * @return void */ public function tearDown() { parent::tearDown(); Plugin::unload('TestPlugin'); Plugin::unload('TestTheme'); unset($this->View); } /** * Tests basic cell rendering. * * @return void */ public function testCellRender() { $cell = $this->View->cell('Articles::teaserList'); $render = "{$cell}"; $this->assertEquals('teaser_list', $cell->template); $this->assertContains('

Lorem ipsum

', $render); $this->assertContains('

Usectetur adipiscing eli

', $render); $this->assertContains('

Topis semper blandit eu non

', $render); $this->assertContains('

Suspendisse gravida neque

', $render); $cell = $this->View->cell('Cello'); $this->assertInstanceOf('TestApp\View\Cell\CelloCell', $cell); $this->assertEquals("Cellos\n", $cell->render()); } /** * Test __toString() hitting an error when rendering views. * * @return void */ public function testCellImplictRenderWithError() { $capture = function ($errno, $msg) { restore_error_handler(); $this->assertEquals(E_USER_WARNING, $errno); $this->assertContains('Could not render cell - Cell view file', $msg); }; set_error_handler($capture); $cell = $this->View->cell('Articles::teaserList'); $cell->template = 'nope'; $result = "{$cell}"; } /** * Tests that we are able pass multiple arguments to cell methods. * * This test sets its own error handler, as PHPUnit won't convert * errors into exceptions when the caller is a __toString() method. * * @return void */ public function testCellWithArguments() { $cell = $this->View->cell('Articles::doEcho', ['msg1' => 'dummy', 'msg2' => ' message']); $render = "{$cell}"; $this->assertContains('dummy message', $render); } /** * Tests that cell runs default action when none is provided. * * @return void */ public function testDefaultCellAction() { $appCell = $this->View->cell('Articles'); $this->assertEquals('display', $appCell->template); $this->assertContains('dummy', "{$appCell}"); $pluginCell = $this->View->cell('TestPlugin.Dummy'); $this->assertContains('dummy', "{$pluginCell}"); $this->assertEquals('display', $pluginCell->template); } /** * Tests that cell action setting the template using the property renders the correct template * * @return void */ public function testSettingCellTemplateFromAction() { $appCell = $this->View->cell('Articles::customTemplate'); $this->assertContains('This is the alternate template', "{$appCell}"); $this->assertEquals('alternate_teaser_list', $appCell->template); $this->assertEquals('alternate_teaser_list', $appCell->viewBuilder()->getTemplate()); } /** * Tests that cell action setting the templatePath * * @return void */ public function testSettingCellTemplatePathFromAction() { $appCell = $this->View->cell('Articles::customTemplatePath'); $this->assertContains('Articles subdir custom_template_path template', "{$appCell}"); $this->assertEquals('custom_template_path', $appCell->template); $this->assertEquals('Cell/Articles/Subdir', $appCell->viewBuilder()->getTemplatePath()); } /** * Tests that cell action setting the template using the ViewBuilder renders the correct template * * @return void */ public function testSettingCellTemplateFromActionViewBuilder() { $appCell = $this->View->cell('Articles::customTemplateViewBuilder'); $this->assertContains('This is the alternate template', "{$appCell}"); $this->assertEquals('alternate_teaser_list', $appCell->viewBuilder()->getTemplate()); } /** * Tests manual render() invocation. * * @return void */ public function testCellManualRender() { $cell = $this->View->cell('Articles::doEcho', ['msg1' => 'dummy', 'msg2' => ' message']); $this->assertContains('dummy message', $cell->render()); $cell->teaserList(); $this->assertContains('

Lorem ipsum

', $cell->render('teaser_list')); } /** * Tests manual render() invocation with error * * @return void */ public function testCellManualRenderError() { $cell = $this->View->cell('Articles'); $e = null; try { $cell->render('derp'); } catch (MissingCellViewException $e) { } $this->assertNotNull($e); $this->assertEquals('Cell view file "derp" is missing.', $e->getMessage()); $this->assertInstanceOf(MissingTemplateException::class, $e->getPrevious()); } /** * Test rendering a cell with a theme. * * @return void */ public function testCellRenderThemed() { $this->View->theme = 'TestTheme'; $cell = $this->View->cell('Articles', ['msg' => 'hello world!']); $this->assertEquals($this->View->theme, $cell->viewBuilder()->getTheme()); $this->assertContains('Themed cell content.', $cell->render()); $this->assertEquals($cell->View->theme, $cell->viewBuilder()->getTheme()); } /** * Test that a cell can render a plugin view. * * @return void */ public function testCellRenderPluginTemplate() { $cell = $this->View->cell('Articles'); $this->assertContains( 'TestPlugin Articles/display', $cell->render('TestPlugin.display') ); $cell = $this->View->cell('Articles'); $cell->plugin = 'TestPlugin'; $this->assertContains( 'TestPlugin Articles/display', $cell->render('display') ); } /** * Tests that using plugin's cells works. * * @return void */ public function testPluginCell() { $cell = $this->View->cell('TestPlugin.Dummy::echoThis', ['msg' => 'hello world!']); $this->assertContains('hello world!', "{$cell}"); } /** * Tests that using namespaced cells works. * * @return void */ public function testNamespacedCell() { $cell = $this->View->cell('Admin/Menu'); $this->assertContains('Admin Menu Cell', $cell->render()); } /** * Tests that using namespaced cells in plugins works * * @return void */ public function testPluginNamespacedCell() { $cell = $this->View->cell('TestPlugin.Admin/Menu'); $this->assertContains('Test Plugin Admin Menu Cell', $cell->render()); } /** * Test that plugin cells can render other view templates. * * @return void */ public function testPluginCellAlternateTemplate() { $cell = $this->View->cell('TestPlugin.Dummy::echoThis', ['msg' => 'hello world!']); $cell->template = '../../Element/translate'; $this->assertContains('This is a translatable string', "{$cell}"); } /** * Test that plugin cells can render other view templates. * * @return void */ public function testPluginCellAlternateTemplateRenderParam() { $cell = $this->View->cell('TestPlugin.Dummy::echoThis', ['msg' => 'hello world!']); $result = $cell->render('../../Element/translate'); $this->assertContains('This is a translatable string', $result); } /** * Tests that using an non-existent cell throws an exception. * * @expectedException \Cake\View\Exception\MissingCellException * @return void */ public function testNonExistentCell() { $cell = $this->View->cell('TestPlugin.Void::echoThis', ['arg1' => 'v1']); $cell = $this->View->cell('Void::echoThis', ['arg1' => 'v1', 'arg2' => 'v2']); } /** * Tests missing method errors * * @expectedException \BadMethodCallException * @expectedExceptionMessage Class TestApp\View\Cell\ArticlesCell does not have a "nope" method. * @return void */ public function testCellMissingMethod() { $cell = $this->View->cell('Articles::nope'); $cell->render(); } /** * Test that cell options are passed on. * * @return void */ public function testCellOptions() { $cell = $this->View->cell('Articles', [], ['limit' => 10, 'nope' => 'nope']); $this->assertEquals(10, $cell->limit); $this->assertFalse(property_exists('nope', $cell), 'Not a valid option'); } /** * Test that cells get the helper configuration from the view that created them. * * @return void */ public function testCellInheritsHelperConfig() { $this->View->helpers = ['Url', 'Form', 'Banana']; $cell = $this->View->cell('Articles'); $this->assertSame($this->View->helpers, $cell->helpers); } /** * Test that cells the view class name of a custom view passed on. * * @return void */ public function testCellInheritsCustomViewClass() { $request = $this->getMockBuilder('Cake\Http\ServerRequest')->getMock(); $response = $this->getMockBuilder('Cake\Http\Response')->getMock(); $view = new CustomJsonView($request, $response); $view->theme = 'Pretty'; $cell = $view->cell('Articles'); $this->assertSame('TestApp\View\CustomJsonView', $cell->viewClass); $this->assertSame('TestApp\View\CustomJsonView', $cell->viewBuilder()->getClassName()); $this->assertSame('Pretty', $cell->viewBuilder()->getTheme()); } /** * Test that cells the view class name of a controller passed on. * * @return void */ public function testCellInheritsController() { $request = $this->getMockBuilder('Cake\Http\ServerRequest')->getMock(); $response = $this->getMockBuilder('Cake\Http\Response')->getMock(); $controller = new CellTraitTestController($request, $response); $controller->viewBuilder()->setTheme('Pretty'); $controller->viewClass = 'Json'; $cell = $controller->cell('Articles'); $this->assertSame('Json', $cell->viewClass); $this->assertSame('Json', $cell->viewBuilder()->getClassName()); $this->assertSame('Pretty', $cell->viewBuilder()->getTheme()); } /** * Test cached render. * * @return void */ public function testCachedRenderSimple() { $mock = $this->getMockBuilder('Cake\Cache\CacheEngine')->getMock(); $mock->method('init') ->will($this->returnValue(true)); $mock->method('read') ->will($this->returnValue(false)); $mock->expects($this->once()) ->method('write') ->with('cell_test_app_view_cell_articles_cell_display_default', "dummy\n"); Cache::setConfig('default', $mock); $cell = $this->View->cell('Articles', [], ['cache' => true]); $result = $cell->render(); $this->assertEquals("dummy\n", $result); Cache::drop('default'); } /** * Test read cached cell. * * @return void */ public function testReadCachedCell() { $mock = $this->getMockBuilder('Cake\Cache\CacheEngine')->getMock(); $mock->method('init') ->will($this->returnValue(true)); $mock->method('read') ->will($this->returnValue("dummy\n")); $mock->expects($this->never()) ->method('write'); Cache::setConfig('default', $mock); $cell = $this->View->cell('Articles', [], ['cache' => true]); $result = $cell->render(); $this->assertEquals("dummy\n", $result); Cache::drop('default'); } /** * Test cached render array config * * @return void */ public function testCachedRenderArrayConfig() { $mock = $this->getMockBuilder('Cake\Cache\CacheEngine')->getMock(); $mock->method('init') ->will($this->returnValue(true)); $mock->method('read') ->will($this->returnValue(false)); $mock->expects($this->once()) ->method('write') ->with('my_key', "dummy\n"); Cache::setConfig('cell', $mock); $cell = $this->View->cell('Articles', [], [ 'cache' => ['key' => 'my_key', 'config' => 'cell'] ]); $result = $cell->render(); $this->assertEquals("dummy\n", $result); Cache::drop('cell'); } /** * Test cached render when using an action changing the template used * * @return void */ public function testCachedRenderSimpleCustomTemplate() { $mock = $this->getMockBuilder('Cake\Cache\CacheEngine')->getMock(); $mock->method('init') ->will($this->returnValue(true)); $mock->method('read') ->will($this->returnValue(false)); $mock->expects($this->once()) ->method('write') ->with('cell_test_app_view_cell_articles_cell_customTemplate_default', "

This is the alternate template

\n"); Cache::setConfig('default', $mock); $cell = $this->View->cell('Articles::customTemplate', [], ['cache' => true]); $result = $cell->render(); $this->assertContains('This is the alternate template', $result); Cache::drop('default'); } /** * Test that when the cell cache is enabled, the cell action is only invoke the first * time the cell is rendered * * @return void */ public function testCachedRenderSimpleCustomTemplateViewBuilder() { Cache::setConfig('default', [ 'className' => 'File', 'path' => CACHE, ]); $cell = $this->View->cell('Articles::customTemplateViewBuilder', [], ['cache' => ['key' => 'celltest']]); $result = $cell->render(); $this->assertEquals(1, $cell->counter); $cell->render(); $this->assertEquals(1, $cell->counter); $this->assertContains('This is the alternate template', $result); Cache::delete('celltest'); Cache::drop('default'); } /** * Test that when the cell cache is enabled, the cell action is only invoke the first * time the cell is rendered * * @return void */ public function testACachedViewCellReRendersWhenGivenADifferentTemplate() { Cache::setConfig('default', [ 'className' => 'File', 'path' => CACHE, ]); $cell = $this->View->cell('Articles::customTemplateViewBuilder', [], ['cache' => true]); $result = $cell->render('alternate_teaser_list'); $result2 = $cell->render('not_the_alternate_teaser_list'); $this->assertContains('This is the alternate template', $result); $this->assertContains('This is NOT the alternate template', $result2); Cache::delete('celltest'); Cache::drop('default'); } }