LayoutTest.php 17 KB

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