* Copyright 2006-2010, Cake Software Foundation, Inc. * * Licensed under The MIT License * Redistributions of files must retain the above copyright notice * * @copyright Copyright 2006-2010, Cake Software Foundation, Inc. * @link http://book.cakephp.org/view/1196/Testing CakePHP(tm) Tests * @package cake * @subpackage cake.tests.cases.libs.view.helpers * @since CakePHP(tm) v 1.2.0.4206 * @license MIT License (http://www.opensource.org/licenses/mit-license.php) */ App::import('Core', array('Helper', 'AppHelper', 'ClassRegistry', 'Controller')); App::import('Helper', array('Html', 'Form')); if (!defined('FULL_BASE_URL')) { define('FULL_BASE_URL', 'http://cakephp.org'); } /** * TheHtmlTestController class * * @package cake * @subpackage cake.tests.cases.libs.view.helpers */ class TheHtmlTestController extends Controller { /** * name property * * @var string 'TheTest' * @access public */ public $name = 'TheTest'; /** * uses property * * @var mixed null * @access public */ public $uses = null; } /** * HtmlHelperTest class * * @package cake * @subpackage cake.tests.cases.libs.view.helpers */ class HtmlHelperTest extends CakeTestCase { /** * Regexp for CDATA start block * * @var string */ public $cDataStart = 'preg:/^\/\/[\s\r\n]*/'; /** * html property * * @var object * @access public */ public $Html = null; /** * setUp method * * @return void */ function setUp() { parent::setUp(); $this->View = $this->getMock('View', array('addScript'), array(new TheHtmlTestController())); $this->Html = new HtmlHelper($this->View); $this->Html->request = new CakeRequest(null, false); $this->Html->request->webroot = ''; Configure::write('Asset.timestamp', false); } /** * tearDown method * * @return void */ function tearDown() { parent::tearDown(); unset($this->Html, $this->View); } /** * testDocType method * * @access public * @return void */ function testDocType() { $result = $this->Html->docType(); $expected = ''; $this->assertEqual($result, $expected); $result = $this->Html->docType('html4-strict'); $expected = ''; $this->assertEqual($result, $expected); $this->assertNull($this->Html->docType('non-existing-doctype')); } /** * testLink method * * @access public * @return void */ function testLink() { $this->Html->request->webroot = ''; $result = $this->Html->link('/home'); $expected = array('a' => array('href' => '/home'), 'preg:/\/home/', '/a'); $this->assertTags($result, $expected); $result = $this->Html->link('Posts', array('controller' => 'posts', 'action' => 'index', 'full_base' => true)); $expected = array('a' => array('href' => FULL_BASE_URL . '/posts'), 'Posts', '/a'); $this->assertTags($result, $expected); $result = $this->Html->link('Home', '/home', array('confirm' => 'Are you sure you want to do this?')); $expected = array( 'a' => array('href' => '/home', 'onclick' => 'return confirm('Are you sure you want to do this?');'), 'Home', '/a' ); $this->assertTags($result, $expected, true); $result = $this->Html->link('Home', '/home', array('default' => false)); $expected = array( 'a' => array('href' => '/home', 'onclick' => 'event.returnValue = false; return false;'), 'Home', '/a' ); $this->assertTags($result, $expected); $result = $this->Html->link('Next >', '#'); $expected = array( 'a' => array('href' => '#'), 'Next >', '/a' ); $this->assertTags($result, $expected); $result = $this->Html->link('Next >', '#', array('escape' => true)); $expected = array( 'a' => array('href' => '#'), 'Next >', '/a' ); $this->assertTags($result, $expected); $result = $this->Html->link('Next >', '#', array('escape' => 'utf-8')); $expected = array( 'a' => array('href' => '#'), 'Next >', '/a' ); $this->assertTags($result, $expected); $result = $this->Html->link('Next >', '#', array('escape' => false)); $expected = array( 'a' => array('href' => '#'), 'Next >', '/a' ); $this->assertTags($result, $expected); $result = $this->Html->link('Next >', '#', array( 'title' => 'to escape … or not escape?', 'escape' => false )); $expected = array( 'a' => array('href' => '#', 'title' => 'to escape … or not escape?'), 'Next >', '/a' ); $this->assertTags($result, $expected); $result = $this->Html->link('Next >', '#', array( 'title' => 'to escape … or not escape?', 'escape' => true )); $expected = array( 'a' => array('href' => '#', 'title' => 'to escape &#8230; or not escape?'), 'Next >', '/a' ); $this->assertTags($result, $expected); $result = $this->Html->link('Original size', array( 'controller' => 'images', 'action' => 'view', 3, '?' => array('height' => 100, 'width' => 200) )); $expected = array( 'a' => array('href' => '/images/view/3?height=100&width=200'), 'Original size', '/a' ); $this->assertTags($result, $expected); Configure::write('Asset.timestamp', false); $result = $this->Html->link($this->Html->image('test.gif'), '#', array('escape' => false)); $expected = array( 'a' => array('href' => '#'), 'img' => array('src' => 'img/test.gif', 'alt' => ''), '/a' ); $this->assertTags($result, $expected); $result = $this->Html->image('test.gif', array('url' => '#')); $expected = array( 'a' => array('href' => '#'), 'img' => array('src' => 'img/test.gif', 'alt' => ''), '/a' ); $this->assertTags($result, $expected); Configure::write('Asset.timestamp', 'force'); $result = $this->Html->link($this->Html->image('test.gif'), '#', array('escape' => false)); $expected = array( 'a' => array('href' => '#'), 'img' => array('src' => 'preg:/img\/test\.gif\?\d*/', 'alt' => ''), '/a' ); $this->assertTags($result, $expected); $result = $this->Html->image('test.gif', array('url' => '#')); $expected = array( 'a' => array('href' => '#'), 'img' => array('src' => 'preg:/img\/test\.gif\?\d*/', 'alt' => ''), '/a' ); $this->assertTags($result, $expected); } /** * testImageTag method * * @access public * @return void */ function testImageTag() { $this->Html->request->webroot = ''; $result = $this->Html->image('test.gif'); $this->assertTags($result, array('img' => array('src' => 'img/test.gif', 'alt' => ''))); $result = $this->Html->image('http://google.com/logo.gif'); $this->assertTags($result, array('img' => array('src' => 'http://google.com/logo.gif', 'alt' => ''))); $result = $this->Html->image(array('controller' => 'test', 'action' => 'view', 1, 'ext' => 'gif')); $this->assertTags($result, array('img' => array('src' => '/test/view/1.gif', 'alt' => ''))); $result = $this->Html->image('/test/view/1.gif'); $this->assertTags($result, array('img' => array('src' => '/test/view/1.gif', 'alt' => ''))); } /** * test image() with Asset.timestamp * * @return void */ function testImageWithTimestampping() { Configure::write('Asset.timestamp', 'force'); $this->Html->request->webroot = '/'; $result = $this->Html->image('cake.icon.png'); $this->assertTags($result, array('img' => array('src' => 'preg:/\/img\/cake\.icon\.png\?\d+/', 'alt' => ''))); Configure::write('debug', 0); Configure::write('Asset.timestamp', 'force'); $result = $this->Html->image('cake.icon.png'); $this->assertTags($result, array('img' => array('src' => 'preg:/\/img\/cake\.icon\.png\?\d+/', 'alt' => ''))); $this->Html->request->webroot = '/testing/longer/'; $result = $this->Html->image('cake.icon.png'); $expected = array( 'img' => array('src' => 'preg:/\/testing\/longer\/img\/cake\.icon\.png\?[0-9]+/', 'alt' => '') ); $this->assertTags($result, $expected); } /** * Tests creation of an image tag using a theme and asset timestamping * * @access public * @return void * @link https://trac.cakephp.org/ticket/6490 */ function testImageTagWithTheme() { if ($this->skipIf(!is_writable(WWW_ROOT . 'theme'), 'Cannot write to webroot/theme')) { return; } App::import('Core', 'File'); $testfile = WWW_ROOT . 'theme' . DS . 'test_theme' . DS . 'img' . DS . '__cake_test_image.gif'; $file = new File($testfile, true); App::build(array( 'views' => array(TEST_CAKE_CORE_INCLUDE_PATH . 'tests' . DS . 'test_app' . DS . 'views'. DS) )); Configure::write('Asset.timestamp', true); Configure::write('debug', 1); $this->Html->request->webroot = '/'; $this->Html->theme = 'test_theme'; $result = $this->Html->image('__cake_test_image.gif'); $this->assertTags($result, array( 'img' => array( 'src' => 'preg:/\/theme\/test_theme\/img\/__cake_test_image\.gif\?\d+/', 'alt' => '' ))); $this->Html->request->webroot = '/testing/'; $result = $this->Html->image('__cake_test_image.gif'); $this->assertTags($result, array( 'img' => array( 'src' => 'preg:/\/testing\/theme\/test_theme\/img\/__cake_test_image\.gif\?\d+/', 'alt' => '' ))); $dir = new Folder(WWW_ROOT . 'theme' . DS . 'test_theme'); $dir->delete(); } /** * test theme assets in main webroot path * * @access public * @return void */ function testThemeAssetsInMainWebrootPath() { App::build(array( 'views' => array(TEST_CAKE_CORE_INCLUDE_PATH . 'tests' . DS . 'test_app' . DS . 'views'. DS) )); $webRoot = Configure::read('App.www_root'); Configure::write('App.www_root', TEST_CAKE_CORE_INCLUDE_PATH . 'tests' . DS . 'test_app' . DS . 'webroot' . DS); $this->Html->theme = 'test_theme'; $result = $this->Html->css('webroot_test'); $expected = array( 'link' => array('rel' => 'stylesheet', 'type' => 'text/css', 'href' => 'preg:/.*theme\/test_theme\/css\/webroot_test\.css/') ); $this->assertTags($result, $expected); $this->Html->theme = 'test_theme'; $result = $this->Html->css('theme_webroot'); $expected = array( 'link' => array('rel' => 'stylesheet', 'type' => 'text/css', 'href' => 'preg:/.*theme\/test_theme\/css\/theme_webroot\.css/') ); $this->assertTags($result, $expected); Configure::write('App.www_root', $webRoot); } /** * testStyle method * * @access public * @return void */ function testStyle() { $result = $this->Html->style(array('display'=> 'none', 'margin'=>'10px')); $expected = 'display:none; margin:10px;'; $this->assertPattern('/^display\s*:\s*none\s*;\s*margin\s*:\s*10px\s*;?$/', $expected); $result = $this->Html->style(array('display'=> 'none', 'margin'=>'10px'), false); $lines = explode("\n", $result); $this->assertPattern('/^\s*display\s*:\s*none\s*;\s*$/', $lines[0]); $this->assertPattern('/^\s*margin\s*:\s*10px\s*;?$/', $lines[1]); } /** * testCssLink method * * @access public * @return void */ function testCssLink() { Configure::write('Asset.filter.css', false); $result = $this->Html->css('screen'); $expected = array( 'link' => array('rel' => 'stylesheet', 'type' => 'text/css', 'href' => 'preg:/.*css\/screen\.css/') ); $this->assertTags($result, $expected); $result = $this->Html->css('screen.css'); $this->assertTags($result, $expected); $result = $this->Html->css('my.css.library'); $expected['link']['href'] = 'preg:/.*css\/my\.css\.library\.css/'; $this->assertTags($result, $expected); $result = $this->Html->css('screen.css?1234'); $expected['link']['href'] = 'preg:/.*css\/screen\.css\?1234/'; $this->assertTags($result, $expected); $result = $this->Html->css('http://whatever.com/screen.css?1234'); $expected['link']['href'] = 'preg:/http:\/\/.*\/screen\.css\?1234/'; $this->assertTags($result, $expected); Configure::write('Asset.filter.css', 'css.php'); $result = $this->Html->css('cake.generic'); $expected['link']['href'] = 'preg:/.*ccss\/cake\.generic\.css/'; $this->assertTags($result, $expected); Configure::write('Asset.filter.css', false); $result = explode("\n", trim($this->Html->css(array('cake.generic', 'vendor.generic')))); $expected['link']['href'] = 'preg:/.*css\/cake\.generic\.css/'; $this->assertTags($result[0], $expected); $expected['link']['href'] = 'preg:/.*css\/vendor\.generic\.css/'; $this->assertTags($result[1], $expected); $this->assertEqual(count($result), 2); $this->View->expects($this->at(0))->method('addScript') ->with($this->matchesRegularExpression('/css_in_head.css/')); $this->View->expects($this->at(1)) ->method('addScript') ->with($this->matchesRegularExpression('/more_css_in_head.css/')); $result = $this->Html->css('css_in_head', null, array('inline' => false)); $this->assertNull($result); $result = $this->Html->css('more_css_in_head', null, array('inline' => false)); $this->assertNull($result); } /** * test use of css() and timestamping * * @return void */ function testCssTimestamping() { Configure::write('debug', 2); Configure::write('Asset.timestamp', true); $expected = array( 'link' => array('rel' => 'stylesheet', 'type' => 'text/css', 'href' => '') ); $result = $this->Html->css('cake.generic'); $expected['link']['href'] = 'preg:/.*css\/cake\.generic\.css\?[0-9]+/'; $this->assertTags($result, $expected); Configure::write('debug', 0); $result = $this->Html->css('cake.generic'); $expected['link']['href'] = 'preg:/.*css\/cake\.generic\.css/'; $this->assertTags($result, $expected); Configure::write('Asset.timestamp', 'force'); $result = $this->Html->css('cake.generic'); $expected['link']['href'] = 'preg:/.*css\/cake\.generic\.css\?[0-9]+/'; $this->assertTags($result, $expected); $this->Html->request->webroot = '/testing/'; $result = $this->Html->css('cake.generic'); $expected['link']['href'] = 'preg:/\/testing\/css\/cake\.generic\.css\?[0-9]+/'; $this->assertTags($result, $expected); $this->Html->request->webroot = '/testing/longer/'; $result = $this->Html->css('cake.generic'); $expected['link']['href'] = 'preg:/\/testing\/longer\/css\/cake\.generic\.css\?[0-9]+/'; $this->assertTags($result, $expected); } /** * test timestamp enforcement for script tags. * * @return void */ function testScriptTimestamping() { $skip = $this->skipIf(!is_writable(JS), 'webroot/js is not Writable, timestamp testing has been skipped'); if ($skip) { return; } Configure::write('debug', 2); Configure::write('Asset.timestamp', true); touch(WWW_ROOT . 'js' . DS. '__cake_js_test.js'); $timestamp = substr(strtotime('now'), 0, 8); $result = $this->Html->script('__cake_js_test', array('inline' => true, 'once' => false)); $this->assertPattern('/__cake_js_test.js\?' . $timestamp . '[0-9]{2}"/', $result, 'Timestamp value not found %s'); Configure::write('debug', 0); Configure::write('Asset.timestamp', 'force'); $result = $this->Html->script('__cake_js_test', array('inline' => true, 'once' => false)); $this->assertPattern('/__cake_js_test.js\?' . $timestamp . '[0-9]{2}"/', $result, 'Timestamp value not found %s'); unlink(WWW_ROOT . 'js' . DS. '__cake_js_test.js'); Configure::write('Asset.timestamp', false); } /** * test that scripts added with uses() are only ever included once. * test script tag generation * * @return void */ function testScript() { $result = $this->Html->script('foo'); $expected = array( 'script' => array('type' => 'text/javascript', 'src' => 'js/foo.js') ); $this->assertTags($result, $expected); $result = $this->Html->script(array('foobar', 'bar')); $expected = array( array('script' => array('type' => 'text/javascript', 'src' => 'js/foobar.js')), '/script', array('script' => array('type' => 'text/javascript', 'src' => 'js/bar.js')), '/script', ); $this->assertTags($result, $expected); $result = $this->Html->script('jquery-1.3'); $expected = array( 'script' => array('type' => 'text/javascript', 'src' => 'js/jquery-1.3.js') ); $this->assertTags($result, $expected); $result = $this->Html->script('test.json'); $expected = array( 'script' => array('type' => 'text/javascript', 'src' => 'js/test.json.js') ); $this->assertTags($result, $expected); $result = $this->Html->script('/plugin/js/jquery-1.3.2.js?someparam=foo'); $expected = array( 'script' => array('type' => 'text/javascript', 'src' => '/plugin/js/jquery-1.3.2.js?someparam=foo') ); $this->assertTags($result, $expected); $result = $this->Html->script('test.json.js?foo=bar'); $expected = array( 'script' => array('type' => 'text/javascript', 'src' => 'js/test.json.js?foo=bar') ); $this->assertTags($result, $expected); $result = $this->Html->script('foo'); $this->assertNull($result, 'Script returned upon duplicate inclusion %s'); $result = $this->Html->script(array('foo', 'bar', 'baz')); $this->assertNoPattern('/foo.js/', $result); $result = $this->Html->script('foo', array('inline' => true, 'once' => false)); $this->assertNotNull($result); $result = $this->Html->script('jquery-1.3.2', array('defer' => true, 'encoding' => 'utf-8')); $expected = array( 'script' => array('type' => 'text/javascript', 'src' => 'js/jquery-1.3.2.js', 'defer' => 'defer', 'encoding' => 'utf-8') ); $this->assertTags($result, $expected); $this->View->expects($this->any())->method('addScript') ->with($this->matchesRegularExpression('/script_in_head.js/')); $result = $this->Html->script('script_in_head', array('inline' => false)); $this->assertNull($result); } /** * test a script file in the webroot/theme dir. * * @return void */ function testScriptInTheme() { if ($this->skipIf(!is_writable(WWW_ROOT . 'theme'), 'Cannot write to webroot/theme')) { return; } App::import('Core', 'File'); $testfile = WWW_ROOT . 'theme' . DS . 'test_theme' . DS . 'js' . DS . '__test_js.js'; $file = new File($testfile, true); App::build(array( 'views' => array(TEST_CAKE_CORE_INCLUDE_PATH . 'tests' . DS . 'test_app' . DS . 'views'. DS) )); $this->Html->webroot = '/'; $this->Html->theme = 'test_theme'; $result = $this->Html->script('__test_js.js'); $expected = array( 'script' => array('src' => '/theme/test_theme/js/__test_js.js', 'type' => 'text/javascript') ); $this->assertTags($result, $expected); $folder = new Folder(WWW_ROOT . 'theme' . DS . 'test_theme'); $folder->delete(); App::build(); } /** * test Script block generation * * @return void */ function testScriptBlock() { $result = $this->Html->scriptBlock('window.foo = 2;'); $expected = array( 'script' => array('type' => 'text/javascript'), $this->cDataStart, 'window.foo = 2;', $this->cDataEnd, '/script', ); $this->assertTags($result, $expected); $result = $this->Html->scriptBlock('window.foo = 2;', array('safe' => false)); $expected = array( 'script' => array('type' => 'text/javascript'), 'window.foo = 2;', '/script', ); $this->assertTags($result, $expected); $result = $this->Html->scriptBlock('window.foo = 2;', array('safe' => true)); $expected = array( 'script' => array('type' => 'text/javascript'), $this->cDataStart, 'window.foo = 2;', $this->cDataEnd, '/script', ); $this->assertTags($result, $expected); $this->View->expects($this->any())->method('addScript') ->with($this->matchesRegularExpression('/window\.foo\s\=\s2;/')); $result = $this->Html->scriptBlock('window.foo = 2;', array('inline' => false)); $this->assertNull($result); $result = $this->Html->scriptBlock('window.foo = 2;', array('safe' => false, 'encoding' => 'utf-8')); $expected = array( 'script' => array('type' => 'text/javascript', 'encoding' => 'utf-8'), 'window.foo = 2;', '/script', ); $this->assertTags($result, $expected); } /** * test script tag output buffering when using scriptStart() and scriptEnd(); * * @return void */ function testScriptStartAndScriptEnd() { $result = $this->Html->scriptStart(array('safe' => true)); $this->assertNull($result); echo 'this is some javascript'; $result = $this->Html->scriptEnd(); $expected = array( 'script' => array('type' => 'text/javascript'), $this->cDataStart, 'this is some javascript', $this->cDataEnd, '/script' ); $this->assertTags($result, $expected); $result = $this->Html->scriptStart(array('safe' => false)); $this->assertNull($result); echo 'this is some javascript'; $result = $this->Html->scriptEnd(); $expected = array( 'script' => array('type' => 'text/javascript'), 'this is some javascript', '/script' ); $this->assertTags($result, $expected); $this->View->expects($this->once())->method('addScript'); $result = $this->Html->scriptStart(array('safe' => false, 'inline' => false)); $this->assertNull($result); echo 'this is some javascript'; $result = $this->Html->scriptEnd(); $this->assertNull($result); } /** * testCharsetTag method * * @access public * @return void */ function testCharsetTag() { Configure::write('App.encoding', null); $result = $this->Html->charset(); $this->assertTags($result, array('meta' => array('http-equiv' => 'Content-Type', 'content' => 'text/html; charset=utf-8'))); Configure::write('App.encoding', 'ISO-8859-1'); $result = $this->Html->charset(); $this->assertTags($result, array('meta' => array('http-equiv' => 'Content-Type', 'content' => 'text/html; charset=iso-8859-1'))); $result = $this->Html->charset('UTF-7'); $this->assertTags($result, array('meta' => array('http-equiv' => 'Content-Type', 'content' => 'text/html; charset=UTF-7'))); } /** * testBreadcrumb method * * @access public * @return void */ function testBreadcrumb() { $this->Html->addCrumb('First', '#first'); $this->Html->addCrumb('Second', '#second'); $this->Html->addCrumb('Third', '#third'); $result = $this->Html->getCrumbs(); $expected = array( array('a' => array('href' => '#first')), 'First', '/a', '»', array('a' => array('href' => '#second')), 'Second', '/a', '»', array('a' => array('href' => '#third')), 'Third', '/a', ); $this->assertTags($result, $expected); $result = $this->Html->getCrumbs(' > '); $expected = array( array('a' => array('href' => '#first')), 'First', '/a', ' > ', array('a' => array('href' => '#second')), 'Second', '/a', ' > ', array('a' => array('href' => '#third')), 'Third', '/a', ); $this->assertTags($result, $expected); $this->assertPattern('/^]+>First<\/a> > ]+>Second<\/a> > ]+>Third<\/a>$/', $result); $this->assertPattern('/]*>First<\/a>/', $result); $this->assertPattern('/]*>Second<\/a>/', $result); $this->assertPattern('/]*>Third<\/a>/', $result); $this->assertNoPattern('/]+[^href]=[^<>]*>/', $result); $this->Html->addCrumb('Fourth', null); $result = $this->Html->getCrumbs(); $expected = array( array('a' => array('href' => '#first')), 'First', '/a', '»', array('a' => array('href' => '#second')), 'Second', '/a', '»', array('a' => array('href' => '#third')), 'Third', '/a', '»', 'Fourth' ); $this->assertTags($result, $expected); } /** * testNestedList method * * @access public * @return void */ function testNestedList() { $list = array( 'Item 1', 'Item 2' => array( 'Item 2.1' ), 'Item 3', 'Item 4' => array( 'Item 4.1', 'Item 4.2', 'Item 4.3' => array( 'Item 4.3.1', 'Item 4.3.2' ) ), 'Item 5' => array( 'Item 5.1', 'Item 5.2' ) ); $result = $this->Html->nestedList($list); $expected = array( 'assertTags($result, $expected); $result = $this->Html->nestedList($list, null); $expected = array( 'assertTags($result, $expected); $result = $this->Html->nestedList($list, array(), array(), 'ol'); $expected = array( 'assertTags($result, $expected); $result = $this->Html->nestedList($list, 'ol'); $expected = array( 'assertTags($result, $expected); $result = $this->Html->nestedList($list, array('class'=>'list')); $expected = array( array('ul' => array('class' => 'list')), ' array('class' => 'list')), ' array('class' => 'list')), ' array('class' => 'list')), ' array('class' => 'list')), 'assertTags($result, $expected); $result = $this->Html->nestedList($list, array(), array('class' => 'item')); $expected = array( ' array('class' => 'item')), 'Item 1', '/li', array('li' => array('class' => 'item')), 'Item 2', ' array('class' => 'item')), 'Item 2.1', '/li', '/ul', '/li', array('li' => array('class' => 'item')), 'Item 3', '/li', array('li' => array('class' => 'item')), 'Item 4', ' array('class' => 'item')), 'Item 4.1', '/li', array('li' => array('class' => 'item')), 'Item 4.2', '/li', array('li' => array('class' => 'item')), 'Item 4.3', ' array('class' => 'item')), 'Item 4.3.1', '/li', array('li' => array('class' => 'item')), 'Item 4.3.2', '/li', '/ul', '/li', '/ul', '/li', array('li' => array('class' => 'item')), 'Item 5', ' array('class' => 'item')), 'Item 5.1', '/li', array('li' => array('class' => 'item')), 'Item 5.2', '/li', '/ul', '/li', '/ul' ); $this->assertTags($result, $expected); $result = $this->Html->nestedList($list, array(), array('even' => 'even', 'odd' => 'odd')); $expected = array( ' array('class' => 'odd')), 'Item 1', '/li', array('li' => array('class' => 'even')), 'Item 2', ' array('class' => 'odd')), 'Item 2.1', '/li', '/ul', '/li', array('li' => array('class' => 'odd')), 'Item 3', '/li', array('li' => array('class' => 'even')), 'Item 4', ' array('class' => 'odd')), 'Item 4.1', '/li', array('li' => array('class' => 'even')), 'Item 4.2', '/li', array('li' => array('class' => 'odd')), 'Item 4.3', ' array('class' => 'odd')), 'Item 4.3.1', '/li', array('li' => array('class' => 'even')), 'Item 4.3.2', '/li', '/ul', '/li', '/ul', '/li', array('li' => array('class' => 'odd')), 'Item 5', ' array('class' => 'odd')), 'Item 5.1', '/li', array('li' => array('class' => 'even')), 'Item 5.2', '/li', '/ul', '/li', '/ul' ); $this->assertTags($result, $expected); $result = $this->Html->nestedList($list, array('class'=>'list'), array('class' => 'item')); $expected = array( array('ul' => array('class' => 'list')), array('li' => array('class' => 'item')), 'Item 1', '/li', array('li' => array('class' => 'item')), 'Item 2', array('ul' => array('class' => 'list')), array('li' => array('class' => 'item')), 'Item 2.1', '/li', '/ul', '/li', array('li' => array('class' => 'item')), 'Item 3', '/li', array('li' => array('class' => 'item')), 'Item 4', array('ul' => array('class' => 'list')), array('li' => array('class' => 'item')), 'Item 4.1', '/li', array('li' => array('class' => 'item')), 'Item 4.2', '/li', array('li' => array('class' => 'item')), 'Item 4.3', array('ul' => array('class' => 'list')), array('li' => array('class' => 'item')), 'Item 4.3.1', '/li', array('li' => array('class' => 'item')), 'Item 4.3.2', '/li', '/ul', '/li', '/ul', '/li', array('li' => array('class' => 'item')), 'Item 5', array('ul' => array('class' => 'list')), array('li' => array('class' => 'item')), 'Item 5.1', '/li', array('li' => array('class' => 'item')), 'Item 5.2', '/li', '/ul', '/li', '/ul' ); $this->assertTags($result, $expected); } /** * testMeta method * * @access public * @return void */ function testMeta() { $result = $this->Html->meta('this is an rss feed', array('controller' => 'posts', 'ext' => 'rss')); $this->assertTags($result, array('link' => array('href' => 'preg:/.*\/posts\.rss/', 'type' => 'application/rss+xml', 'rel' => 'alternate', 'title' => 'this is an rss feed'))); $result = $this->Html->meta('rss', array('controller' => 'posts', 'ext' => 'rss'), array('title' => 'this is an rss feed')); $this->assertTags($result, array('link' => array('href' => 'preg:/.*\/posts\.rss/', 'type' => 'application/rss+xml', 'rel' => 'alternate', 'title' => 'this is an rss feed'))); $result = $this->Html->meta('atom', array('controller' => 'posts', 'ext' => 'xml')); $this->assertTags($result, array('link' => array('href' => 'preg:/.*\/posts\.xml/', 'type' => 'application/atom+xml', 'title' => 'atom'))); $result = $this->Html->meta('non-existing'); $this->assertTags($result, array('Html->meta('non-existing', '/posts.xpp'); $this->assertTags($result, array('link' => array('href' => 'preg:/.*\/posts\.xpp/', 'type' => 'application/rss+xml', 'rel' => 'alternate', 'title' => 'non-existing'))); $result = $this->Html->meta('non-existing', '/posts.xpp', array('type' => 'atom')); $this->assertTags($result, array('link' => array('href' => 'preg:/.*\/posts\.xpp/', 'type' => 'application/atom+xml', 'title' => 'non-existing'))); $result = $this->Html->meta('atom', array('controller' => 'posts', 'ext' => 'xml'), array('link' => '/articles.rss')); $this->assertTags($result, array('link' => array('href' => 'preg:/.*\/articles\.rss/', 'type' => 'application/atom+xml', 'title' => 'atom'))); $result = $this->Html->meta(array('link' => 'favicon.ico', 'rel' => 'icon')); $expected = array( 'link' => array('href' => 'preg:/.*favicon\.ico/', 'rel' => 'icon'), array('link' => array('href' => 'preg:/.*favicon\.ico/', 'rel' => 'shortcut icon')) ); $this->assertTags($result, $expected); $result = $this->Html->meta('icon', 'favicon.ico'); $expected = array( 'link' => array('href' => 'preg:/.*favicon\.ico/', 'type' => 'image/x-icon', 'rel' => 'icon'), array('link' => array('href' => 'preg:/.*favicon\.ico/', 'type' => 'image/x-icon', 'rel' => 'shortcut icon')) ); $this->assertTags($result, $expected); $result = $this->Html->meta('keywords', 'these, are, some, meta, keywords'); $this->assertTags($result, array('meta' => array('name' => 'keywords', 'content' => 'these, are, some, meta, keywords'))); $this->assertPattern('/\s+\/>$/', $result); $result = $this->Html->meta('description', 'this is the meta description'); $this->assertTags($result, array('meta' => array('name' => 'description', 'content' => 'this is the meta description'))); $result = $this->Html->meta(array('name' => 'ROBOTS', 'content' => 'ALL')); $this->assertTags($result, array('meta' => array('name' => 'ROBOTS', 'content' => 'ALL'))); $this->View->expects($this->any())->method('addScript') ->with($this->matchesRegularExpression('/^Html->meta(array('name' => 'ROBOTS', 'content' => 'ALL'), null, array('inline' => false)); $this->assertNull($result); } /** * testTableHeaders method * * @access public * @return void */ function testTableHeaders() { $result = $this->Html->tableHeaders(array('ID', 'Name', 'Date')); $expected = array('assertTags($result, $expected); } /** * testTableCells method * * @access public * @return void */ function testTableCells() { $tr = array( 'td content 1', array('td content 2', array("width" => "100px")), array('td content 3', "width=100px") ); $result = $this->Html->tableCells($tr); $expected = array( ' array('width' => '100px')), 'td content 2', '/td', array('td' => array('width' => 'preg:/100px/')), 'td content 3', '/td', '/tr' ); $this->assertTags($result, $expected); $tr = array('td content 1', 'td content 2', 'td content 3'); $result = $this->Html->tableCells($tr, null, null, true); $expected = array( ' array('class' => 'column-1')), 'td content 1', '/td', array('td' => array('class' => 'column-2')), 'td content 2', '/td', array('td' => array('class' => 'column-3')), 'td content 3', '/td', '/tr' ); $this->assertTags($result, $expected); $tr = array('td content 1', 'td content 2', 'td content 3'); $result = $this->Html->tableCells($tr, true); $expected = array( ' array('class' => 'column-1')), 'td content 1', '/td', array('td' => array('class' => 'column-2')), 'td content 2', '/td', array('td' => array('class' => 'column-3')), 'td content 3', '/td', '/tr' ); $this->assertTags($result, $expected); $tr = array( array('td content 1', 'td content 2', 'td content 3'), array('td content 1', 'td content 2', 'td content 3'), array('td content 1', 'td content 2', 'td content 3') ); $result = $this->Html->tableCells($tr, array('class' => 'odd'), array('class' => 'even')); $expected = "td content 1 td content 2 td content 3\ntd content 1 td content 2 td content 3\ntd content 1 td content 2 td content 3"; $this->assertEqual($result, $expected); $tr = array( array('td content 1', 'td content 2', 'td content 3'), array('td content 1', 'td content 2', 'td content 3'), array('td content 1', 'td content 2', 'td content 3'), array('td content 1', 'td content 2', 'td content 3') ); $result = $this->Html->tableCells($tr, array('class' => 'odd'), array('class' => 'even')); $expected = "td content 1 td content 2 td content 3\ntd content 1 td content 2 td content 3\ntd content 1 td content 2 td content 3\ntd content 1 td content 2 td content 3"; $this->assertEqual($result, $expected); $tr = array( array('td content 1', 'td content 2', 'td content 3'), array('td content 1', 'td content 2', 'td content 3'), array('td content 1', 'td content 2', 'td content 3') ); $this->Html->tableCells($tr, array('class' => 'odd'), array('class' => 'even')); $result = $this->Html->tableCells($tr, array('class' => 'odd'), array('class' => 'even'), false, false); $expected = "td content 1 td content 2 td content 3\ntd content 1 td content 2 td content 3\ntd content 1 td content 2 td content 3"; $this->assertEqual($result, $expected); } /** * testTag method * * @access public * @return void */ function testTag() { $result = $this->Html->tag('div'); $this->assertTags($result, 'Html->tag('div', 'text'); $this->assertTags($result, 'Html->tag('div', '', 'class-name'); $this->assertTags($result, array('div' => array('class' => 'class-name'), 'preg://', '/div')); $result = $this->Html->tag('div', '', array('class' => 'class-name', 'escape' => true)); $this->assertTags($result, array('div' => array('class' => 'class-name'), '<text>', '/div')); } /** * testDiv method * * @access public * @return void */ function testDiv() { $result = $this->Html->div('class-name'); $this->assertTags($result, array('div' => array('class' => 'class-name'))); $result = $this->Html->div('class-name', 'text'); $this->assertTags($result, array('div' => array('class' => 'class-name'), 'text', '/div')); $result = $this->Html->div('class-name', '', array('escape' => true)); $this->assertTags($result, array('div' => array('class' => 'class-name'), '<text>', '/div')); } /** * testPara method * * @access public * @return void */ function testPara() { $result = $this->Html->para('class-name', ''); $this->assertTags($result, array('p' => array('class' => 'class-name'))); $result = $this->Html->para('class-name', 'text'); $this->assertTags($result, array('p' => array('class' => 'class-name'), 'text', '/p')); $result = $this->Html->para('class-name', '', array('escape' => true)); $this->assertTags($result, array('p' => array('class' => 'class-name'), '<text>', '/p')); } /** * testCrumbList method * * @access public * * @return void */ function testCrumbList() { $this->Html->addCrumb('Home', '/', array('class' => 'home')); $this->Html->addCrumb('Some page', '/some_page'); $this->Html->addCrumb('Another page'); $result = $this->Html->getCrumbList( array('class' => 'breadcrumbs') ); $this->assertTags( $result, array( array('ul' => array('class' => 'breadcrumbs')), array('li' => array('class' => 'first')), array('a' => array('class' => 'home', 'href' => '/')), 'Home', '/a', '/li', ' array('href' => '/some_page')), 'Some page', '/a', '/li', array('li' => array('class' => 'last')), 'Another page', '/li', '/ul' ) ); } }