LayoutTest.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543
  1. <?php
  2. // Call Zend_Layout_LayoutTest::main() if this source file is executed directly.
  3. if (!defined("PHPUnit_MAIN_METHOD")) {
  4. define("PHPUnit_MAIN_METHOD", "Zend_Layout_LayoutTest::main");
  5. }
  6. require_once dirname(__FILE__) . '/../../TestHelper.php';
  7. require_once "PHPUnit/Framework/TestCase.php";
  8. require_once "PHPUnit/Framework/TestSuite.php";
  9. require_once 'Zend/Layout.php';
  10. require_once 'Zend/Layout/Controller/Plugin/Layout.php';
  11. require_once 'Zend/Layout/Controller/Action/Helper/Layout.php';
  12. require_once 'Zend/Controller/Front.php';
  13. require_once 'Zend/Controller/Action/HelperBroker.php';
  14. require_once 'Zend/Filter/Inflector.php';
  15. require_once 'Zend/View/Interface.php';
  16. require_once 'Zend/View.php';
  17. /**
  18. * Test class for Zend_Layout.
  19. */
  20. class Zend_Layout_LayoutTest extends PHPUnit_Framework_TestCase
  21. {
  22. /**
  23. * Runs the test methods of this class.
  24. *
  25. * @return void
  26. */
  27. public static function main()
  28. {
  29. require_once "PHPUnit/TextUI/TestRunner.php";
  30. $suite = new PHPUnit_Framework_TestSuite("Zend_Layout_LayoutTest");
  31. $result = PHPUnit_TextUI_TestRunner::run($suite);
  32. }
  33. /**
  34. * Sets up the fixture, for example, open a network connection.
  35. * This method is called before a test is executed.
  36. *
  37. * @return void
  38. */
  39. public function setUp()
  40. {
  41. Zend_Layout_LayoutTest_Override::$_mvcInstance = null;
  42. Zend_Controller_Front::getInstance()->resetInstance();
  43. if (Zend_Controller_Action_HelperBroker::hasHelper('Layout')) {
  44. Zend_Controller_Action_HelperBroker::removeHelper('Layout');
  45. }
  46. if (Zend_Controller_Action_HelperBroker::hasHelper('viewRenderer')) {
  47. Zend_Controller_Action_HelperBroker::removeHelper('viewRenderer');
  48. }
  49. }
  50. /**
  51. * Tears down the fixture, for example, close a network connection.
  52. * This method is called after a test is executed.
  53. *
  54. * @return void
  55. */
  56. public function tearDown()
  57. {
  58. Zend_Layout::resetMvcInstance();
  59. }
  60. public function testDefaultLayoutStatusAtInitialization()
  61. {
  62. $layout = new Zend_Layout();
  63. $this->assertEquals('layout', $layout->getLayout());
  64. $this->assertEquals('content', $layout->getContentKey());
  65. $this->assertTrue($layout->isEnabled());
  66. $this->assertTrue($layout->inflectorEnabled());
  67. $this->assertNull($layout->getLayoutPath());
  68. $this->assertFalse($layout->getMvcEnabled());
  69. }
  70. public function testDefaultLayoutStatusAtInitializationWhenInitMvcFlagPassed()
  71. {
  72. $layout = new Zend_Layout(null, true);
  73. $this->assertEquals('layout', $layout->getLayout());
  74. $this->assertEquals('content', $layout->getContentKey());
  75. $this->assertTrue($layout->isEnabled());
  76. $this->assertTrue($layout->inflectorEnabled());
  77. $this->assertNull($layout->getLayoutPath());
  78. $this->assertTrue($layout->getMvcEnabled());
  79. }
  80. /**
  81. * @return void
  82. */
  83. public function testSetConfigModifiesAttributes()
  84. {
  85. $layout = new Zend_Layout();
  86. require_once 'Zend/Config.php';
  87. $config = new Zend_Config(array(
  88. 'layout' => 'foo',
  89. 'contentKey' => 'foo',
  90. 'layoutPath' => dirname(__FILE__),
  91. 'mvcEnabled' => false,
  92. ));
  93. $layout->setConfig($config);
  94. $this->assertEquals('foo', $layout->getLayout());
  95. $this->assertEquals('foo', $layout->getContentKey());
  96. $this->assertEquals(dirname(__FILE__), $layout->getLayoutPath());
  97. $this->assertFalse($layout->getMvcEnabled());
  98. }
  99. /**
  100. * @return void
  101. */
  102. public function testSetOptionsWithConfigObjectModifiesAttributes()
  103. {
  104. $layout = new Zend_Layout();
  105. require_once 'Zend/Config.php';
  106. $config = new Zend_Config(array(
  107. 'layout' => 'foo',
  108. 'contentKey' => 'foo',
  109. 'layoutPath' => dirname(__FILE__),
  110. 'mvcEnabled' => false,
  111. ));
  112. $layout->setOptions($config);
  113. $this->assertEquals('foo', $layout->getLayout());
  114. $this->assertEquals('foo', $layout->getContentKey());
  115. $this->assertEquals(dirname(__FILE__), $layout->getLayoutPath());
  116. $this->assertFalse($layout->getMvcEnabled());
  117. }
  118. /**
  119. * @return void
  120. */
  121. public function testLayoutAccessorsModifyAndRetrieveLayoutValue()
  122. {
  123. $layout = new Zend_Layout();
  124. $layout->setLayout('foo');
  125. $this->assertEquals('foo', $layout->getLayout());
  126. }
  127. /**
  128. * @return void
  129. */
  130. public function testSetLayoutEnablesLayouts()
  131. {
  132. $layout = new Zend_Layout();
  133. $layout->disableLayout();
  134. $this->assertFalse($layout->isEnabled());
  135. $layout->setLayout('foo');
  136. $this->assertTrue($layout->isEnabled());
  137. }
  138. /**
  139. * @return void
  140. */
  141. public function testDisableLayoutDisablesLayouts()
  142. {
  143. $layout = new Zend_Layout();
  144. $this->assertTrue($layout->isEnabled());
  145. $layout->disableLayout();
  146. $this->assertFalse($layout->isEnabled());
  147. }
  148. /**
  149. * @return void
  150. */
  151. public function testEnableLayoutEnablesLayouts()
  152. {
  153. $layout = new Zend_Layout();
  154. $this->assertTrue($layout->isEnabled());
  155. $layout->disableLayout();
  156. $this->assertFalse($layout->isEnabled());
  157. $layout->enableLayout();
  158. $this->assertTrue($layout->isEnabled());
  159. }
  160. /**
  161. * @return void
  162. */
  163. public function testLayoutPathAccessorsWork()
  164. {
  165. $layout = new Zend_Layout();
  166. $layout->setLayoutPath(dirname(__FILE__));
  167. $this->assertEquals(dirname(__FILE__), $layout->getLayoutPath());
  168. }
  169. /**
  170. * @return void
  171. */
  172. public function testContentKeyAccessorsWork()
  173. {
  174. $layout = new Zend_Layout();
  175. $layout->setContentKey('foo');
  176. $this->assertEquals('foo', $layout->getContentKey());
  177. }
  178. /**
  179. * @return void
  180. */
  181. public function testMvcEnabledFlagFalseAfterStandardInstantiation()
  182. {
  183. $layout = new Zend_Layout();
  184. $this->assertFalse($layout->getMvcEnabled());
  185. }
  186. /**
  187. * @return void
  188. */
  189. public function testMvcEnabledFlagTrueWhenInstantiatedViaStartMvcMethod()
  190. {
  191. $layout = Zend_Layout::startMvc();
  192. $this->assertTrue($layout->getMvcEnabled());
  193. }
  194. /**
  195. * @return void
  196. */
  197. public function testGetViewRetrievesViewWhenNoneSet()
  198. {
  199. $layout = new Zend_Layout();
  200. $view = $layout->getView();
  201. $this->assertTrue($view instanceof Zend_View_Interface);
  202. }
  203. /**
  204. * @return void
  205. */
  206. public function testGetViewRetrievesViewFromViewRenderer()
  207. {
  208. $layout = new Zend_Layout();
  209. $view = $layout->getView();
  210. $vr = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
  211. $this->assertSame($vr->view, $view);
  212. }
  213. /**
  214. * @return void
  215. */
  216. public function testViewAccessorsAllowSettingView()
  217. {
  218. $layout = new Zend_Layout();
  219. $view = new Zend_View();
  220. $layout->setView($view);
  221. $received = $layout->getView();
  222. $this->assertSame($view, $received);
  223. }
  224. /**
  225. * @return void
  226. */
  227. public function testInflectorAccessorsWork()
  228. {
  229. $layout = new Zend_Layout();
  230. $inflector = new Zend_Filter_Inflector();
  231. $layout->setInflector($inflector);
  232. $this->assertSame($inflector, $layout->getInflector());
  233. }
  234. /**
  235. * @return void
  236. */
  237. public function testPluginClassAccessorsSetState()
  238. {
  239. $layout = new Zend_Layout();
  240. $layout->setPluginClass('Foo_Bar');
  241. $this->assertEquals('Foo_Bar', $layout->getPluginClass());
  242. }
  243. /**
  244. * @return void
  245. */
  246. public function testPluginClassPassedToStartMvcIsUsed()
  247. {
  248. $layout = Zend_Layout::startMvc(array('pluginClass' => 'Zend_Layout_LayoutTest_Controller_Plugin_Layout'));
  249. $this->assertTrue(Zend_Controller_Front::getInstance()->hasPlugin('Zend_Layout_LayoutTest_Controller_Plugin_Layout'));
  250. }
  251. /**
  252. * @return void
  253. */
  254. public function testHelperClassAccessorsSetState()
  255. {
  256. $layout = new Zend_Layout();
  257. $layout->setHelperClass('Foo_Bar');
  258. $this->assertEquals('Foo_Bar', $layout->getHelperClass());
  259. }
  260. /**
  261. * @return void
  262. */
  263. public function testHelperClassPassedToStartMvcIsUsed()
  264. {
  265. $layout = Zend_Layout::startMvc(array('helperClass' => 'Zend_Layout_LayoutTest_Controller_Action_Helper_Layout'));
  266. $this->assertTrue(Zend_Controller_Action_HelperBroker::hasHelper('layout'));
  267. $helper = Zend_Controller_Action_HelperBroker::getStaticHelper('layout');
  268. $this->assertTrue($helper instanceof Zend_Layout_LayoutTest_Controller_Action_Helper_Layout);
  269. }
  270. /**
  271. * @return void
  272. */
  273. public function testEnableInflector()
  274. {
  275. $layout = new Zend_Layout();
  276. $layout->disableInflector();
  277. $this->assertFalse($layout->inflectorEnabled());
  278. $layout->enableInflector();
  279. $this->assertTrue($layout->inflectorEnabled());
  280. }
  281. /**
  282. * @return void
  283. */
  284. public function testDisableInflector()
  285. {
  286. $layout = new Zend_Layout();
  287. $layout->disableInflector();
  288. $this->assertFalse($layout->inflectorEnabled());
  289. }
  290. /**
  291. * @return void
  292. */
  293. public function testOverloadingAccessorsWork()
  294. {
  295. $layout = new Zend_Layout();
  296. $layout->foo = 'bar';
  297. $this->assertTrue(isset($layout->foo));
  298. $this->assertEquals('bar', $layout->foo);
  299. unset($layout->foo);
  300. $this->assertFalse(isset($layout->foo));
  301. }
  302. /**
  303. * @return void
  304. */
  305. public function testAssignWithKeyValuePairPopulatesPropertyAccessibleViaOverloading()
  306. {
  307. $layout = new Zend_Layout();
  308. $layout->assign('foo', 'bar');
  309. $this->assertEquals('bar', $layout->foo);
  310. }
  311. /**
  312. * @return void
  313. */
  314. public function testAssignWithArrayPopulatesPropertiesAccessibleViaOverloading()
  315. {
  316. $layout = new Zend_Layout();
  317. $layout->assign(array(
  318. 'foo' => 'bar',
  319. 'bar' => 'baz'
  320. ));
  321. $this->assertEquals('bar', $layout->foo);
  322. $this->assertEquals('baz', $layout->bar);
  323. }
  324. /**
  325. * @return void
  326. */
  327. public function testRenderWithNoInflection()
  328. {
  329. $layout = new Zend_Layout();
  330. $view = new Zend_View();
  331. $layout->setLayoutPath(dirname(__FILE__) . '/_files/layouts')
  332. ->disableInflector()
  333. ->setLayout('layout.phtml')
  334. ->setView($view);
  335. $layout->message = 'Rendered layout';
  336. $received = $layout->render();
  337. $this->assertContains('Testing layouts:', $received);
  338. $this->assertContains($layout->message, $received);
  339. }
  340. public function testRenderWithDefaultInflection()
  341. {
  342. $layout = new Zend_Layout();
  343. $view = new Zend_View();
  344. $layout->setLayoutPath(dirname(__FILE__) . '/_files/layouts')
  345. ->setView($view);
  346. $layout->message = 'Rendered layout';
  347. $received = $layout->render();
  348. $this->assertContains('Testing layouts:', $received);
  349. $this->assertContains($layout->message, $received);
  350. }
  351. public function testRenderWithCustomInflection()
  352. {
  353. $layout = new Zend_Layout();
  354. $view = new Zend_View();
  355. $layout->setLayoutPath(dirname(__FILE__) . '/_files/layouts')
  356. ->setView($view);
  357. $inflector = $layout->getInflector();
  358. $inflector->setTarget('test/:script.:suffix')
  359. ->setStaticRule('suffix', 'php');
  360. $layout->message = 'Rendered layout';
  361. $received = $layout->render();
  362. $this->assertContains('Testing layouts with custom inflection:', $received);
  363. $this->assertContains($layout->message, $received);
  364. }
  365. public function testGetMvcInstanceReturnsNullWhenStartMvcHasNotBeenCalled()
  366. {
  367. $this->assertNull(Zend_Layout::getMvcInstance());
  368. }
  369. public function testGetMvcInstanceReturnsLayoutInstanceWhenStartMvcHasBeenCalled()
  370. {
  371. $layout = Zend_Layout::startMvc();
  372. $received = Zend_Layout::getMvcInstance();
  373. $this->assertSame($layout, $received);
  374. }
  375. public function testSubsequentCallsToStartMvcWithOptionsSetState()
  376. {
  377. $layout = Zend_Layout::startMvc();
  378. $this->assertTrue($layout->getMvcSuccessfulActionOnly());
  379. $this->assertEquals('content', $layout->getContentKey());
  380. Zend_Layout::startMvc(array(
  381. 'mvcSuccessfulActionOnly' => false,
  382. 'contentKey' => 'foobar'
  383. ));
  384. $this->assertFalse($layout->getMvcSuccessfulActionOnly());
  385. $this->assertEquals('foobar', $layout->getContentKey());
  386. }
  387. public function testGetViewSuffixRetrievesDefaultValue()
  388. {
  389. $layout = new Zend_Layout();
  390. $this->assertEquals('phtml', $layout->getViewSuffix());
  391. }
  392. public function testViewSuffixAccessorsWork()
  393. {
  394. $layout = new Zend_Layout();
  395. $layout->setViewSuffix('php');
  396. $this->assertEquals('php', $layout->getViewSuffix());
  397. }
  398. public function testSettingViewSuffixChangesInflectorSuffix()
  399. {
  400. $layout = new Zend_Layout();
  401. $inflector = $layout->getInflector();
  402. $rules = $inflector->getRules();
  403. $this->assertTrue(isset($rules['suffix']));
  404. $this->assertEquals($layout->getViewSuffix(), $rules['suffix']);
  405. $layout->setViewSuffix('php');
  406. $this->assertEquals($layout->getViewSuffix(), $rules['suffix']);
  407. }
  408. public function testGetInflectorTargetRetrievesDefaultValue()
  409. {
  410. $layout = new Zend_Layout();
  411. $this->assertEquals(':script.:suffix', $layout->getInflectorTarget());
  412. }
  413. public function testInflectorTargetAccessorsWork()
  414. {
  415. $layout = new Zend_Layout();
  416. $layout->setInflectorTarget(':script-foo.:suffix');
  417. $this->assertEquals(':script-foo.:suffix', $layout->getInflectorTarget());
  418. }
  419. public function testSettingInflectorTargetChangesInflectorSuffix()
  420. {
  421. $layout = new Zend_Layout();
  422. $inflector = $layout->getInflector();
  423. $target = $inflector->getTarget();
  424. $this->assertEquals($layout->getInflectorTarget(), $inflector->getTarget());
  425. $layout->setInflectorTarget('php');
  426. $this->assertEquals($layout->getInflectorTarget(), $inflector->getTarget());
  427. }
  428. public function testLayoutWithViewBasePath()
  429. {
  430. $layout = new Zend_Layout(array(
  431. 'viewBasePath' => dirname(__FILE__) . '/_files/layouts-basepath/')
  432. );
  433. $this->assertEquals('layout inside basePath', $layout->render());
  434. $layout->setLayout('layout2');
  435. $this->assertEquals('foobar-helper-output', $layout->render());
  436. }
  437. public function testResettingMvcInstanceUnregistersHelperAndPlugin()
  438. {
  439. $this->testGetMvcInstanceReturnsLayoutInstanceWhenStartMvcHasBeenCalled();
  440. Zend_Layout::resetMvcInstance();
  441. $front = Zend_Controller_Front::getInstance();
  442. $this->assertFalse($front->hasPlugin('Zend_Layout_Controller_Plugin_Layout'), 'Plugin not unregistered');
  443. $this->assertFalse(Zend_Controller_Action_HelperBroker::hasHelper('Layout'), 'Helper not unregistered');
  444. }
  445. public function testResettingMvcInstanceRemovesMvcSingleton()
  446. {
  447. $this->testGetMvcInstanceReturnsLayoutInstanceWhenStartMvcHasBeenCalled();
  448. Zend_Layout::resetMvcInstance();
  449. $this->assertNull(Zend_Layout::getMvcInstance());
  450. }
  451. public function testMinimalViewObjectWorks()
  452. {
  453. require_once dirname(__FILE__) . '/_files/MinimalCustomView.php';
  454. $layout = new Zend_Layout(array(
  455. 'view' => new Zend_Layout_Test_MinimalCustomView(),
  456. 'ViewScriptPath' => 'some/path'
  457. ));
  458. $layout->render();
  459. }
  460. // #ZF-5152
  461. public function testCallingStartMvcTwiceDoesntGenerateAnyUnexpectedBehavior()
  462. {
  463. Zend_Layout::startMvc('/some/path');
  464. $this->assertEquals(Zend_Layout::getMvcInstance()->getLayoutPath(),'/some/path');
  465. Zend_Layout::startMvc('/some/other/path');
  466. $this->assertEquals(Zend_Layout::getMvcInstance()->getLayoutPath(),'/some/other/path');
  467. $this->assertTrue(Zend_Layout::getMvcInstance()->isEnabled());
  468. }
  469. }
  470. /**
  471. * Zend_Layout extension to allow resetting mvcInstance static member
  472. */
  473. class Zend_Layout_LayoutTest_Override extends Zend_Layout
  474. {
  475. public static $_mvcInstance;
  476. }
  477. class Zend_Layout_LayoutTest_Controller_Plugin_Layout extends Zend_Layout_Controller_Plugin_Layout
  478. {
  479. }
  480. class Zend_Layout_LayoutTest_Controller_Action_Helper_Layout extends Zend_Layout_Controller_Action_Helper_Layout
  481. {
  482. }
  483. // Call Zend_Layout_LayoutTest::main() if this source file is executed directly.
  484. if (PHPUnit_MAIN_METHOD == "Zend_Layout_LayoutTest::main") {
  485. Zend_Layout_LayoutTest::main();
  486. }