ViewTest.php 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584
  1. <?php
  2. /**
  3. * ViewTest file
  4. *
  5. * PHP 5
  6. *
  7. * CakePHP(tm) Tests <http://book.cakephp.org/2.0/en/development/testing.html>
  8. * Copyright 2005-2012, Cake Software Foundation, Inc. (http://cakefoundation.org)
  9. *
  10. * Licensed under The MIT License
  11. * Redistributions of files must retain the above copyright notice
  12. *
  13. * @copyright Copyright 2005-2012, Cake Software Foundation, Inc. (http://cakefoundation.org)
  14. * @link http://book.cakephp.org/2.0/en/development/testing.html CakePHP(tm) Tests
  15. * @package Cake.Test.Case.View
  16. * @since CakePHP(tm) v 1.2.0.4206
  17. * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
  18. */
  19. App::uses('View', 'View');
  20. App::uses('Helper', 'View');
  21. App::uses('Controller', 'Controller');
  22. App::uses('CacheHelper', 'View/Helper');
  23. App::uses('HtmlHelper', 'View/Helper');
  24. App::uses('ErrorHandler', 'Error');
  25. /**
  26. * ViewPostsController class
  27. *
  28. * @package Cake.Test.Case.View
  29. */
  30. class ViewPostsController extends Controller {
  31. /**
  32. * name property
  33. *
  34. * @var string 'Posts'
  35. */
  36. public $name = 'Posts';
  37. /**
  38. * uses property
  39. *
  40. * @var mixed null
  41. */
  42. public $uses = null;
  43. /**
  44. * index method
  45. *
  46. * @return void
  47. */
  48. public function index() {
  49. $this->set(array(
  50. 'testData' => 'Some test data',
  51. 'test2' => 'more data',
  52. 'test3' => 'even more data',
  53. ));
  54. }
  55. /**
  56. * nocache_tags_with_element method
  57. *
  58. * @return void
  59. */
  60. public function nocache_multiple_element() {
  61. $this->set('foo', 'this is foo var');
  62. $this->set('bar', 'this is bar var');
  63. }
  64. }
  65. /**
  66. * ThemePostsController class
  67. *
  68. * @package Cake.Test.Case.View
  69. */
  70. class ThemePostsController extends Controller {
  71. /**
  72. * name property
  73. *
  74. * @var string 'ThemePosts'
  75. */
  76. public $name = 'ThemePosts';
  77. public $theme = null;
  78. /**
  79. * index method
  80. *
  81. * @return void
  82. */
  83. public function index() {
  84. $this->set('testData', 'Some test data');
  85. $test2 = 'more data';
  86. $test3 = 'even more data';
  87. $this->set(compact('test2', 'test3'));
  88. }
  89. }
  90. /**
  91. * TestThemeView class
  92. *
  93. * @package Cake.Test.Case.View
  94. */
  95. class TestThemeView extends View {
  96. /**
  97. * renderElement method
  98. *
  99. * @param string $name
  100. * @param array $params
  101. * @return void
  102. */
  103. public function renderElement($name, $params = array()) {
  104. return $name;
  105. }
  106. /**
  107. * getViewFileName method
  108. *
  109. * @param string $name
  110. * @return void
  111. */
  112. public function getViewFileName($name = null) {
  113. return $this->_getViewFileName($name);
  114. }
  115. /**
  116. * getLayoutFileName method
  117. *
  118. * @param string $name
  119. * @return void
  120. */
  121. public function getLayoutFileName($name = null) {
  122. return $this->_getLayoutFileName($name);
  123. }
  124. }
  125. /**
  126. * TestView class
  127. *
  128. * @package Cake.Test.Case.View
  129. */
  130. class TestView extends View {
  131. /**
  132. * getViewFileName method
  133. *
  134. * @param string $name
  135. * @return void
  136. */
  137. public function getViewFileName($name = null) {
  138. return $this->_getViewFileName($name);
  139. }
  140. /**
  141. * getLayoutFileName method
  142. *
  143. * @param string $name
  144. * @return void
  145. */
  146. public function getLayoutFileName($name = null) {
  147. return $this->_getLayoutFileName($name);
  148. }
  149. /**
  150. * paths method
  151. *
  152. * @param string $plugin
  153. * @param boolean $cached
  154. * @return void
  155. */
  156. public function paths($plugin = null, $cached = true) {
  157. return $this->_paths($plugin, $cached);
  158. }
  159. /**
  160. * Test only function to return instance scripts.
  161. *
  162. * @return array Scripts
  163. */
  164. public function scripts() {
  165. return $this->_scripts;
  166. }
  167. }
  168. /**
  169. * TestAfterHelper class
  170. *
  171. * @package Cake.Test.Case.View
  172. */
  173. class TestAfterHelper extends Helper {
  174. /**
  175. * property property
  176. *
  177. * @var string ''
  178. */
  179. public $property = '';
  180. /**
  181. * beforeLayout method
  182. *
  183. * @return void
  184. */
  185. public function beforeLayout($viewFile) {
  186. $this->property = 'Valuation';
  187. }
  188. /**
  189. * afterLayout method
  190. *
  191. * @return void
  192. */
  193. public function afterLayout($layoutFile) {
  194. $this->_View->output .= 'modified in the afterlife';
  195. }
  196. }
  197. /**
  198. * ViewTest class
  199. *
  200. * @package Cake.Test.Case.View
  201. */
  202. class ViewTest extends CakeTestCase {
  203. /**
  204. * Fixtures used in this test.
  205. *
  206. * @var array
  207. */
  208. public $fixtures = array('core.user', 'core.post');
  209. /**
  210. * setUp method
  211. *
  212. * @return void
  213. */
  214. public function setUp() {
  215. parent::setUp();
  216. $request = $this->getMock('CakeRequest');
  217. $this->Controller = new Controller($request);
  218. $this->PostsController = new ViewPostsController($request);
  219. $this->PostsController->viewPath = 'Posts';
  220. $this->PostsController->index();
  221. $this->View = new View($this->PostsController);
  222. $themeRequest = new CakeRequest('posts/index');
  223. $this->ThemeController = new Controller($themeRequest);
  224. $this->ThemePostsController = new ThemePostsController($themeRequest);
  225. $this->ThemePostsController->viewPath = 'posts';
  226. $this->ThemePostsController->index();
  227. $this->ThemeView = new View($this->ThemePostsController);
  228. App::build(array(
  229. 'Plugin' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS),
  230. 'View' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS)
  231. ), App::RESET);
  232. App::objects('plugins', null, false);
  233. CakePlugin::load(array('TestPlugin', 'TestPlugin', 'PluginJs'));
  234. Configure::write('debug', 2);
  235. }
  236. /**
  237. * tearDown method
  238. *
  239. * @return void
  240. */
  241. public function tearDown() {
  242. parent::tearDown();
  243. CakePlugin::unload();
  244. unset($this->View);
  245. unset($this->PostsController);
  246. unset($this->Controller);
  247. unset($this->ThemeView);
  248. unset($this->ThemePostsController);
  249. unset($this->ThemeController);
  250. }
  251. /**
  252. * testGetTemplate method
  253. *
  254. * @return void
  255. */
  256. public function testGetTemplate() {
  257. $this->Controller->plugin = null;
  258. $this->Controller->name = 'Pages';
  259. $this->Controller->viewPath = 'Pages';
  260. $this->Controller->action = 'display';
  261. $this->Controller->params['pass'] = array('home');
  262. $ThemeView = new TestThemeView($this->Controller);
  263. $ThemeView->theme = 'TestTheme';
  264. $expected = CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS . 'Pages' . DS . 'home.ctp';
  265. $result = $ThemeView->getViewFileName('home');
  266. $this->assertEquals($expected, $result);
  267. $expected = CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS . 'Themed' . DS . 'TestTheme' . DS . 'Posts' . DS . 'index.ctp';
  268. $result = $ThemeView->getViewFileName('/Posts/index');
  269. $this->assertEquals($expected, $result);
  270. $expected = CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS . 'Themed' . DS . 'TestTheme' . DS . 'Layouts' . DS . 'default.ctp';
  271. $result = $ThemeView->getLayoutFileName();
  272. $this->assertEquals($expected, $result);
  273. $ThemeView->layoutPath = 'rss';
  274. $expected = CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS . 'Layouts' . DS . 'rss' . DS . 'default.ctp';
  275. $result = $ThemeView->getLayoutFileName();
  276. $this->assertEquals($expected, $result);
  277. $ThemeView->layoutPath = 'Emails' . DS . 'html';
  278. $expected = CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS . 'Layouts' . DS . 'Emails' . DS . 'html' . DS . 'default.ctp';
  279. $result = $ThemeView->getLayoutFileName();
  280. $this->assertEquals($expected, $result);
  281. }
  282. /**
  283. * testPluginGetTemplate method
  284. *
  285. * @return void
  286. */
  287. public function testPluginGetTemplate() {
  288. $this->Controller->plugin = 'TestPlugin';
  289. $this->Controller->name = 'TestPlugin';
  290. $this->Controller->viewPath = 'Tests';
  291. $this->Controller->action = 'index';
  292. $View = new TestView($this->Controller);
  293. $expected = CakePlugin::path('TestPlugin') . 'View' . DS . 'Tests' . DS . 'index.ctp';
  294. $result = $View->getViewFileName('index');
  295. $this->assertEquals($expected, $result);
  296. $expected = CakePlugin::path('TestPlugin') . 'View' . DS . 'Layouts' . DS . 'default.ctp';
  297. $result = $View->getLayoutFileName();
  298. $this->assertEquals($expected, $result);
  299. }
  300. /**
  301. * testPluginGetTemplate method
  302. *
  303. * @return void
  304. */
  305. public function testPluginThemedGetTemplate() {
  306. $this->Controller->plugin = 'TestPlugin';
  307. $this->Controller->name = 'TestPlugin';
  308. $this->Controller->viewPath = 'Tests';
  309. $this->Controller->action = 'index';
  310. $this->Controller->theme = 'TestTheme';
  311. $ThemeView = new TestThemeView($this->Controller);
  312. $expected = CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS . 'Themed' . DS . 'TestTheme' . DS . 'Plugin' . DS . 'TestPlugin' . DS . 'Tests' . DS . 'index.ctp';
  313. $result = $ThemeView->getViewFileName('index');
  314. $this->assertEquals($expected, $result);
  315. $expected = CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS . 'Themed' . DS . 'TestTheme' . DS . 'Plugin' . DS . 'TestPlugin' . DS . 'Layouts' . DS . 'plugin_default.ctp';
  316. $result = $ThemeView->getLayoutFileName('plugin_default');
  317. $this->assertEquals($expected, $result);
  318. $expected = CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS . 'Themed' . DS . 'TestTheme' . DS . 'Layouts' . DS . 'default.ctp';
  319. $result = $ThemeView->getLayoutFileName('default');
  320. $this->assertEquals($expected, $result);
  321. }
  322. /**
  323. * test that plugin/$plugin_name is only appended to the paths it should be.
  324. *
  325. * @return void
  326. */
  327. public function testPluginPathGeneration() {
  328. $this->Controller->plugin = 'TestPlugin';
  329. $this->Controller->name = 'TestPlugin';
  330. $this->Controller->viewPath = 'Tests';
  331. $this->Controller->action = 'index';
  332. $View = new TestView($this->Controller);
  333. $paths = $View->paths();
  334. $expected = array_merge(App::path('View'), App::core('View'), App::core('Console/Templates/skel/View'));
  335. $this->assertEquals($expected, $paths);
  336. $paths = $View->paths('TestPlugin');
  337. $pluginPath = CakePlugin::path('TestPlugin');
  338. $expected = array(
  339. CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS . 'Plugin' . DS . 'TestPlugin' . DS,
  340. $pluginPath . 'View' . DS,
  341. CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS,
  342. CAKE . 'View' . DS,
  343. CAKE . 'Console' . DS . 'Templates' . DS . 'skel' . DS . 'View' . DS
  344. );
  345. $this->assertEquals($expected, $paths);
  346. }
  347. /**
  348. * test that CamelCase plugins still find their view files.
  349. *
  350. * @return void
  351. */
  352. public function testCamelCasePluginGetTemplate() {
  353. $this->Controller->plugin = 'TestPlugin';
  354. $this->Controller->name = 'TestPlugin';
  355. $this->Controller->viewPath = 'Tests';
  356. $this->Controller->action = 'index';
  357. $View = new TestView($this->Controller);
  358. App::build(array(
  359. 'Plugin' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS),
  360. 'View' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS)
  361. ));
  362. $pluginPath = CakePlugin::path('TestPlugin');
  363. $expected = CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS . 'TestPlugin' . DS . 'View' . DS . 'Tests' . DS . 'index.ctp';
  364. $result = $View->getViewFileName('index');
  365. $this->assertEquals($expected, $result);
  366. $expected = $pluginPath . 'View' . DS . 'Layouts' . DS . 'default.ctp';
  367. $result = $View->getLayoutFileName();
  368. $this->assertEquals($expected, $result);
  369. }
  370. /**
  371. * testGetTemplate method
  372. *
  373. * @return void
  374. */
  375. public function testGetViewFileNames() {
  376. $this->Controller->plugin = null;
  377. $this->Controller->name = 'Pages';
  378. $this->Controller->viewPath = 'Pages';
  379. $this->Controller->action = 'display';
  380. $this->Controller->params['pass'] = array('home');
  381. $View = new TestView($this->Controller);
  382. $expected = CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS . 'Pages' . DS . 'home.ctp';
  383. $result = $View->getViewFileName('home');
  384. $this->assertEquals($expected, $result);
  385. $expected = CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS . 'Posts' . DS . 'index.ctp';
  386. $result = $View->getViewFileName('/Posts/index');
  387. $this->assertEquals($expected, $result);
  388. $expected = CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS . 'Posts' . DS . 'index.ctp';
  389. $result = $View->getViewFileName('../Posts/index');
  390. $this->assertEquals($expected, $result);
  391. $expected = CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS . 'Pages' . DS . 'page.home.ctp';
  392. $result = $View->getViewFileName('page.home');
  393. $this->assertEquals($expected, $result, 'Should not ruin files with dots.');
  394. CakePlugin::load('TestPlugin');
  395. $expected = CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS . 'Pages' . DS . 'home.ctp';
  396. $result = $View->getViewFileName('TestPlugin.home');
  397. $this->assertEquals($expected, $result, 'Plugin is missing the view, cascade to app.');
  398. $View->viewPath = 'Tests';
  399. $expected = CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS . 'TestPlugin' . DS . 'View' . DS . 'Tests' . DS . 'index.ctp';
  400. $result = $View->getViewFileName('TestPlugin.index');
  401. $this->assertEquals($expected, $result);
  402. }
  403. /**
  404. * Test getting layout filenames
  405. *
  406. * @return void
  407. */
  408. public function testGetLayoutFileName() {
  409. $this->Controller->plugin = null;
  410. $this->Controller->name = 'Pages';
  411. $this->Controller->viewPath = 'Pages';
  412. $this->Controller->action = 'display';
  413. $View = new TestView($this->Controller);
  414. $expected = CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS . 'Layouts' . DS . 'default.ctp';
  415. $result = $View->getLayoutFileName();
  416. $this->assertEquals($expected, $result);
  417. $View->layoutPath = 'rss';
  418. $expected = CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS . 'Layouts' . DS . 'rss' . DS . 'default.ctp';
  419. $result = $View->getLayoutFileName();
  420. $this->assertEquals($expected, $result);
  421. $View->layoutPath = 'Emails' . DS . 'html';
  422. $expected = CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS . 'Layouts' . DS . 'Emails' . DS . 'html' . DS . 'default.ctp';
  423. $result = $View->getLayoutFileName();
  424. $this->assertEquals($expected, $result);
  425. }
  426. /**
  427. * Test getting layout filenames for plugins.
  428. *
  429. * @return void
  430. */
  431. public function testGetLayoutFileNamePlugin() {
  432. $this->Controller->plugin = null;
  433. $this->Controller->name = 'Pages';
  434. $this->Controller->viewPath = 'Pages';
  435. $this->Controller->action = 'display';
  436. $View = new TestView($this->Controller);
  437. CakePlugin::load('TestPlugin');
  438. $expected = CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS . 'TestPlugin' . DS . 'View' . DS . 'Layouts' . DS . 'default.ctp';
  439. $result = $View->getLayoutFileName('TestPlugin.default');
  440. $this->assertEquals($expected, $result);
  441. $View->plugin = 'TestPlugin';
  442. $expected = CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS . 'TestPlugin' . DS . 'View' . DS . 'Layouts' . DS . 'default.ctp';
  443. $result = $View->getLayoutFileName('default');
  444. $this->assertEquals($expected, $result);
  445. }
  446. /**
  447. * testMissingView method
  448. *
  449. * @expectedException MissingViewException
  450. * @return void
  451. */
  452. public function testMissingView() {
  453. $this->Controller->plugin = null;
  454. $this->Controller->name = 'Pages';
  455. $this->Controller->viewPath = 'Pages';
  456. $this->Controller->action = 'display';
  457. $this->Controller->params['pass'] = array('home');
  458. $View = new TestView($this->Controller);
  459. ob_start();
  460. $result = $View->getViewFileName('does_not_exist');
  461. $this->ThemeController->plugin = null;
  462. $this->ThemeController->name = 'Pages';
  463. $this->ThemeController->viewPath = 'Pages';
  464. $this->ThemeController->action = 'display';
  465. $this->ThemeController->theme = 'my_theme';
  466. $this->ThemeController->params['pass'] = array('home');
  467. $View = new TestThemeView($this->ThemeController);
  468. ob_start();
  469. $result = $View->getViewFileName('does_not_exist');
  470. $expected = ob_get_clean();
  471. $this->assertRegExp("/PagesController::/", $expected);
  472. $this->assertRegExp("/views(\/|\\\)themed(\/|\\\)my_theme(\/|\\\)pages(\/|\\\)does_not_exist.ctp/", $expected);
  473. }
  474. /**
  475. * testMissingLayout method
  476. *
  477. * @expectedException MissingLayoutException
  478. * @return void
  479. */
  480. public function testMissingLayout() {
  481. $this->Controller->plugin = null;
  482. $this->Controller->name = 'Posts';
  483. $this->Controller->viewPath = 'Posts';
  484. $this->Controller->layout = 'whatever';
  485. $View = new TestView($this->Controller);
  486. ob_start();
  487. $result = $View->getLayoutFileName();
  488. $expected = ob_get_clean();
  489. $this->ThemeController->plugin = null;
  490. $this->ThemeController->name = 'Posts';
  491. $this->ThemeController->viewPath = 'posts';
  492. $this->ThemeController->layout = 'whatever';
  493. $this->ThemeController->theme = 'my_theme';
  494. $View = new TestThemeView($this->ThemeController);
  495. ob_start();
  496. $result = $View->getLayoutFileName();
  497. $expected = ob_get_clean();
  498. $this->assertRegExp("/Missing Layout/", $expected);
  499. $this->assertRegExp("/views(\/|\\\)themed(\/|\\\)my_theme(\/|\\\)layouts(\/|\\\)whatever.ctp/", $expected);
  500. }
  501. /**
  502. * testViewVars method
  503. *
  504. * @return void
  505. */
  506. public function testViewVars() {
  507. $this->assertEquals(array('testData' => 'Some test data', 'test2' => 'more data', 'test3' => 'even more data'), $this->View->viewVars);
  508. }
  509. /**
  510. * testUUIDGeneration method
  511. *
  512. * @return void
  513. */
  514. public function testUUIDGeneration() {
  515. $result = $this->View->uuid('form', array('controller' => 'posts', 'action' => 'index'));
  516. $this->assertEquals('form5988016017', $result);
  517. $result = $this->View->uuid('form', array('controller' => 'posts', 'action' => 'index'));
  518. $this->assertEquals('formc3dc6be854', $result);
  519. $result = $this->View->uuid('form', array('controller' => 'posts', 'action' => 'index'));
  520. $this->assertEquals('form28f92cc87f', $result);
  521. }
  522. /**
  523. * testAddInlineScripts method
  524. *
  525. * @return void
  526. */
  527. public function testAddInlineScripts() {
  528. $View = new TestView($this->Controller);
  529. $View->addScript('prototype.js');
  530. $View->addScript('prototype.js');
  531. $this->assertEquals(array('prototype.js'), $View->scripts());
  532. $View->addScript('mainEvent', 'Event.observe(window, "load", function() { doSomething(); }, true);');
  533. $this->assertEquals(array('prototype.js', 'mainEvent' => 'Event.observe(window, "load", function() { doSomething(); }, true);'), $View->scripts());
  534. }
  535. /**
  536. * testElementExists method
  537. *
  538. * @return void
  539. */
  540. public function testElementExists() {
  541. $result = $this->View->elementExists('test_element');
  542. $this->assertTrue($result);
  543. $result = $this->View->elementExists('TestPlugin.plugin_element');
  544. $this->assertTrue($result);
  545. $result = $this->View->elementExists('non_existent_element');
  546. $this->assertFalse($result);
  547. $result = $this->View->elementExists('TestPlugin.element');
  548. $this->assertFalse($result);
  549. $this->View->plugin = 'TestPlugin';
  550. $result = $this->View->elementExists('test_plugin_element');
  551. $this->assertTrue($result);
  552. }
  553. /**
  554. * testElement method
  555. *
  556. * @return void
  557. */
  558. public function testElement() {
  559. $result = $this->View->element('test_element');
  560. $this->assertEquals('this is the test element', $result);
  561. $result = $this->View->element('plugin_element', array(), array('plugin' => 'TestPlugin'));
  562. $this->assertEquals('this is the plugin element using params[plugin]', $result);
  563. $result = $this->View->element('plugin_element', array(), array('plugin' => 'test_plugin'));
  564. $this->assertEquals('this is the plugin element using params[plugin]', $result);
  565. $result = $this->View->element('TestPlugin.plugin_element');
  566. $this->assertEquals('this is the plugin element using params[plugin]', $result);
  567. $this->View->plugin = 'TestPlugin';
  568. $result = $this->View->element('test_plugin_element');
  569. $this->assertEquals('this is the test set using View::$plugin plugin element', $result);
  570. }
  571. /**
  572. * testElementInexistent method
  573. *
  574. * @expectedException PHPUnit_Framework_Error_Notice
  575. * @return void
  576. */
  577. public function testElementInexistent() {
  578. $result = $this->View->element('non_existent_element');
  579. }
  580. /**
  581. * testElementInexistent2 method
  582. *
  583. * @expectedException PHPUnit_Framework_Error_Notice
  584. * @return void
  585. */
  586. public function testElementInexistent2() {
  587. $result = $this->View->element('TestPlugin.plugin_element', array(), array('plugin' => 'test_plugin'));
  588. }
  589. /**
  590. * testElementInexistent3 method
  591. *
  592. * @expectedException PHPUnit_Framework_Error_Notice
  593. * @return void
  594. */
  595. public function testElementInexistent3() {
  596. $result = $this->View->element('test_plugin.plugin_element');
  597. }
  598. /**
  599. * test that elements can have callbacks
  600. *
  601. */
  602. public function testElementCallbacks() {
  603. $this->getMock('Helper', array(), array($this->View), 'ElementCallbackMockHtmlHelper');
  604. $this->View->helpers = array('ElementCallbackMockHtml');
  605. $this->View->loadHelpers();
  606. $this->View->ElementCallbackMockHtml->expects($this->at(0))->method('beforeRender');
  607. $this->View->ElementCallbackMockHtml->expects($this->at(1))->method('afterRender');
  608. $this->View->element('test_element', array(), array('callbacks' => true));
  609. $this->mockObjects[] = $this->View->ElementCallbackMockHtml;
  610. }
  611. /**
  612. * test that additional element viewVars don't get overwritten with helpers.
  613. *
  614. * @return void
  615. */
  616. public function testElementParamsDontOverwriteHelpers() {
  617. $Controller = new ViewPostsController();
  618. $Controller->helpers = array('Form');
  619. $View = new View($Controller);
  620. $result = $View->element('type_check', array('form' => 'string'), array('callbacks' => true));
  621. $this->assertEquals('string', $result);
  622. $View->set('form', 'string');
  623. $result = $View->element('type_check', array(), array('callbacks' => true));
  624. $this->assertEquals('string', $result);
  625. }
  626. /**
  627. * testElementCacheHelperNoCache method
  628. *
  629. * @return void
  630. */
  631. public function testElementCacheHelperNoCache() {
  632. $Controller = new ViewPostsController();
  633. $View = new TestView($Controller);
  634. $helpers = $View->loadHelpers();
  635. $result = $View->element('test_element', array('ram' => 'val', 'test' => array('foo', 'bar')));
  636. $this->assertEquals('this is the test element', $result);
  637. }
  638. /**
  639. * testElementCache method
  640. *
  641. * @return void
  642. */
  643. public function testElementCache() {
  644. Cache::drop('test_view');
  645. Cache::config('test_view', array(
  646. 'engine' => 'File',
  647. 'duration' => '+1 day',
  648. 'path' => CACHE . 'views' . DS,
  649. 'prefix' => ''
  650. ));
  651. Cache::clear(true, 'test_view');
  652. $View = new TestView($this->PostsController);
  653. $View->elementCache = 'test_view';
  654. $result = $View->element('test_element', array(), array('cache' => true));
  655. $expected = 'this is the test element';
  656. $this->assertEquals($expected, $result);
  657. $result = Cache::read('element__test_element_cache_callbacks', 'test_view');
  658. $this->assertEquals($expected, $result);
  659. $result = $View->element('test_element', array('param' => 'one', 'foo' => 'two'), array('cache' => true));
  660. $this->assertEquals($expected, $result);
  661. $result = Cache::read('element__test_element_cache_callbacks_param_foo', 'test_view');
  662. $this->assertEquals($expected, $result);
  663. $result = $View->element('test_element', array(
  664. 'param' => 'one',
  665. 'foo' => 'two'
  666. ), array(
  667. 'cache' => array('key' => 'custom_key')
  668. ));
  669. $result = Cache::read('element_custom_key', 'test_view');
  670. $this->assertEquals($expected, $result);
  671. $View->elementCache = 'default';
  672. $result = $View->element('test_element', array(
  673. 'param' => 'one',
  674. 'foo' => 'two'
  675. ), array(
  676. 'cache' => array('config' => 'test_view'),
  677. ));
  678. $result = Cache::read('element__test_element_cache_callbacks_param_foo', 'test_view');
  679. $this->assertEquals($expected, $result);
  680. Cache::clear(true, 'test_view');
  681. Cache::drop('test_view');
  682. }
  683. /**
  684. * test __get allowing access to helpers.
  685. *
  686. * @return void
  687. */
  688. public function testMagicGet() {
  689. $View = new View($this->PostsController);
  690. $View->loadHelper('Html');
  691. $this->assertInstanceOf('HtmlHelper', $View->Html);
  692. }
  693. /**
  694. * test that ctp is used as a fallback file extension for elements
  695. *
  696. * @return void
  697. */
  698. public function testElementCtpFallback() {
  699. $View = new TestView($this->PostsController);
  700. $View->ext = '.missing';
  701. $element = 'test_element';
  702. $expected = 'this is the test element';
  703. $result = $View->element($element);
  704. $this->assertEquals($expected, $result);
  705. }
  706. /**
  707. * testLoadHelpers method
  708. *
  709. * @return void
  710. */
  711. public function testLoadHelpers() {
  712. $View = new View($this->PostsController);
  713. $View->helpers = array('Html', 'Form');
  714. $View->loadHelpers();
  715. $this->assertInstanceOf('HtmlHelper', $View->Html, 'Object type is wrong.');
  716. $this->assertInstanceOf('FormHelper', $View->Form, 'Object type is wrong.');
  717. }
  718. /**
  719. * test lazy loading helpers
  720. *
  721. * @return void
  722. */
  723. public function testLazyLoadHelpers() {
  724. $View = new View($this->PostsController);
  725. $View->helpers = array();
  726. $this->assertInstanceOf('HtmlHelper', $View->Html, 'Object type is wrong.');
  727. $this->assertInstanceOf('FormHelper', $View->Form, 'Object type is wrong.');
  728. }
  729. /**
  730. * test the correct triggering of helper callbacks
  731. *
  732. * @return void
  733. */
  734. public function testHelperCallbackTriggering() {
  735. $View = new View($this->PostsController);
  736. $View->helpers = array();
  737. $View->Helpers = $this->getMock('HelperCollection', array('trigger'), array($View));
  738. $View->Helpers->expects($this->at(0))->method('trigger')
  739. ->with(
  740. $this->logicalAnd(
  741. $this->isInstanceOf('CakeEvent'),
  742. $this->attributeEqualTo('_name', 'View.beforeRender'),
  743. $this->attributeEqualTo('_subject', $View)
  744. )
  745. );
  746. $View->Helpers->expects($this->at(1))->method('trigger')
  747. ->with(
  748. $this->logicalAnd(
  749. $this->isInstanceOf('CakeEvent'),
  750. $this->attributeEqualTo('_name', 'View.beforeRenderFile'),
  751. $this->attributeEqualTo('_subject', $View)
  752. )
  753. );
  754. $View->Helpers->expects($this->at(2))->method('trigger')
  755. ->with(
  756. $this->logicalAnd(
  757. $this->isInstanceOf('CakeEvent'),
  758. $this->attributeEqualTo('_name', 'View.afterRenderFile'),
  759. $this->attributeEqualTo('_subject', $View)
  760. )
  761. );
  762. $View->Helpers->expects($this->at(3))->method('trigger')
  763. ->with(
  764. $this->logicalAnd(
  765. $this->isInstanceOf('CakeEvent'),
  766. $this->attributeEqualTo('_name', 'View.afterRender'),
  767. $this->attributeEqualTo('_subject', $View)
  768. )
  769. );
  770. $View->Helpers->expects($this->at(4))->method('trigger')
  771. ->with(
  772. $this->logicalAnd(
  773. $this->isInstanceOf('CakeEvent'),
  774. $this->attributeEqualTo('_name', 'View.beforeLayout'),
  775. $this->attributeEqualTo('_subject', $View)
  776. )
  777. );
  778. $View->Helpers->expects($this->at(5))->method('trigger')
  779. ->with(
  780. $this->logicalAnd(
  781. $this->isInstanceOf('CakeEvent'),
  782. $this->attributeEqualTo('_name', 'View.beforeRenderFile'),
  783. $this->attributeEqualTo('_subject', $View)
  784. )
  785. );
  786. $View->Helpers->expects($this->at(6))->method('trigger')
  787. ->with(
  788. $this->logicalAnd(
  789. $this->isInstanceOf('CakeEvent'),
  790. $this->attributeEqualTo('_name', 'View.afterRenderFile'),
  791. $this->attributeEqualTo('_subject', $View)
  792. )
  793. );
  794. $View->Helpers->expects($this->at(7))->method('trigger')
  795. ->with(
  796. $this->logicalAnd(
  797. $this->isInstanceOf('CakeEvent'),
  798. $this->attributeEqualTo('_name', 'View.afterLayout'),
  799. $this->attributeEqualTo('_subject', $View)
  800. )
  801. );
  802. $View->render('index');
  803. }
  804. /**
  805. * testBeforeLayout method
  806. *
  807. * @return void
  808. */
  809. public function testBeforeLayout() {
  810. $this->PostsController->helpers = array('Session', 'TestAfter', 'Html');
  811. $View = new View($this->PostsController);
  812. $View->render('index');
  813. $this->assertEquals('Valuation', $View->Helpers->TestAfter->property);
  814. }
  815. /**
  816. * testAfterLayout method
  817. *
  818. * @return void
  819. */
  820. public function testAfterLayout() {
  821. $this->PostsController->helpers = array('Session', 'TestAfter', 'Html');
  822. $this->PostsController->set('variable', 'values');
  823. $View = new View($this->PostsController);
  824. ClassRegistry::addObject('afterView', $View);
  825. $content = 'This is my view output';
  826. $result = $View->renderLayout($content, 'default');
  827. $this->assertRegExp('/modified in the afterlife/', $result);
  828. $this->assertRegExp('/This is my view output/', $result);
  829. }
  830. /**
  831. * testRenderLoadHelper method
  832. *
  833. * @return void
  834. */
  835. public function testRenderLoadHelper() {
  836. $this->PostsController->helpers = array('Session', 'Html', 'Form', 'Number');
  837. $View = new TestView($this->PostsController);
  838. $result = $View->render('index', false);
  839. $this->assertEquals('posts index', $result);
  840. $attached = $View->Helpers->loaded();
  841. $this->assertEquals(array('Session', 'Html', 'Form', 'Number'), $attached);
  842. $this->PostsController->helpers = array('Html', 'Form', 'Number', 'TestPlugin.PluggedHelper');
  843. $View = new TestView($this->PostsController);
  844. $result = $View->render('index', false);
  845. $this->assertEquals('posts index', $result);
  846. $attached = $View->Helpers->loaded();
  847. $expected = array('Html', 'Form', 'Number', 'PluggedHelper');
  848. $this->assertEquals($expected, $attached, 'Attached helpers are wrong.');
  849. }
  850. /**
  851. * testRender method
  852. *
  853. * @return void
  854. */
  855. public function testRender() {
  856. $View = new TestView($this->PostsController);
  857. $result = $View->render('index');
  858. $this->assertRegExp("/<meta http-equiv=\"Content-Type\" content=\"text\/html; charset=utf-8\" \/>\s*<title>/", $result);
  859. $this->assertRegExp("/<div id=\"content\">\s*posts index\s*<\/div>/", $result);
  860. $this->assertRegExp("/<div id=\"content\">\s*posts index\s*<\/div>/", $result);
  861. $this->assertTrue(isset($View->viewVars['content_for_layout']), 'content_for_layout should be a view var');
  862. $this->assertTrue(isset($View->viewVars['scripts_for_layout']), 'scripts_for_layout should be a view var');
  863. $this->PostsController->set('url', 'flash');
  864. $this->PostsController->set('message', 'yo what up');
  865. $this->PostsController->set('pause', 3);
  866. $this->PostsController->set('page_title', 'yo what up');
  867. $View = new TestView($this->PostsController);
  868. $result = $View->render(false, 'flash');
  869. $this->assertRegExp("/<title>yo what up<\/title>/", $result);
  870. $this->assertRegExp("/<p><a href=\"flash\">yo what up<\/a><\/p>/", $result);
  871. $this->assertTrue($View->render(false, 'flash'));
  872. $this->PostsController->helpers = array('Session', 'Cache', 'Html');
  873. $this->PostsController->constructClasses();
  874. $this->PostsController->cacheAction = array('index' => 3600);
  875. $this->PostsController->request->params['action'] = 'index';
  876. Configure::write('Cache.check', true);
  877. $View = new TestView($this->PostsController);
  878. $result = $View->render('index');
  879. $this->assertRegExp("/<meta http-equiv=\"Content-Type\" content=\"text\/html; charset=utf-8\" \/>\s*<title>/", $result);
  880. $this->assertRegExp("/<div id=\"content\">\s*posts index\s*<\/div>/", $result);
  881. $this->assertRegExp("/<div id=\"content\">\s*posts index\s*<\/div>/", $result);
  882. }
  883. /**
  884. * test that View::$view works
  885. *
  886. * @return void
  887. */
  888. public function testRenderUsingViewProperty() {
  889. $this->PostsController->view = 'cache_form';
  890. $View = new TestView($this->PostsController);
  891. $this->assertEquals('cache_form', $View->view);
  892. $result = $View->render();
  893. $this->assertRegExp('/Add User/', $result);
  894. }
  895. /**
  896. * Test render()ing a file in a subdir from a custom viewPath
  897. * in a plugin.
  898. *
  899. * @return void
  900. */
  901. public function testGetViewFileNameSubdirWithPluginAndViewPath() {
  902. $this->PostsController->plugin = 'TestPlugin';
  903. $this->PostsController->viewPath = 'Elements';
  904. $this->PostsController->name = 'Posts';
  905. $View = new TestView($this->PostsController);
  906. $expected = CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS . 'TestPlugin' .
  907. DS . 'View' . DS . 'Elements' . DS . 'sub_dir' . DS . 'sub_element.ctp';
  908. $this->assertEquals($expected, $View->getViewFileName('sub_dir/sub_element'));
  909. }
  910. /**
  911. * test that view vars can replace the local helper variables
  912. * and not overwrite the $this->Helper references
  913. *
  914. * @return void
  915. */
  916. public function testViewVarOverwritingLocalHelperVar() {
  917. $Controller = new ViewPostsController();
  918. $Controller->helpers = array('Session', 'Html');
  919. $Controller->set('html', 'I am some test html');
  920. $View = new View($Controller);
  921. $result = $View->render('helper_overwrite', false);
  922. $this->assertRegExp('/I am some test html/', $result);
  923. $this->assertRegExp('/Test link/', $result);
  924. }
  925. /**
  926. * testGetViewFileName method
  927. *
  928. * @return void
  929. */
  930. public function testViewFileName() {
  931. $View = new TestView($this->PostsController);
  932. $result = $View->getViewFileName('index');
  933. $this->assertRegExp('/Posts(\/|\\\)index.ctp/', $result);
  934. $result = $View->getViewFileName('TestPlugin.index');
  935. $this->assertRegExp('/Posts(\/|\\\)index.ctp/', $result);
  936. $result = $View->getViewFileName('/Pages/home');
  937. $this->assertRegExp('/Pages(\/|\\\)home.ctp/', $result);
  938. $result = $View->getViewFileName('../Elements/test_element');
  939. $this->assertRegExp('/Elements(\/|\\\)test_element.ctp/', $result);
  940. $result = $View->getViewFileName('../Themed/TestTheme/Posts/index');
  941. $this->assertRegExp('/Themed(\/|\\\)TestTheme(\/|\\\)Posts(\/|\\\)index.ctp/', $result);
  942. $expected = CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS . 'Posts' . DS . 'index.ctp';
  943. $result = $View->getViewFileName('../Posts/index');
  944. $this->assertEquals($expected, $result);
  945. }
  946. /**
  947. * testRenderCache method
  948. *
  949. * @return void
  950. */
  951. public function testRenderCache() {
  952. $this->skipIf(!is_writable(CACHE . 'views' . DS), 'CACHE/views dir is not writable, cannot test renderCache.');
  953. $view = 'test_view';
  954. $View = new View($this->PostsController);
  955. $path = CACHE . 'views' . DS . 'view_cache_' . $view;
  956. $cacheText = '<!--cachetime:' . time() . '-->some cacheText';
  957. $f = fopen($path, 'w+');
  958. fwrite($f, $cacheText);
  959. fclose($f);
  960. $result = $View->renderCache($path, '+1 second');
  961. $this->assertFalse($result);
  962. if (file_exists($path)) {
  963. unlink($path);
  964. }
  965. $cacheText = '<!--cachetime:' . (time() + 10) . '-->some cacheText';
  966. $f = fopen($path, 'w+');
  967. fwrite($f, $cacheText);
  968. fclose($f);
  969. $result = $View->renderCache($path, '+1 second');
  970. $this->assertRegExp('/^some cacheText/', $result);
  971. if (file_exists($path)) {
  972. unlink($path);
  973. }
  974. }
  975. /**
  976. * Test that render() will remove the cake:nocache tags when only the cachehelper is present.
  977. *
  978. * @return void
  979. */
  980. public function testRenderStrippingNoCacheTagsOnlyCacheHelper() {
  981. Configure::write('Cache.check', false);
  982. $View = new View($this->PostsController);
  983. $View->set(array('superman' => 'clark', 'variable' => 'var'));
  984. $View->helpers = array('Html', 'Form', 'Cache');
  985. $View->layout = 'cache_layout';
  986. $result = $View->render('index');
  987. $this->assertNotRegExp('/cake:nocache/', $result);
  988. }
  989. /**
  990. * Test that render() will remove the cake:nocache tags when only the Cache.check is true.
  991. *
  992. * @return void
  993. */
  994. public function testRenderStrippingNoCacheTagsOnlyCacheCheck() {
  995. Configure::write('Cache.check', true);
  996. $View = new View($this->PostsController);
  997. $View->set(array('superman' => 'clark', 'variable' => 'var'));
  998. $View->helpers = array('Html', 'Form');
  999. $View->layout = 'cache_layout';
  1000. $result = $View->render('index');
  1001. $this->assertNotRegExp('/cake:nocache/', $result);
  1002. }
  1003. /**
  1004. * testSet method
  1005. *
  1006. * @return void
  1007. */
  1008. public function testSet() {
  1009. $View = new TestView($this->PostsController);
  1010. $View->viewVars = array();
  1011. $View->set('somekey', 'someValue');
  1012. $this->assertSame($View->viewVars, array('somekey' => 'someValue'));
  1013. $this->assertSame($View->getVars(), array('somekey'));
  1014. $View->viewVars = array();
  1015. $keys = array('key1', 'key2');
  1016. $values = array('value1', 'value2');
  1017. $View->set($keys, $values);
  1018. $this->assertSame($View->viewVars, array('key1' => 'value1', 'key2' => 'value2'));
  1019. $this->assertSame($View->getVars(), array('key1', 'key2'));
  1020. $this->assertSame($View->getVar('key1'), 'value1');
  1021. $this->assertNull($View->getVar('key3'));
  1022. $View->set(array('key3' => 'value3'));
  1023. $this->assertSame($View->getVar('key3'), 'value3');
  1024. $View->viewVars = array();
  1025. $View->set(array(3 => 'three', 4 => 'four'));
  1026. $View->set(array(1 => 'one', 2 => 'two'));
  1027. $expected = array(3 => 'three', 4 => 'four', 1 => 'one', 2 => 'two');
  1028. $this->assertEquals($expected, $View->viewVars);
  1029. }
  1030. /**
  1031. * testBadExt method
  1032. *
  1033. * @expectedException MissingViewException
  1034. * @return void
  1035. */
  1036. public function testBadExt() {
  1037. $this->PostsController->action = 'something';
  1038. $this->PostsController->ext = '.whatever';
  1039. $View = new TestView($this->PostsController);
  1040. $View->render('this_is_missing');
  1041. }
  1042. /**
  1043. * testAltExt method
  1044. *
  1045. * @return void
  1046. */
  1047. public function testAltExt() {
  1048. $this->PostsController->ext = '.alt';
  1049. $View = new TestView($this->PostsController);
  1050. $result = $View->render('alt_ext', false);
  1051. $this->assertEquals('alt ext', $result);
  1052. }
  1053. /**
  1054. * testAltBadExt method
  1055. *
  1056. * @expectedException MissingViewException
  1057. * @return void
  1058. */
  1059. public function testAltBadExt() {
  1060. $View = new TestView($this->PostsController);
  1061. $View->render('alt_ext');
  1062. }
  1063. /**
  1064. * Test creating a block with capturing output.
  1065. *
  1066. * @return void
  1067. */
  1068. public function testBlockCapture() {
  1069. $this->View->start('test');
  1070. echo 'Block content';
  1071. $this->View->end();
  1072. $result = $this->View->fetch('test');
  1073. $this->assertEquals('Block content', $result);
  1074. }
  1075. /**
  1076. * Test block with startIfEmpty
  1077. *
  1078. * @return void
  1079. */
  1080. public function testBlockCaptureStartIfEmpty() {
  1081. $this->View->startIfEmpty('test');
  1082. echo "Block content 1";
  1083. $this->View->end();
  1084. $this->View->startIfEmpty('test');
  1085. echo "Block content 2";
  1086. $this->View->end();
  1087. $result = $this->View->fetch('test');
  1088. $this->assertEquals('Block content 1', $result);
  1089. }
  1090. /**
  1091. * Test block with startIfEmpty
  1092. *
  1093. * @return void
  1094. */
  1095. public function testBlockCaptureStartStartIfEmpty() {
  1096. $this->View->start('test');
  1097. echo "Block content 1";
  1098. $this->View->end();
  1099. $this->View->startIfEmpty('test');
  1100. echo "Block content 2";
  1101. $this->View->end();
  1102. $result = $this->View->fetch('test');
  1103. $this->assertEquals('Block content 1', $result);
  1104. }
  1105. /**
  1106. * Test appending to a block with capturing output.
  1107. *
  1108. * @return void
  1109. */
  1110. public function testBlockCaptureAppend() {
  1111. $this->View->start('test');
  1112. echo 'Block';
  1113. $this->View->end();
  1114. $this->View->append('test');
  1115. echo ' content';
  1116. $this->View->end();
  1117. $result = $this->View->fetch('test');
  1118. $this->assertEquals('Block content', $result);
  1119. }
  1120. /**
  1121. * Test setting a block's content.
  1122. *
  1123. * @return void
  1124. */
  1125. public function testBlockSet() {
  1126. $this->View->assign('test', 'Block content');
  1127. $result = $this->View->fetch('test');
  1128. $this->assertEquals('Block content', $result);
  1129. }
  1130. /**
  1131. * Test appending to a block with append.
  1132. *
  1133. * @return void
  1134. */
  1135. public function testBlockAppend() {
  1136. $this->View->assign('test', 'Block');
  1137. $this->View->append('test', ' content');
  1138. $result = $this->View->fetch('test');
  1139. $this->assertEquals('Block content', $result);
  1140. }
  1141. /**
  1142. * Test prepending to a block with append.
  1143. *
  1144. * @return void
  1145. */
  1146. public function testBlockPrepend() {
  1147. $this->View->assign('test', 'Block');
  1148. $this->View->prepend('test', 'Before ');
  1149. $result = $this->View->fetch('test');
  1150. $this->assertEquals('Before Block', $result);
  1151. }
  1152. /**
  1153. * You should be able to append to undefined blocks.
  1154. *
  1155. * @return void
  1156. */
  1157. public function testBlockAppendUndefined() {
  1158. $this->View->append('test', 'Unknown');
  1159. $result = $this->View->fetch('test');
  1160. $this->assertEquals('Unknown', $result);
  1161. }
  1162. /**
  1163. * You should be able to prepend to undefined blocks.
  1164. *
  1165. * @return void
  1166. */
  1167. public function testBlockPrependUndefined() {
  1168. $this->View->prepend('test', 'Unknown');
  1169. $result = $this->View->fetch('test');
  1170. $this->assertEquals('Unknown', $result);
  1171. }
  1172. /**
  1173. * setting an array should cause an exception.
  1174. *
  1175. * @expectedException CakeException
  1176. * @return void
  1177. */
  1178. public function testBlockSetArrayException() {
  1179. $this->View->assign('test', array(1, 2, 3));
  1180. }
  1181. /**
  1182. * Appending an array should cause an exception.
  1183. *
  1184. * @expectedException CakeException
  1185. * @return void
  1186. */
  1187. public function testBlockAppendArrayException() {
  1188. $this->View->append('test', array(1, 2, 3));
  1189. }
  1190. /**
  1191. * Test getting block names
  1192. *
  1193. * @return void
  1194. */
  1195. public function testBlocks() {
  1196. $this->View->append('test', 'one');
  1197. $this->View->assign('test1', 'one');
  1198. $this->assertEquals(array('test', 'test1'), $this->View->blocks());
  1199. }
  1200. /**
  1201. * Test that blocks can be nested.
  1202. *
  1203. * @return void
  1204. */
  1205. public function testNestedBlocks() {
  1206. $this->View->start('first');
  1207. echo 'In first ';
  1208. $this->View->start('second');
  1209. echo 'In second';
  1210. $this->View->end();
  1211. echo 'In first';
  1212. $this->View->end();
  1213. $this->assertEquals('In first In first', $this->View->fetch('first'));
  1214. $this->assertEquals('In second', $this->View->fetch('second'));
  1215. }
  1216. /**
  1217. * Test that an exception gets thrown when you leave a block open at the end
  1218. * of a view.
  1219. *
  1220. * @expectedException CakeException
  1221. * @return void
  1222. */
  1223. public function testExceptionOnOpenBlock() {
  1224. $this->View->render('open_block');
  1225. }
  1226. /**
  1227. * Test nested extended views.
  1228. *
  1229. * @return void
  1230. */
  1231. public function testExtendNested() {
  1232. $this->View->layout = false;
  1233. $content = $this->View->render('nested_extends');
  1234. $expected = <<<TEXT
  1235. This is the second parent.
  1236. This is the first parent.
  1237. This is the first template.
  1238. Sidebar Content.
  1239. TEXT;
  1240. $this->assertEquals($expected, $content);
  1241. }
  1242. /**
  1243. * Make sure that extending the current view with itself causes an exception
  1244. *
  1245. * @expectedException LogicException
  1246. * @return void
  1247. */
  1248. public function testExtendSelf() {
  1249. $this->View->layout = false;
  1250. $this->View->render('extend_self');
  1251. }
  1252. /**
  1253. * Make sure that extending in a loop causes an exception
  1254. *
  1255. * @expectedException LogicException
  1256. * @return void
  1257. */
  1258. public function testExtendLoop() {
  1259. $this->View->layout = false;
  1260. $this->View->render('extend_loop');
  1261. }
  1262. /**
  1263. * Test extend() in an element and a view.
  1264. *
  1265. * @return void
  1266. */
  1267. public function testExtendElement() {
  1268. $this->View->layout = false;
  1269. $content = $this->View->render('extend_element');
  1270. $expected = <<<TEXT
  1271. Parent View.
  1272. View content.
  1273. Parent Element.
  1274. Element content.
  1275. TEXT;
  1276. $this->assertEquals($expected, $content);
  1277. }
  1278. /**
  1279. * Extending an element which doesn't exist should throw a missing view exception
  1280. *
  1281. * @expectedException LogicException
  1282. * @return void
  1283. */
  1284. public function testExtendMissingElement() {
  1285. $this->View->layout = false;
  1286. $this->View->render('extend_missing_element');
  1287. }
  1288. /**
  1289. * Test extend() preceeded by an element()
  1290. *
  1291. * @return void
  1292. */
  1293. public function testExtendWithElementBeforeExtend() {
  1294. $this->View->layout = false;
  1295. $result = $this->View->render('extend_with_element');
  1296. $expected = <<<TEXT
  1297. Parent View.
  1298. this is the test elementThe view
  1299. TEXT;
  1300. $this->assertEquals($expected, $result);
  1301. }
  1302. /**
  1303. * Test that setting arbitrary properties still works.
  1304. *
  1305. * @return void
  1306. */
  1307. public function testPropertySetting() {
  1308. $this->assertFalse(isset($this->View->pageTitle));
  1309. $this->View->pageTitle = 'test';
  1310. $this->assertTrue(isset($this->View->pageTitle));
  1311. $this->assertTrue(!empty($this->View->pageTitle));
  1312. $this->assertEquals('test', $this->View->pageTitle);
  1313. }
  1314. /**
  1315. * Test that setting arbitrary properties still works.
  1316. *
  1317. * @return void
  1318. */
  1319. public function testPropertySettingMagicGet() {
  1320. $this->assertFalse(isset($this->View->action));
  1321. $this->View->request->params['action'] = 'login';
  1322. $this->assertEquals('login', $this->View->action);
  1323. $this->assertTrue(isset($this->View->action));
  1324. $this->assertTrue(!empty($this->View->action));
  1325. }
  1326. /**
  1327. * test memory leaks that existed in _paths at one point.
  1328. *
  1329. * @return void
  1330. */
  1331. public function testMemoryLeakInPaths() {
  1332. $this->ThemeController->plugin = null;
  1333. $this->ThemeController->name = 'Posts';
  1334. $this->ThemeController->viewPath = 'posts';
  1335. $this->ThemeController->layout = 'whatever';
  1336. $this->ThemeController->theme = 'TestTheme';
  1337. $View = new View($this->ThemeController);
  1338. $View->element('test_element');
  1339. $start = memory_get_usage();
  1340. for ($i = 0; $i < 10; $i++) {
  1341. $View->element('test_element');
  1342. }
  1343. $end = memory_get_usage();
  1344. $this->assertLessThanOrEqual($start + 5000, $end);
  1345. }
  1346. /**
  1347. * tests that a vew block uses default value when not assigned and uses assigned value when it is
  1348. *
  1349. * @return void
  1350. */
  1351. public function testBlockDefaultValue() {
  1352. $default = 'Default';
  1353. $result = $this->View->fetch('title', $default);
  1354. $this->assertEquals($default, $result);
  1355. $expected = 'My Title';
  1356. $this->View->assign('title', $expected);
  1357. $result = $this->View->fetch('title', $default);
  1358. $this->assertEquals($expected, $result);
  1359. }
  1360. }