diff cake/tests/cases/libs/view/helpers/cache.test.php @ 0:261e66bd5a0c

hg init
author Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
date Sun, 24 Jul 2011 21:08:31 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cake/tests/cases/libs/view/helpers/cache.test.php	Sun Jul 24 21:08:31 2011 +0900
@@ -0,0 +1,571 @@
+<?php
+/**
+ * CacheHelperTest file
+ *
+ * PHP versions 4 and 5
+ *
+ * CakePHP(tm) Tests <http://book.cakephp.org/view/1196/Testing>
+ * Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org)
+ *
+ *  Licensed under The Open Group Test Suite License
+ *  Redistributions of files must retain the above copyright notice.
+ *
+ * @copyright     Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org)
+ * @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       http://www.opensource.org/licenses/opengroup.php The Open Group Test Suite License
+ */
+App::import('Core', array('Controller', 'Model', 'View'));
+App::import('Helper', 'Cache');
+
+/**
+ * CacheTestController class
+ *
+ * @package       cake
+ * @subpackage    cake.tests.cases.libs.view.helpers
+ */
+class CacheTestController extends Controller {
+
+/**
+ * helpers property
+ *
+ * @var array
+ * @access public
+ */
+	var $helpers = array('Html', 'Cache');
+
+/**
+ * cache_parsing method
+ *
+ * @access public
+ * @return void
+ */
+	function cache_parsing() {
+		$this->viewPath = 'posts';
+		$this->layout = 'cache_layout';
+		$this->set('variable', 'variableValue');
+		$this->set('superman', 'clark kent');
+		$this->set('batman', 'bruce wayne');
+		$this->set('spiderman', 'peter parker');
+	}
+}
+
+/**
+ * CacheHelperTest class
+ *
+ * @package       cake
+ * @subpackage    cake.tests.cases.libs.view.helpers
+ */
+class CacheHelperTest extends CakeTestCase {
+
+/**
+ * Checks if TMP/views is writable, and skips the case if it is not.
+ *
+ * @return void
+ */
+	function skip() {
+		$this->skipUnless(is_writable(TMP . 'cache' . DS . 'views' . DS), 'TMP/views is not writable %s');
+	}
+/**
+ * setUp method
+ *
+ * @access public
+ * @return void
+ */
+	function setUp() {
+		$this->Controller = new CacheTestController();
+		$this->Cache = new CacheHelper();
+		$this->_cacheSettings = Configure::read('Cache');
+		Configure::write('Cache.check', true);
+		Configure::write('Cache.disable', false);
+	}
+
+/**
+ * Start Case - switch view paths
+ *
+ * @access public
+ * @return void
+ */
+	function startCase() {
+		App::build(array(
+			'views' => array(TEST_CAKE_CORE_INCLUDE_PATH . 'tests' . DS . 'test_app' . DS . 'views'. DS)
+		), true);
+	}
+
+/**
+ * End Case - restore view Paths
+ *
+ * @access public
+ * @return void
+ */
+	function endCase() {
+		App::build();
+	}
+
+/**
+ * tearDown method
+ *
+ * @access public
+ * @return void
+ */
+	function tearDown() {
+		clearCache();
+		unset($this->Cache);
+		Configure::write('Cache', $this->_cacheSettings);
+	}
+
+/**
+ * test cache parsing with no cake:nocache tags in view file.
+ *
+ * @access public
+ * @return void
+ */
+	function testLayoutCacheParsingNoTagsInView() {
+		$this->Controller->cache_parsing();
+		$this->Controller->params = array(
+			'controller' => 'cache_test',
+			'action' => 'cache_parsing',
+			'url' => array(),
+			'pass' => array(),
+			'named' => array()
+		);
+		$this->Controller->cacheAction = 21600;
+		$this->Controller->here = '/cacheTest/cache_parsing';
+		$this->Controller->action = 'cache_parsing';
+
+		$View = new View($this->Controller);
+		$result = $View->render('index');
+		$this->assertNoPattern('/cake:nocache/', $result);
+		$this->assertNoPattern('/php echo/', $result);
+
+		$filename = CACHE . 'views' . DS . 'cachetest_cache_parsing.php';
+		$this->assertTrue(file_exists($filename));
+
+		$contents = file_get_contents($filename);
+		$this->assertPattern('/php echo \$variable/', $contents);
+		$this->assertPattern('/php echo microtime()/', $contents);
+		$this->assertPattern('/clark kent/', $result);
+
+		@unlink($filename);
+	}
+
+/**
+ * test cache parsing with non-latin characters in current route
+ *
+ * @access public
+ * @return void
+ */
+	function testCacheNonLatinCharactersInRoute() {
+		$this->Controller->cache_parsing();
+		$this->Controller->params = array(
+			'controller' => 'cache_test',
+			'action' => 'cache_parsing',
+			'url' => array(),
+			'pass' => array('風街ろまん'),
+			'named' => array()
+		);
+		$this->Controller->cacheAction = 21600;
+		$this->Controller->here = '/posts/view/風街ろまん';
+		$this->Controller->action = 'view';
+
+		$View = new View($this->Controller);
+		$result = $View->render('index');
+
+		$filename = CACHE . 'views' . DS . 'posts_view_風街ろまん.php';
+		$this->assertTrue(file_exists($filename));
+
+		@unlink($filename);
+	}
+/**
+ * Test cache parsing with cake:nocache tags in view file.
+ *
+ * @access public
+ * @return void
+ */
+	function testLayoutCacheParsingWithTagsInView() {
+		$this->Controller->cache_parsing();
+		$this->Controller->params = array(
+			'controller' => 'cache_test',
+			'action' => 'cache_parsing',
+			'url' => array(),
+			'pass' => array(),
+			'named' => array()
+		);
+		$this->Controller->cacheAction = 21600;
+		$this->Controller->here = '/cacheTest/cache_parsing';
+		$this->Controller->action = 'cache_parsing';
+
+		$View = new View($this->Controller);
+		$result = $View->render('test_nocache_tags');
+		$this->assertNoPattern('/cake:nocache/', $result);
+		$this->assertNoPattern('/php echo/', $result);
+
+		$filename = CACHE . 'views' . DS . 'cachetest_cache_parsing.php';
+		$this->assertTrue(file_exists($filename));
+
+		$contents = file_get_contents($filename);
+		$this->assertPattern('/if \(is_writable\(TMP\)\)\:/', $contents);
+		$this->assertPattern('/php echo \$variable/', $contents);
+		$this->assertPattern('/php echo microtime()/', $contents);
+		$this->assertNoPattern('/cake:nocache/', $contents);
+
+		@unlink($filename);
+	}
+
+/**
+ * test that multiple <cake:nocache> tags function with multiple nocache tags in the layout.
+ *
+ * @return void
+ */
+	function testMultipleNoCacheTagsInViewfile() {
+		$this->Controller->cache_parsing();
+		$this->Controller->params = array(
+			'controller' => 'cache_test',
+			'action' => 'cache_parsing',
+			'url' => array(),
+			'pass' => array(),
+			'named' => array()
+		);
+		$this->Controller->cacheAction = 21600;
+		$this->Controller->here = '/cacheTest/cache_parsing';
+		$this->Controller->action = 'cache_parsing';
+
+		$View = new View($this->Controller);
+		$result = $View->render('multiple_nocache');
+
+		$this->assertNoPattern('/cake:nocache/', $result);
+		$this->assertNoPattern('/php echo/', $result);
+
+		$filename = CACHE . 'views' . DS . 'cachetest_cache_parsing.php';
+		$this->assertTrue(file_exists($filename));
+
+		$contents = file_get_contents($filename);
+		$this->assertNoPattern('/cake:nocache/', $contents);
+		@unlink($filename);
+	}
+
+/**
+ * testComplexNoCache method
+ *
+ * @return void
+ * @access public
+ */
+	function testComplexNoCache () {
+		$this->Controller->cache_parsing();
+		$this->Controller->params = array(
+			'controller' => 'cache_test',
+			'action' => 'cache_complex',
+			'url' => array(),
+			'pass' => array(),
+			'named' => array()
+		);
+		$this->Controller->cacheAction = array('cache_complex' => 21600);
+		$this->Controller->here = '/cacheTest/cache_complex';
+		$this->Controller->action = 'cache_complex';
+		$this->Controller->layout = 'multi_cache';
+		$this->Controller->viewPath = 'posts';
+
+		$View = new View($this->Controller);
+		$result = $View->render('sequencial_nocache');
+
+		$this->assertNoPattern('/cake:nocache/', $result);
+		$this->assertNoPattern('/php echo/', $result);
+		$this->assertPattern('/A\. Layout Before Content/', $result);
+		$this->assertPattern('/B\. In Plain Element/', $result);
+		$this->assertPattern('/C\. Layout After Test Element/', $result);
+		$this->assertPattern('/D\. In View File/', $result);
+		$this->assertPattern('/E\. Layout After Content/', $result);
+		//$this->assertPattern('/F\. In Element With No Cache Tags/', $result);
+		$this->assertPattern('/G\. Layout After Content And After Element With No Cache Tags/', $result);
+		$this->assertNoPattern('/1\. layout before content/', $result);
+		$this->assertNoPattern('/2\. in plain element/', $result);
+		$this->assertNoPattern('/3\. layout after test element/', $result);
+		$this->assertNoPattern('/4\. in view file/', $result);
+		$this->assertNoPattern('/5\. layout after content/', $result);
+		//$this->assertNoPattern('/6\. in element with no cache tags/', $result);
+		$this->assertNoPattern('/7\. layout after content and after element with no cache tags/', $result);
+
+		$filename = CACHE . 'views' . DS . 'cachetest_cache_complex.php';
+		$this->assertTrue(file_exists($filename));
+		$contents = file_get_contents($filename);
+		@unlink($filename);
+
+		$this->assertPattern('/A\. Layout Before Content/', $contents);
+		$this->assertNoPattern('/B\. In Plain Element/', $contents);
+		$this->assertPattern('/C\. Layout After Test Element/', $contents);
+		$this->assertPattern('/D\. In View File/', $contents);
+		$this->assertPattern('/E\. Layout After Content/', $contents);
+		//$this->assertPattern('/F\. In Element With No Cache Tags/', $contents);
+		$this->assertPattern('/G\. Layout After Content And After Element With No Cache Tags/', $contents);
+		$this->assertPattern('/1\. layout before content/', $contents);
+		$this->assertNoPattern('/2\. in plain element/', $contents);
+		$this->assertPattern('/3\. layout after test element/', $contents);
+		$this->assertPattern('/4\. in view file/', $contents);
+		$this->assertPattern('/5\. layout after content/', $contents);
+		//$this->assertPattern('/6\. in element with no cache tags/', $contents);
+		$this->assertPattern('/7\. layout after content and after element with no cache tags/', $contents);
+	}
+
+/**
+ * test cache of view vars
+ *
+ * @access public
+ * @return void
+ */
+	function testCacheViewVars() {
+		$this->Controller->cache_parsing();
+		$this->Controller->params = array(
+			'controller' => 'cache_test',
+			'action' => 'cache_parsing',
+			'url' => array(),
+			'pass' => array(),
+			'named' => array()
+		);
+		$this->Controller->cacheAction = 21600;
+		$this->Controller->here = '/cacheTest/cache_parsing';
+		$this->Controller->action = 'cache_parsing';
+
+		$View = new View($this->Controller);
+		$result = $View->render('index');
+		$this->assertNoPattern('/cake:nocache/', $result);
+		$this->assertNoPattern('/php echo/', $result);
+
+		$filename = CACHE . 'views' . DS . 'cachetest_cache_parsing.php';
+		$this->assertTrue(file_exists($filename));
+
+		$contents = file_get_contents($filename);
+		$this->assertPattern('/\$this\-\>viewVars/', $contents);
+		$this->assertPattern('/extract\(\$this\-\>viewVars, EXTR_SKIP\);/', $contents);
+		$this->assertPattern('/php echo \$variable/', $contents);
+
+		@unlink($filename);
+	}
+
+/**
+ * test cacheAction set to a boolean
+ *
+ * @return void
+ */
+	function testCacheActionArray() {
+		$this->Controller->cache_parsing();
+		$this->Controller->params = array(
+			'controller' => 'cache_test',
+			'action' => 'cache_parsing',
+			'url' => array(),
+			'pass' => array(),
+			'named' => array()
+		);
+		$this->Controller->cacheAction = array(
+			'cache_parsing' => 21600
+		);
+		$this->Controller->here = '/cache_test/cache_parsing';
+		$this->Controller->action = 'cache_parsing';
+
+		$View = new View($this->Controller);
+		$result = $View->render('index');
+
+		$this->assertNoPattern('/cake:nocache/', $result);
+		$this->assertNoPattern('/php echo/', $result);
+
+		$filename = CACHE . 'views' . DS . 'cache_test_cache_parsing.php';
+		$this->assertTrue(file_exists($filename));
+		@unlink($filename);
+
+
+		$this->Controller->cache_parsing();
+		$this->Controller->cacheAction = array(
+			'cache_parsing' => 21600
+		);
+		$this->Controller->here = '/cacheTest/cache_parsing';
+		$this->Controller->action = 'cache_parsing';
+
+		$View = new View($this->Controller);
+		$result = $View->render('index');
+
+		$this->assertNoPattern('/cake:nocache/', $result);
+		$this->assertNoPattern('/php echo/', $result);
+
+		$filename = CACHE . 'views' . DS . 'cachetest_cache_parsing.php';
+		$this->assertTrue(file_exists($filename));
+		@unlink($filename);
+
+
+		$this->Controller->cache_parsing();
+		$this->Controller->params = array(
+			'controller' => 'cache_test',
+			'action' => 'cache_parsing',
+			'url' => array(),
+			'pass' => array(),
+			'named' => array()
+		);
+		$this->Controller->cacheAction = array(
+			'some_other_action' => 21600
+		);
+		$this->Controller->here = '/cacheTest/cache_parsing';
+		$this->Controller->action = 'cache_parsing';
+
+		$View = new View($this->Controller);
+		$result = $View->render('index');
+
+		$this->assertNoPattern('/cake:nocache/', $result);
+		$this->assertNoPattern('/php echo/', $result);
+
+		$filename = CACHE . 'views' . DS . 'cachetest_cache_parsing.php';
+		$this->assertFalse(file_exists($filename));
+	}
+
+/**
+ * test with named and pass args.
+ *
+ * @return void
+ */
+	function testCacheWithNamedAndPassedArgs() {
+		Router::reload();
+
+		$this->Controller->cache_parsing();
+		$this->Controller->params = array(
+			'controller' => 'cache_test',
+			'action' => 'cache_parsing',
+			'url' => array(),
+			'pass' => array(1, 2),
+			'named' => array(
+				'name' => 'mark',
+				'ice' => 'cream'
+			)
+		);
+		$this->Controller->cacheAction = array(
+			'cache_parsing' => 21600
+		);
+		$this->Controller->here = '/cache_test/cache_parsing/1/2/name:mark/ice:cream';
+		$this->Controller->action = 'cache_parsing';
+		
+		$View = new View($this->Controller);
+		$result = $View->render('index');
+
+		$this->assertNoPattern('/cake:nocache/', $result);
+		$this->assertNoPattern('/php echo/', $result);
+
+		$filename = CACHE . 'views' . DS . 'cache_test_cache_parsing_1_2_name_mark_ice_cream.php';
+		$this->assertTrue(file_exists($filename));
+		@unlink($filename);
+	}
+
+/**
+ * test that custom routes are respected when generating cache files.
+ *
+ * @return void
+ */
+	function testCacheWithCustomRoutes() {
+		Router::reload();
+		Router::connect('/:lang/:controller/:action/*', array(), array('lang' => '[a-z]{3}'));
+		
+		$this->Controller->cache_parsing();
+		$this->Controller->params = array(
+			'lang' => 'en',
+			'controller' => 'cache_test',
+			'action' => 'cache_parsing',
+			'url' => array(),
+			'pass' => array(),
+			'named' => array()
+		);
+		$this->Controller->cacheAction = array(
+			'cache_parsing' => 21600
+		);
+		$this->Controller->here = '/en/cache_test/cache_parsing';
+		$this->Controller->action = 'cache_parsing';
+
+		$View = new View($this->Controller);
+		$result = $View->render('index');
+
+		$this->assertNoPattern('/cake:nocache/', $result);
+		$this->assertNoPattern('/php echo/', $result);
+
+		$filename = CACHE . 'views' . DS . 'en_cache_test_cache_parsing.php';
+		$this->assertTrue(file_exists($filename));
+		@unlink($filename);
+	}
+
+/**
+ * test ControllerName contains AppName
+ *
+ * This test verifys view cache is created correctly when the app name is contained in part of the controller name.
+ * (webapp Name) base name is 'cache' controller is 'cacheTest' action is 'cache_name'
+ * apps url would look somehing like http://localhost/cache/cacheTest/cache_name
+ *
+ * @return void
+ **/
+	function testCacheBaseNameControllerName() {
+		$this->Controller->cache_parsing();
+		$this->Controller->cacheAction = array(
+			'cache_name' => 21600
+		);
+		$this->Controller->params = array(
+			'controller' => 'cacheTest',
+			'action' => 'cache_name',
+			'url' => array(),
+			'pass' => array(),
+			'named' => array()
+		);
+		$this->Controller->here = '/cache/cacheTest/cache_name';
+		$this->Controller->action = 'cache_name';
+		$this->Controller->base = '/cache';
+
+		$View = new View($this->Controller);
+		$result = $View->render('index');
+
+		$this->assertNoPattern('/cake:nocache/', $result);
+		$this->assertNoPattern('/php echo/', $result);
+
+		$filename = CACHE . 'views' . DS . 'cache_cachetest_cache_name.php';
+		$this->assertTrue(file_exists($filename));
+		@unlink($filename);
+    }
+
+/**
+ * testCacheEmptySections method
+ *
+ * This test must be uncommented/fixed in next release (1.2+)
+ *
+ * @return void
+ * @access public
+ *
+	function testCacheEmptySections () {
+		$this->Controller->cache_parsing();
+		$this->Controller->cacheAction = array('cacheTest' => 21600);
+		$this->Controller->here = '/cacheTest/cache_empty_sections';
+		$this->Controller->action = 'cache_empty_sections';
+		$this->Controller->layout = 'cache_empty_sections';
+		$this->Controller->viewPath = 'posts';
+
+		$View = new View($this->Controller);
+		$result = $View->render('cache_empty_sections');
+		$this->assertNoPattern('/cake:nocache/', $result);
+		$this->assertNoPattern('/php echo/', $result);
+		$this->assertPattern(
+			'@</title>\s*</head>\s*' .
+			'<body>\s*' .
+			'View Content\s*' .
+			'cached count is: 3\s*' .
+			'</body>@', $result);
+
+		$filename = CACHE . 'views' . DS . 'cachetest_cache_empty_sections.php';
+		$this->assertTrue(file_exists($filename));
+		$contents = file_get_contents($filename);
+		$this->assertNoPattern('/cake:nocache/', $contents);
+		$this->assertPattern(
+			'@<head>\s*<title>Posts</title>\s*' .
+			"<\?php \$x = 1; \?>\s*" .
+			'</head>\s*' .
+			'<body>\s*' .
+			"<\?php \$x\+\+; \?>\s*" .
+			"<\?php \$x\+\+; \?>\s*" .
+			'View Content\s*' .
+			"<\?php \$y = 1; \?>\s*" .
+			"<\?php echo 'cached count is:' . \$x; \?>\s*" .
+			'@', $contents);
+		@unlink($filename);
+	}
+*/
+}