StandardTest.php 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710
  1. <?php
  2. /**
  3. * Zend Framework
  4. *
  5. * LICENSE
  6. *
  7. * This source file is subject to the new BSD license that is bundled
  8. * with this package in the file LICENSE.txt.
  9. * It is also available through the world-wide-web at this URL:
  10. * http://framework.zend.com/license/new-bsd
  11. * If you did not receive a copy of the license and are unable to
  12. * obtain it through the world-wide-web, please send an email
  13. * to license@zend.com so we can send you a copy immediately.
  14. *
  15. * @category Zend
  16. * @package Zend_Controller
  17. * @subpackage UnitTests
  18. * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
  19. * @license http://framework.zend.com/license/new-bsd New BSD License
  20. * @version $Id$
  21. */
  22. // Call Zend_Controller_Dispatcher_StandardTest::main() if this source file is executed directly.
  23. if (!defined("PHPUnit_MAIN_METHOD")) {
  24. define("PHPUnit_MAIN_METHOD", "Zend_Controller_Dispatcher_StandardTest::main");
  25. }
  26. require_once 'Zend/Controller/Dispatcher/Standard.php';
  27. require_once 'Zend/Controller/Action/HelperBroker.php';
  28. require_once 'Zend/Controller/Front.php';
  29. require_once 'Zend/Controller/Request/Http.php';
  30. require_once 'Zend/Controller/Request/Simple.php';
  31. require_once 'Zend/Controller/Response/Cli.php';
  32. /**
  33. * @category Zend
  34. * @package Zend_Controller
  35. * @subpackage UnitTests
  36. * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
  37. * @license http://framework.zend.com/license/new-bsd New BSD License
  38. * @group Zend_Controller
  39. * @group Zend_Controller_Dispatcher
  40. */
  41. class Zend_Controller_Dispatcher_StandardTest extends PHPUnit_Framework_TestCase
  42. {
  43. protected $_dispatcher;
  44. /**
  45. * Runs the test methods of this class.
  46. *
  47. * @access public
  48. * @static
  49. */
  50. public static function main()
  51. {
  52. $suite = new PHPUnit_Framework_TestSuite("Zend_Controller_Dispatcher_StandardTest");
  53. $result = PHPUnit_TextUI_TestRunner::run($suite);
  54. }
  55. public function setUp()
  56. {
  57. if (isset($this->error)) {
  58. unset($this->error);
  59. }
  60. $front = Zend_Controller_Front::getInstance();
  61. $front->resetInstance();
  62. Zend_Controller_Action_HelperBroker::removeHelper('viewRenderer');
  63. $this->_dispatcher = new Zend_Controller_Dispatcher_Standard();
  64. $this->_dispatcher->setControllerDirectory(array(
  65. 'default' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '_files',
  66. 'admin' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'Admin'
  67. ));
  68. }
  69. public function tearDown()
  70. {
  71. unset($this->_dispatcher);
  72. }
  73. /**
  74. * @group ZF-9800
  75. */
  76. public function testFormatModuleName()
  77. {
  78. $this->assertEquals('Test', $this->_dispatcher->formatModuleName('test'));
  79. $this->assertEquals('TestFoo', $this->_dispatcher->formatModuleName('test-foo'));
  80. }
  81. public function testFormatControllerName()
  82. {
  83. $this->assertEquals('IndexController', $this->_dispatcher->formatControllerName('index'));
  84. $this->assertEquals('Site_CustomController', $this->_dispatcher->formatControllerName('site_custom'));
  85. }
  86. public function testFormatActionName()
  87. {
  88. $this->assertEquals('indexAction', $this->_dispatcher->formatActionName('index'));
  89. $this->assertEquals('myindexAction', $this->_dispatcher->formatActionName('myIndex'));
  90. $this->assertEquals('myindexAction', $this->_dispatcher->formatActionName('my_index'));
  91. $this->assertEquals('myIndexAction', $this->_dispatcher->formatActionName('my.index'));
  92. $this->assertEquals('myIndexAction', $this->_dispatcher->formatActionName('my-index'));
  93. }
  94. public function testSetGetControllerDirectory()
  95. {
  96. $expected = array(
  97. 'default' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '_files',
  98. 'admin' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'Admin'
  99. );
  100. $dirs = $this->_dispatcher->getControllerDirectory();
  101. $this->assertEquals($expected, $dirs);
  102. }
  103. public function testIsDispatchable()
  104. {
  105. $request = new Zend_Controller_Request_Http();
  106. $this->assertFalse($this->_dispatcher->isDispatchable($request));
  107. $request->setControllerName('index');
  108. $this->assertTrue($this->_dispatcher->isDispatchable($request));
  109. $request->setControllerName('foo');
  110. $this->assertTrue($this->_dispatcher->isDispatchable($request));
  111. // True, because it will dispatch to default controller
  112. $request->setControllerName('bogus');
  113. $this->assertFalse($this->_dispatcher->isDispatchable($request));
  114. }
  115. public function testModuleIsDispatchable()
  116. {
  117. $request = new Zend_Controller_Request_Http();
  118. $request->setModuleName('admin');
  119. $request->setControllerName('foo');
  120. $request->setActionName('bar');
  121. $this->assertTrue($this->_dispatcher->isDispatchable($request), var_export($this->_dispatcher->getControllerDirectory(), 1));
  122. $request->setModuleName('bogus');
  123. $request->setControllerName('bogus');
  124. $request->setActionName('bar');
  125. $this->assertFalse($this->_dispatcher->isDispatchable($request), var_export($this->_dispatcher->getControllerDirectory(), 1));
  126. }
  127. /**
  128. * @group ZF-8222
  129. */
  130. public function testIsDispatchableManuallyIncludedController()
  131. {
  132. require_once dirname(__FILE__) . '/../_files/ManuallyIncludedControllers.php';
  133. $request = new Zend_Controller_Request_Http();
  134. $this->_dispatcher->setParam('prefixDefaultModule', true);
  135. $request->setControllerName('included');
  136. $this->assertFalse($this->_dispatcher->isDispatchable($request));
  137. $request->setControllerName('included-prefix');
  138. $this->assertTrue($this->_dispatcher->isDispatchable($request));
  139. $this->_dispatcher->setParam('prefixDefaultModule', false);
  140. $request->setModuleName('admin');
  141. $request->setControllerName('included-admin');
  142. $this->assertTrue($this->_dispatcher->isDispatchable($request));
  143. }
  144. public function testSetGetResponse()
  145. {
  146. $response = new Zend_Controller_Response_Cli();
  147. $this->_dispatcher->setResponse($response);
  148. $this->assertTrue($response === $this->_dispatcher->getResponse());
  149. }
  150. public function testSetGetDefaultControllerName()
  151. {
  152. $this->assertEquals('index', $this->_dispatcher->getDefaultControllerName());
  153. $this->_dispatcher->setDefaultControllerName('foo');
  154. $this->assertEquals('foo', $this->_dispatcher->getDefaultControllerName());
  155. }
  156. public function testSetGetDefaultAction()
  157. {
  158. $this->assertEquals('index', $this->_dispatcher->getDefaultAction());
  159. $this->_dispatcher->setDefaultAction('bar');
  160. $this->assertEquals('bar', $this->_dispatcher->getDefaultAction());
  161. }
  162. public function testDispatchValidControllerDefaultAction()
  163. {
  164. $request = new Zend_Controller_Request_Http();
  165. $request->setControllerName('index');
  166. $response = new Zend_Controller_Response_Cli();
  167. $this->_dispatcher->dispatch($request, $response);
  168. $this->assertContains('Index action called', $this->_dispatcher->getResponse()->getBody());
  169. }
  170. public function testDispatchValidControllerAndAction()
  171. {
  172. $request = new Zend_Controller_Request_Http();
  173. $request->setControllerName('index');
  174. $request->setActionName('index');
  175. $response = new Zend_Controller_Response_Cli();
  176. $this->_dispatcher->dispatch($request, $response);
  177. $this->assertContains('Index action called', $this->_dispatcher->getResponse()->getBody());
  178. }
  179. public function testDispatchValidControllerWithInvalidAction()
  180. {
  181. $request = new Zend_Controller_Request_Http();
  182. $request->setControllerName('index');
  183. $request->setActionName('foo');
  184. $response = new Zend_Controller_Response_Cli();
  185. try {
  186. $this->_dispatcher->dispatch($request, $response);
  187. $this->fail('Exception should be raised by __call');
  188. } catch (Exception $e) {
  189. // success
  190. }
  191. }
  192. public function testDispatchInvalidController()
  193. {
  194. $request = new Zend_Controller_Request_Http();
  195. $request->setControllerName('bogus');
  196. $response = new Zend_Controller_Response_Cli();
  197. try {
  198. $this->_dispatcher->dispatch($request, $response);
  199. $this->fail('Exception should be raised; no such controller');
  200. } catch (Exception $e) {
  201. // success
  202. }
  203. }
  204. public function testDispatchInvalidControllerUsingDefaults()
  205. {
  206. $request = new Zend_Controller_Request_Http();
  207. $request->setControllerName('bogus');
  208. $response = new Zend_Controller_Response_Cli();
  209. $this->_dispatcher->setParam('useDefaultControllerAlways', true);
  210. try {
  211. $this->_dispatcher->dispatch($request, $response);
  212. $this->assertEquals('index', $request->getControllerName());
  213. $this->assertEquals('index', $request->getActionName());
  214. } catch (Exception $e) {
  215. $this->fail('Exception should not be raised when useDefaultControllerAlways set; message: ' . $e->getMessage());
  216. }
  217. }
  218. /**
  219. * @group ZF-3465
  220. */
  221. public function testUsingDefaultControllerAlwaysShouldRewriteActionNameToDefault()
  222. {
  223. $request = new Zend_Controller_Request_Http();
  224. $request->setControllerName('bogus');
  225. $request->setActionName('really');
  226. $request->setParam('action', 'really'); // router sets action as a param
  227. $response = new Zend_Controller_Response_Cli();
  228. $this->_dispatcher->setParam('useDefaultControllerAlways', true);
  229. try {
  230. $this->_dispatcher->dispatch($request, $response);
  231. } catch (Zend_Controller_Dispatcher_Exception $e) {
  232. $this->fail('Exception should not be raised when useDefaultControllerAlways set; message: ' . $e->getMessage());
  233. }
  234. $this->assertEquals('index', $request->getControllerName());
  235. $this->assertEquals('index', $request->getActionName());
  236. }
  237. public function testDispatchInvalidControllerUsingDefaultsWithDefaultModule()
  238. {
  239. $request = new Zend_Controller_Request_Http();
  240. $request->setControllerName('bogus')
  241. ->setModuleName('default');
  242. $response = new Zend_Controller_Response_Cli();
  243. $this->_dispatcher->setParam('useDefaultControllerAlways', true);
  244. try {
  245. $this->_dispatcher->dispatch($request, $response);
  246. $this->assertSame('default', $request->getModuleName());
  247. $this->assertSame('index', $request->getControllerName());
  248. $this->assertSame('index', $request->getActionName());
  249. } catch (Exception $e) {
  250. $this->fail('Exception should not be raised when useDefaultControllerAlways set; exception: ' . $e->getMessage());
  251. }
  252. }
  253. public function testDispatchValidControllerWithPrePostDispatch()
  254. {
  255. $request = new Zend_Controller_Request_Http();
  256. $request->setControllerName('foo');
  257. $request->setActionName('bar');
  258. $response = new Zend_Controller_Response_Cli();
  259. $this->_dispatcher->dispatch($request, $response);
  260. $body = $this->_dispatcher->getResponse()->getBody();
  261. $this->assertContains('Bar action called', $body);
  262. $this->assertContains('preDispatch called', $body);
  263. $this->assertContains('postDispatch called', $body);
  264. }
  265. public function testDispatchNoControllerUsesDefaults()
  266. {
  267. $request = new Zend_Controller_Request_Http();
  268. $response = new Zend_Controller_Response_Cli();
  269. $this->_dispatcher->dispatch($request, $response);
  270. $this->assertEquals('index', $request->getControllerName());
  271. $this->assertEquals('index', $request->getActionName());
  272. }
  273. /**
  274. * Tests ZF-637 -- action names with underscores not being correctly changed to camelCase
  275. */
  276. public function testZf637()
  277. {
  278. $test = $this->_dispatcher->formatActionName('view_entry');
  279. $this->assertEquals('viewentryAction', $test);
  280. }
  281. public function testWordDelimiter()
  282. {
  283. $this->assertEquals(array('-', '.'), $this->_dispatcher->getWordDelimiter());
  284. $this->_dispatcher->setWordDelimiter(':');
  285. $this->assertEquals(array(':'), $this->_dispatcher->getWordDelimiter());
  286. }
  287. public function testPathDelimiter()
  288. {
  289. $this->assertEquals('_', $this->_dispatcher->getPathDelimiter());
  290. $this->_dispatcher->setPathDelimiter(':');
  291. $this->assertEquals(':', $this->_dispatcher->getPathDelimiter());
  292. }
  293. /**
  294. * Test that classes are found in modules, using a prefix
  295. */
  296. public function testModules()
  297. {
  298. $request = new Zend_Controller_Request_Http();
  299. $request->setModuleName('admin');
  300. $request->setControllerName('foo');
  301. $request->setActionName('bar');
  302. $this->assertTrue($this->_dispatcher->isDispatchable($request), var_export($this->_dispatcher->getControllerDirectory(), 1));
  303. $response = new Zend_Controller_Response_Cli();
  304. $this->_dispatcher->dispatch($request, $response);
  305. $body = $this->_dispatcher->getResponse()->getBody();
  306. $this->assertContains("Admin_Foo::bar action called", $body, $body);
  307. }
  308. public function testModuleControllerInSubdirWithCamelCaseAction()
  309. {
  310. $request = new Zend_Controller_Request_Http();
  311. $request->setModuleName('admin');
  312. $request->setControllerName('foo-bar');
  313. $request->setActionName('baz.bat');
  314. $this->assertTrue($this->_dispatcher->isDispatchable($request), var_export($this->_dispatcher->getControllerDirectory(), 1));
  315. $response = new Zend_Controller_Response_Cli();
  316. $this->_dispatcher->dispatch($request, $response);
  317. $body = $this->_dispatcher->getResponse()->getBody();
  318. $this->assertContains("Admin_FooBar::bazBat action called", $body, $body);
  319. }
  320. public function testUseModuleDefaultController()
  321. {
  322. $this->_dispatcher->setDefaultControllerName('foo')
  323. ->setParam('useDefaultControllerAlways', true);
  324. $request = new Zend_Controller_Request_Http();
  325. $request->setModuleName('admin');
  326. $this->assertTrue($this->_dispatcher->isDispatchable($request), var_export($this->_dispatcher->getControllerDirectory(), 1));
  327. $response = new Zend_Controller_Response_Cli();
  328. $this->_dispatcher->dispatch($request, $response);
  329. $body = $this->_dispatcher->getResponse()->getBody();
  330. $this->assertContains("Admin_Foo::index action called", $body, $body);
  331. }
  332. public function testNoModuleOrControllerDefaultsCorrectly()
  333. {
  334. $request = new Zend_Controller_Request_Http('http://example.com/');
  335. $this->assertFalse($this->_dispatcher->isDispatchable($request), var_export($this->_dispatcher->getControllerDirectory(), 1));
  336. $response = new Zend_Controller_Response_Cli();
  337. $this->_dispatcher->dispatch($request, $response);
  338. $body = $this->_dispatcher->getResponse()->getBody();
  339. $this->assertContains("Index action called", $body, $body);
  340. }
  341. public function testOutputBuffering()
  342. {
  343. $request = new Zend_Controller_Request_Http();
  344. $request->setControllerName('ob');
  345. $request->setActionName('index');
  346. $this->assertTrue($this->_dispatcher->isDispatchable($request), var_export($this->_dispatcher->getControllerDirectory(), 1));
  347. $response = new Zend_Controller_Response_Cli();
  348. $this->_dispatcher->dispatch($request, $response);
  349. $body = $this->_dispatcher->getResponse()->getBody();
  350. $this->assertContains("OB index action called", $body, $body);
  351. }
  352. public function testDisableOutputBuffering()
  353. {
  354. if (!defined('TESTS_ZEND_CONTROLLER_DISPATCHER_OB') || !TESTS_ZEND_CONTROLLER_DISPATCHER_OB) {
  355. $this->markTestSkipped('Skipping output buffer disabling in Zend_Controller_Dispatcher_Standard');
  356. }
  357. $request = new Zend_Controller_Request_Http();
  358. $request->setControllerName('ob');
  359. $request->setActionName('index');
  360. $this->_dispatcher->setParam('disableOutputBuffering', true);
  361. $this->assertTrue($this->_dispatcher->isDispatchable($request), var_export($this->_dispatcher->getControllerDirectory(), 1));
  362. $response = new Zend_Controller_Response_Cli();
  363. $this->_dispatcher->dispatch($request, $response);
  364. $body = $this->_dispatcher->getResponse()->getBody();
  365. $this->assertEquals('', $body, $body);
  366. }
  367. public function testModuleSubdirControllerFound()
  368. {
  369. Zend_Controller_Front::getInstance()
  370. ->setDispatcher($this->_dispatcher)
  371. ->addControllerDirectory(
  372. dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'modules' . DIRECTORY_SEPARATOR . 'foo' . DIRECTORY_SEPARATOR . 'controllers',
  373. 'foo'
  374. );
  375. $request = new Zend_Controller_Request_Http();
  376. $request->setModuleName('foo');
  377. $request->setControllerName('admin_index');
  378. $request->setActionName('index');
  379. $this->assertTrue($this->_dispatcher->isDispatchable($request), var_export($this->_dispatcher->getControllerDirectory(), 1));
  380. $response = new Zend_Controller_Response_Cli();
  381. $this->_dispatcher->dispatch($request, $response);
  382. $body = $this->_dispatcher->getResponse()->getBody();
  383. $this->assertContains("Foo_Admin_IndexController::indexAction() called", $body, $body);
  384. }
  385. public function testDefaultModule()
  386. {
  387. $this->assertEquals('default', $this->_dispatcher->getDefaultModule());
  388. $this->_dispatcher->setDefaultModule('foobar');
  389. $this->assertEquals('foobar', $this->_dispatcher->getDefaultModule());
  390. }
  391. public function testModuleValid()
  392. {
  393. $this->assertTrue($this->_dispatcher->isValidModule('default'));
  394. $this->assertTrue($this->_dispatcher->isValidModule('admin'));
  395. $this->assertFalse($this->_dispatcher->isValidModule('bogus'));
  396. $this->assertFalse($this->_dispatcher->isValidModule(null));
  397. $this->assertFalse($this->_dispatcher->isValidModule($this));
  398. $this->assertFalse($this->_dispatcher->isValidModule(array()));
  399. }
  400. /**
  401. * @group ZF-3034
  402. */
  403. public function testIsValidModuleShouldNormalizeModuleName()
  404. {
  405. $this->assertTrue($this->_dispatcher->isValidModule('Admin'));
  406. }
  407. public function testSanelyDiscardOutputBufferOnException()
  408. {
  409. $request = new Zend_Controller_Request_Http();
  410. $request->setControllerName('ob');
  411. $request->setActionName('exception');
  412. $this->assertTrue($this->_dispatcher->isDispatchable($request), var_export($this->_dispatcher->getControllerDirectory(), 1));
  413. $response = new Zend_Controller_Response_Cli();
  414. try {
  415. $this->_dispatcher->dispatch($request, $response);
  416. $this->fail('Exception should have been rethrown');
  417. } catch (Exception $e) {
  418. }
  419. $body = $this->_dispatcher->getResponse()->getBody();
  420. $this->assertNotContains("In exception action", $body, $body);
  421. $this->assertNotContains("Foo", $body, $body);
  422. }
  423. public function testGetDefaultControllerClassResetsRequestObject()
  424. {
  425. $request = new Zend_Controller_Request_Http();
  426. $request->setModuleName('foobar')
  427. ->setControllerName('bazbatbegone')
  428. ->setActionName('bebop');
  429. $this->_dispatcher->getDefaultControllerClass($request);
  430. $this->assertEquals($this->_dispatcher->getDefaultModule(), $request->getModuleName());
  431. $this->assertEquals($this->_dispatcher->getDefaultControllerName(), $request->getControllerName());
  432. $this->assertNull($request->getActionName());
  433. }
  434. public function testLoadClassLoadsControllerInDefaultModuleWithoutModulePrefix()
  435. {
  436. $request = new Zend_Controller_Request_Simple();
  437. $request->setControllerName('empty');
  438. $class = $this->_dispatcher->getControllerClass($request);
  439. $this->assertEquals('EmptyController', $class);
  440. $test = $this->_dispatcher->loadClass($class);
  441. $this->assertEquals($class, $test);
  442. $this->assertTrue(class_exists($class));
  443. }
  444. public function testLoadClassLoadsControllerInSpecifiedModuleWithModulePrefix()
  445. {
  446. Zend_Controller_Front::getInstance()
  447. ->setDispatcher($this->_dispatcher)
  448. ->addModuleDirectory(dirname(__FILE__) . '/../_files/modules');
  449. $request = new Zend_Controller_Request_Simple();
  450. $request->setControllerName('index')
  451. ->setModuleName('bar');
  452. $class = $this->_dispatcher->getControllerClass($request);
  453. $this->assertEquals('IndexController', $class);
  454. $test = $this->_dispatcher->loadClass($class);
  455. $this->assertEquals('Bar_IndexController', $test);
  456. $this->assertTrue(class_exists($test));
  457. }
  458. /**
  459. * @group ZF-9800
  460. */
  461. public function testLoadClassLoadsControllerInSpecifiedModuleWithHyphenatedModuleName()
  462. {
  463. $front = Zend_Controller_Front::getInstance();
  464. $front->addModuleDirectory(dirname(__FILE__) . '/../_files/modules');
  465. $dispatcher = $front->getDispatcher();
  466. $request = new Zend_Controller_Request_Simple();
  467. $request->setControllerName('foo')
  468. ->setModuleName('baz-bat');
  469. $class = $dispatcher->getControllerClass($request);
  470. $this->assertEquals('FooController', $class);
  471. $test = $dispatcher->loadClass($class);
  472. $this->assertEquals('BazBat_FooController', $test);
  473. $this->assertTrue(class_exists($test));
  474. }
  475. /**
  476. * @group ZF-9800
  477. */
  478. public function testDispatcherCanDispatchControllersFromModuleWithHyphenatedName()
  479. {
  480. $front = Zend_Controller_Front::getInstance();
  481. $front->addModuleDirectory(dirname(__FILE__) . '/../_files/modules');
  482. $dispatcher = $front->getDispatcher();
  483. $request = new Zend_Controller_Request_Simple();
  484. $request->setModuleName('baz-bat')->setControllerName('foo');
  485. $response = new Zend_Controller_Response_Cli();
  486. $dispatcher->dispatch($request, $response);
  487. $body = $dispatcher->getResponse()->getBody();
  488. $this->assertContains("BazBat_FooController::indexAction() called", $body, $body);
  489. }
  490. public function testLoadClassLoadsControllerInDefaultModuleWithModulePrefixWhenRequested()
  491. {
  492. Zend_Controller_Front::getInstance()
  493. ->setDispatcher($this->_dispatcher)
  494. ->addModuleDirectory(dirname(__FILE__) . '/../_files/modules');
  495. $this->_dispatcher->setDefaultModule('foo')
  496. ->setParam('prefixDefaultModule', true);
  497. $request = new Zend_Controller_Request_Simple();
  498. $request->setControllerName('index');
  499. $class = $this->_dispatcher->getControllerClass($request);
  500. $this->assertEquals('IndexController', $class);
  501. $test = $this->_dispatcher->loadClass($class);
  502. $this->assertEquals('Foo_IndexController', $test);
  503. $this->assertTrue(class_exists($test));
  504. }
  505. /**
  506. * ZF-2435
  507. */
  508. public function testCanRemoveControllerDirectory()
  509. {
  510. Zend_Controller_Front::getInstance()
  511. ->setDispatcher($this->_dispatcher)
  512. ->addModuleDirectory(dirname(__FILE__) . '/../_files/modules');
  513. $dirs = $this->_dispatcher->getControllerDirectory();
  514. $this->_dispatcher->removeControllerDirectory('foo');
  515. $test = $this->_dispatcher->getControllerDirectory();
  516. $this->assertNotEquals($dirs, $test);
  517. $this->assertFalse(array_key_exists('foo', $test));
  518. }
  519. /**
  520. * ZF-2693
  521. */
  522. public function testCamelCasedActionsNotRequestedWithWordSeparatorsShouldNotResolve()
  523. {
  524. $request = new Zend_Controller_Request_Http();
  525. $request->setModuleName('admin');
  526. $request->setControllerName('foo-bar');
  527. $request->setActionName('bazBat');
  528. $this->assertTrue($this->_dispatcher->isDispatchable($request), var_export($this->_dispatcher->getControllerDirectory(), 1));
  529. $response = new Zend_Controller_Response_Cli();
  530. try {
  531. $this->_dispatcher->dispatch($request, $response);
  532. $this->fail('Invalid camelCased action should raise exception');
  533. } catch (Zend_Controller_Exception $e) {
  534. $this->assertContains('does not exist', $e->getMessage());
  535. }
  536. }
  537. /**
  538. * ZF-2693
  539. */
  540. public function testCamelCasedActionsNotRequestedWithWordSeparatorsShouldResolveIfForced()
  541. {
  542. $this->_dispatcher->setParam('useCaseSensitiveActions', true);
  543. $request = new Zend_Controller_Request_Http();
  544. $request->setModuleName('admin');
  545. $request->setControllerName('foo-bar');
  546. $request->setActionName('bazBat');
  547. $this->assertTrue($this->_dispatcher->isDispatchable($request), var_export($this->_dispatcher->getControllerDirectory(), 1));
  548. $response = new Zend_Controller_Response_Cli();
  549. $oldLevel = error_reporting(0);
  550. try {
  551. $this->_dispatcher->dispatch($request, $response);
  552. $body = $this->_dispatcher->getResponse()->getBody();
  553. error_reporting($oldLevel);
  554. $this->assertContains("Admin_FooBar::bazBat action called", $body, $body);
  555. } catch (Zend_Controller_Exception $e) {
  556. error_reporting($oldLevel);
  557. $this->fail('camelCased actions should succeed when forced');
  558. }
  559. }
  560. public function handleErrors($errno, $errstr)
  561. {
  562. $this->error = $errstr;
  563. }
  564. /**
  565. * @see ZF-2693
  566. */
  567. public function testForcingCamelCasedActionsNotRequestedWithWordSeparatorsShouldRaiseNotices()
  568. {
  569. $this->_dispatcher->setParam('useCaseSensitiveActions', true);
  570. $request = new Zend_Controller_Request_Http();
  571. $request->setModuleName('admin');
  572. $request->setControllerName('foo-bar');
  573. $request->setActionName('bazBat');
  574. $this->assertTrue($this->_dispatcher->isDispatchable($request), var_export($this->_dispatcher->getControllerDirectory(), 1));
  575. $response = new Zend_Controller_Response_Cli();
  576. set_error_handler(array($this, 'handleErrors'));
  577. try {
  578. $this->_dispatcher->dispatch($request, $response);
  579. $body = $this->_dispatcher->getResponse()->getBody();
  580. restore_error_handler();
  581. $this->assertTrue(isset($this->error));
  582. $this->assertContains('deprecated', $this->error);
  583. } catch (Zend_Controller_Exception $e) {
  584. restore_error_handler();
  585. $this->fail('camelCased actions should succeed when forced');
  586. }
  587. }
  588. /**
  589. * @see ZF-2887
  590. */
  591. public function testGetControllerClassThrowsExceptionIfNoDefaultModuleDefined()
  592. {
  593. $this->_dispatcher->setControllerDirectory(array());
  594. $request = new Zend_Controller_Request_Simple();
  595. $request->setControllerName('empty');
  596. try {
  597. $class = $this->_dispatcher->getControllerClass($request);
  598. } catch (Zend_Controller_Exception $e) {
  599. $this->assertContains('No default module', $e->getMessage());
  600. }
  601. }
  602. }
  603. // Call Zend_Controller_Dispatcher_StandardTest::main() if this source file is executed directly.
  604. if (PHPUnit_MAIN_METHOD == "Zend_Controller_Dispatcher_StandardTest::main") {
  605. Zend_Controller_Dispatcher_StandardTest::main();
  606. }