ActionTest.php 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. <?php
  2. // Call Zend_View_Helper_ActionTest::main() if this source file is executed directly.
  3. if (!defined("PHPUnit_MAIN_METHOD")) {
  4. define("PHPUnit_MAIN_METHOD", "Zend_View_Helper_ActionTest::main");
  5. }
  6. require_once dirname(__FILE__) . '/../../../TestHelper.php';
  7. /** Zend_View_Helper_Action */
  8. require_once 'Zend/View/Helper/Action.php';
  9. /** Zend_Controller_Front */
  10. require_once 'Zend/Controller/Front.php';
  11. /** Zend_Controller_Request_Http */
  12. require_once 'Zend/Controller/Request/Http.php';
  13. /** Zend_Controller_Response_Http */
  14. require_once 'Zend/Controller/Response/Http.php';
  15. /** Zend_View */
  16. require_once 'Zend/View.php';
  17. /**
  18. * Test class for Zend_View_Helper_Action.
  19. */
  20. class Zend_View_Helper_ActionTest 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. $suite = new PHPUnit_Framework_TestSuite("Zend_View_Helper_ActionTest");
  30. $result = PHPUnit_TextUI_TestRunner::run($suite);
  31. }
  32. /**
  33. * Sets up the fixture, for example, open a network connection.
  34. * This method is called before a test is executed.
  35. *
  36. * @return void
  37. */
  38. public function setUp()
  39. {
  40. $front = Zend_Controller_Front::getInstance();
  41. $front->resetInstance();
  42. $this->request = new Zend_Controller_Request_Http('http://framework.zend.com/foo');
  43. $this->response = new Zend_Controller_Response_Http();
  44. $this->response->headersSentThrowsException = false;
  45. $front->setRequest($this->request)
  46. ->setResponse($this->response)
  47. ->addModuleDirectory(dirname(__FILE__) . '/_files/modules');
  48. $this->view = new Zend_View();
  49. $this->helper = new Zend_View_Helper_Action();
  50. $this->helper->setView($this->view);
  51. }
  52. /**
  53. * Tears down the fixture, for example, close a network connection.
  54. * This method is called after a test is executed.
  55. *
  56. * @return void
  57. */
  58. public function tearDown()
  59. {
  60. unset($this->request, $this->response, $this->helper);
  61. }
  62. /**
  63. * @return void
  64. */
  65. public function testInitialStateHasClonedObjects()
  66. {
  67. $this->assertNotSame($this->request, $this->helper->request);
  68. $this->assertNotSame($this->response, $this->helper->response);
  69. $dispatcher = Zend_Controller_Front::getInstance()->getDispatcher();
  70. $this->assertNotSame($dispatcher, $this->helper->dispatcher);
  71. }
  72. /**
  73. * @return void
  74. */
  75. public function testInitialStateHasDefaultModuleName()
  76. {
  77. $dispatcher = Zend_Controller_Front::getInstance()->getDispatcher();
  78. $module = $dispatcher->getDefaultModule();
  79. $this->assertEquals($module, $this->helper->defaultModule);
  80. $dispatcher->setDefaultModule('foo');
  81. $helper = new Zend_View_Helper_Action();
  82. $this->assertEquals('foo', $helper->defaultModule);
  83. }
  84. /**
  85. * @return void
  86. */
  87. public function testResetObjectsClearsRequestVars()
  88. {
  89. $this->helper->request->setParam('foo', 'bar');
  90. $this->helper->resetObjects();
  91. $this->assertNull($this->helper->request->getParam('foo'));
  92. }
  93. /**
  94. * @return void
  95. */
  96. public function testResetObjectsClearsResponseBody()
  97. {
  98. $this->helper->response->setBody('foobarbaz');
  99. $this->helper->resetObjects();
  100. $body = $this->helper->response->getBody();
  101. $this->assertTrue(empty($body));
  102. }
  103. /**
  104. * @return void
  105. */
  106. public function testResetObjectsClearsResponseHeaders()
  107. {
  108. $this->helper->response->setHeader('X-Foo', 'Bar')
  109. ->setRawHeader('HTTP/1.1');
  110. $this->helper->resetObjects();
  111. $headers = $this->helper->response->getHeaders();
  112. $rawHeaders = $this->helper->response->getRawHeaders();
  113. $this->assertTrue(empty($headers));
  114. $this->assertTrue(empty($rawHeaders));
  115. }
  116. /**
  117. * @return void
  118. */
  119. public function testActionReturnsContentFromDefaultModule()
  120. {
  121. $value = $this->helper->action('bar', 'foo');
  122. $this->assertContains('In default module, FooController::barAction()', $value);
  123. }
  124. /**
  125. * @return void
  126. */
  127. public function testActionReturnsContentFromSpecifiedModule()
  128. {
  129. $value = $this->helper->action('bar', 'foo', 'foo');
  130. $this->assertContains('In foo module, Foo_FooController::barAction()', $value);
  131. }
  132. /**
  133. * @return void
  134. */
  135. public function testActionReturnsContentReflectingPassedParams()
  136. {
  137. $value = $this->helper->action('baz', 'foo', null, array('bat' => 'This is my message'));
  138. $this->assertNotContains('BOGUS', $value, var_export($this->helper->request->getUserParams(), 1));
  139. $this->assertContains('This is my message', $value);
  140. }
  141. /**
  142. * @return void
  143. */
  144. public function testActionReturnsEmptyStringWhenForwardDetected()
  145. {
  146. $value = $this->helper->action('forward', 'foo');
  147. $this->assertEquals('', $value);
  148. }
  149. /**
  150. * @return void
  151. */
  152. public function testActionReturnsEmptyStringWhenRedirectDetected()
  153. {
  154. $value = $this->helper->action('redirect', 'foo');
  155. $this->assertEquals('', $value);
  156. }
  157. /**
  158. * @return void
  159. */
  160. public function testConstructorThrowsExceptionWithNoControllerDirsInFrontController()
  161. {
  162. Zend_Controller_Front::getInstance()->resetInstance();
  163. try {
  164. $helper = new Zend_View_Helper_Action();
  165. $this->fail('Empty front controller should cause action helper to throw exception');
  166. } catch (Exception $e) {
  167. }
  168. }
  169. /**
  170. * @return void
  171. */
  172. public function testConstructorThrowsExceptionWithNoRequestInFrontController()
  173. {
  174. $front = Zend_Controller_Front::getInstance();
  175. $front->resetInstance();
  176. $response = new Zend_Controller_Response_Http();
  177. $response->headersSentThrowsException = false;
  178. $front->setResponse($response)
  179. ->addModuleDirectory(dirname(__FILE__) . '/_files/modules');
  180. try {
  181. $helper = new Zend_View_Helper_Action();
  182. $this->fail('No request in front controller should cause action helper to throw exception');
  183. } catch (Exception $e) {
  184. }
  185. }
  186. /**
  187. * @return void
  188. */
  189. public function testConstructorThrowsExceptionWithNoResponseInFrontController()
  190. {
  191. $front = Zend_Controller_Front::getInstance();
  192. $front->resetInstance();
  193. $request = new Zend_Controller_Request_Http('http://framework.zend.com/foo');
  194. $front->setRequest($this->request)
  195. ->addModuleDirectory(dirname(__FILE__) . '/_files/modules');
  196. try {
  197. $helper = new Zend_View_Helper_Action();
  198. $this->fail('No response in front controller should cause action helper to throw exception');
  199. } catch (Exception $e) {
  200. }
  201. }
  202. public function testViewObjectRemainsUnchangedAfterAction()
  203. {
  204. $value = $this->helper->action('bar', 'foo', 'foo');
  205. $this->assertContains('In foo module, Foo_FooController::barAction()', $value);
  206. $this->assertNull($this->view->bar);
  207. }
  208. public function testNestingActionsDoesNotBreakPlaceholderHelpers()
  209. {
  210. $html = $this->helper->action('nest', 'foo', 'foo');
  211. $title = $this->view->headTitle()->toString();
  212. $this->assertContains(' - ', $title, $title);
  213. $this->assertContains('Foo Nest', $title);
  214. $this->assertContains('Nested Stuff', $title);
  215. }
  216. /**
  217. * @issue ZF-2716
  218. */
  219. public function testActionWithPartialsUseOfViewRendererReturnsToOriginatingViewState()
  220. {
  221. require_once 'Zend/View/Helper/Partial.php';
  222. $partial = new Zend_View_Helper_Partial();
  223. $this->view->setScriptPath(dirname(__FILE__) . '/_files/modules/default/views/scripts/');
  224. $partial->setView($this->view);
  225. Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->view = $this->view;
  226. $partial->partial('partialActionCall.phtml');
  227. $this->assertSame($this->view, Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->view);
  228. }
  229. /**
  230. * Future ViewRenderer State issues should be included in this test.
  231. *
  232. * @issue ZF-2846
  233. */
  234. public function testActionReturnsViewRendererToOriginalState()
  235. {
  236. /* Setup the VR as if we were inside an action controller */
  237. $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
  238. $viewRenderer->init();
  239. Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
  240. // make sure noRender is false
  241. $this->assertFalse($viewRenderer->getNoRender());
  242. $value = $this->helper->action('bar', 'foo');
  243. $viewRendererPostAction = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
  244. // ViewRenderer noRender should still be false
  245. $this->assertFalse($viewRendererPostAction->getNoRender());
  246. $this->assertSame($viewRenderer, $viewRendererPostAction);
  247. }
  248. /**
  249. * Multiple call state issue
  250. *
  251. *
  252. * @group ZF-3456
  253. */
  254. public function testActionCalledWithinActionResetsResponseState()
  255. {
  256. $value = $this->helper->action('bar-one', 'baz', 'foo');
  257. $this->assertRegexp('/Baz-Three-View-Script\s+Baz-Two-View-Script\s+Baz-One-View-Script/s', $value);
  258. }
  259. }
  260. // Call Zend_View_Helper_ActionTest::main() if this source file is executed directly.
  261. if (PHPUnit_MAIN_METHOD == "Zend_View_Helper_ActionTest::main") {
  262. Zend_View_Helper_ActionTest::main();
  263. }