/tests/TestCase/Routing/DispatcherFilterTest.php

https://github.com/LubosRemplik/cakephp · PHP · 245 lines · 137 code · 32 blank · 76 comment · 0 complexity · 77549feb9a5b8e944a50b0ed9bf7bcd7 MD5 · raw file

  1. <?php
  2. /**
  3. * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
  4. * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
  5. *
  6. * Licensed under The MIT License
  7. * For full copyright and license information, please see the LICENSE.txt
  8. * Redistributions of files must retain the above copyright notice.
  9. *
  10. * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
  11. * @link https://cakephp.org CakePHP(tm) Project
  12. * @since 3.0.0
  13. * @license https://opensource.org/licenses/mit-license.php MIT License
  14. */
  15. namespace Cake\Test\TestCase\Routing;
  16. use Cake\Event\Event;
  17. use Cake\Http\Response;
  18. use Cake\Http\ServerRequest;
  19. use Cake\Routing\DispatcherFilter;
  20. use Cake\TestSuite\TestCase;
  21. /**
  22. * Dispatcher filter test.
  23. */
  24. class DispatcherFilterTest extends TestCase
  25. {
  26. /**
  27. * Test that the constructor takes config.
  28. *
  29. * @return void
  30. */
  31. public function testConstructConfig()
  32. {
  33. $filter = new DispatcherFilter(['one' => 'value', 'on' => '/blog']);
  34. $this->assertEquals('value', $filter->getConfig('one'));
  35. }
  36. /**
  37. * Test setting priority
  38. *
  39. * @return void
  40. */
  41. public function testConstructPriority()
  42. {
  43. $filter = new DispatcherFilter();
  44. $this->assertEquals(10, $filter->getConfig('priority'));
  45. $filter = new DispatcherFilter(['priority' => 100]);
  46. $this->assertEquals(100, $filter->getConfig('priority'));
  47. }
  48. /**
  49. * Test implemented events
  50. *
  51. * @return void
  52. */
  53. public function testImplementedEvents()
  54. {
  55. $filter = new DispatcherFilter(['priority' => 100]);
  56. $events = $filter->implementedEvents();
  57. $this->assertEquals(100, $events['Dispatcher.beforeDispatch']['priority']);
  58. $this->assertEquals(100, $events['Dispatcher.afterDispatch']['priority']);
  59. }
  60. /**
  61. * Test constructor error invalid when
  62. *
  63. * @return void
  64. */
  65. public function testConstructorInvalidWhen()
  66. {
  67. $this->expectException(\InvalidArgumentException::class);
  68. $this->expectExceptionMessage('"when" conditions must be a callable.');
  69. new DispatcherFilter(['when' => 'nope']);
  70. }
  71. /**
  72. * Test basic matching with for option.
  73. *
  74. * @return void
  75. * @triggers Dispatcher.beforeDispatch $this, compact('request')
  76. * @triggers Dispatcher.beforeDispatch $this, compact('request')
  77. * @triggers Dispatcher.beforeDispatch $this, compact('request')
  78. * @triggers Dispatcher.beforeDispatch $this, compact('request')
  79. */
  80. public function testMatchesWithFor()
  81. {
  82. $request = new ServerRequest(['url' => '/articles/view']);
  83. $event = new Event('Dispatcher.beforeDispatch', $this, compact('request'));
  84. $filter = new DispatcherFilter(['for' => '/articles']);
  85. $this->assertTrue($filter->matches($event));
  86. $request = new ServerRequest(['url' => '/blog/articles']);
  87. $event = new Event('Dispatcher.beforeDispatch', $this, compact('request'));
  88. $this->assertFalse($filter->matches($event), 'Does not start with /articles');
  89. $request = new ServerRequest(['url' => '/articles/edit/1']);
  90. $event = new Event('Dispatcher.beforeDispatch', $this, compact('request'));
  91. $filter = new DispatcherFilter(['for' => 'preg:#^/articles/edit/\d+$#']);
  92. $this->assertTrue($filter->matches($event));
  93. $request = new ServerRequest(['url' => '/blog/articles/edit/1']);
  94. $event = new Event('Dispatcher.beforeDispatch', $this, compact('request'));
  95. $this->assertFalse($filter->matches($event), 'Does not start with /articles');
  96. }
  97. /**
  98. * Test matching with when option.
  99. *
  100. * @return void
  101. * @triggers Dispatcher.beforeDispatch $this, compact('response', 'request')
  102. */
  103. public function testMatchesWithWhen()
  104. {
  105. $matcher = function ($request, $response) {
  106. $this->assertInstanceOf('Cake\Http\ServerRequest', $request);
  107. $this->assertInstanceOf('Cake\Http\Response', $response);
  108. return true;
  109. };
  110. $request = new ServerRequest(['url' => '/articles/view']);
  111. $response = new Response();
  112. $event = new Event('Dispatcher.beforeDispatch', $this, compact('response', 'request'));
  113. $filter = new DispatcherFilter(['when' => $matcher]);
  114. $this->assertTrue($filter->matches($event));
  115. $matcher = function () {
  116. return false;
  117. };
  118. $filter = new DispatcherFilter(['when' => $matcher]);
  119. $this->assertFalse($filter->matches($event));
  120. }
  121. /**
  122. * Test matching with for & when option.
  123. *
  124. * @return void
  125. * @triggers Dispatcher.beforeDispatch $this, compact('response', 'request')
  126. */
  127. public function testMatchesWithForAndWhen()
  128. {
  129. $request = new ServerRequest(['url' => '/articles/view']);
  130. $response = new Response();
  131. $matcher = function () {
  132. return true;
  133. };
  134. $event = new Event('Dispatcher.beforeDispatch', $this, compact('response', 'request'));
  135. $filter = new DispatcherFilter(['for' => '/admin', 'when' => $matcher]);
  136. $this->assertFalse($filter->matches($event));
  137. $filter = new DispatcherFilter(['for' => '/articles', 'when' => $matcher]);
  138. $this->assertTrue($filter->matches($event));
  139. $matcher = function () {
  140. return false;
  141. };
  142. $filter = new DispatcherFilter(['for' => '/admin', 'when' => $matcher]);
  143. $this->assertFalse($filter->matches($event));
  144. $filter = new DispatcherFilter(['for' => '/articles', 'when' => $matcher]);
  145. $this->assertFalse($filter->matches($event));
  146. }
  147. /**
  148. * Test event bindings have use condition checker
  149. *
  150. * @return void
  151. * @triggers Dispatcher.beforeDispatch $this, compact('response', 'request')
  152. * @triggers Dispatcher.afterDispatch $this, compact('response', 'request')
  153. */
  154. public function testImplementedEventsMethodName()
  155. {
  156. $request = new ServerRequest(['url' => '/articles/view']);
  157. $response = new Response();
  158. $beforeEvent = new Event('Dispatcher.beforeDispatch', $this, compact('response', 'request'));
  159. $afterEvent = new Event('Dispatcher.afterDispatch', $this, compact('response', 'request'));
  160. $filter = $this->getMockBuilder('Cake\Routing\DispatcherFilter')
  161. ->setMethods(['beforeDispatch', 'afterDispatch'])
  162. ->getMock();
  163. $filter->expects($this->at(0))
  164. ->method('beforeDispatch')
  165. ->with($beforeEvent);
  166. $filter->expects($this->at(1))
  167. ->method('afterDispatch')
  168. ->with($afterEvent);
  169. $filter->handle($beforeEvent);
  170. $filter->handle($afterEvent);
  171. }
  172. /**
  173. * Test handle applies for conditions
  174. *
  175. * @return void
  176. * @triggers Dispatcher.beforeDispatch $this, compact('response', 'request')
  177. */
  178. public function testHandleAppliesFor()
  179. {
  180. $request = new ServerRequest(['url' => '/articles/view']);
  181. $response = new Response();
  182. $event = new Event('Dispatcher.beforeDispatch', $this, compact('response', 'request'));
  183. $filter = $this->getMockBuilder('Cake\Routing\DispatcherFilter')
  184. ->setMethods(['beforeDispatch'])
  185. ->setConstructorArgs([['for' => '/admin']])
  186. ->getMock();
  187. $filter->expects($this->never())
  188. ->method('beforeDispatch');
  189. $filter->handle($event);
  190. }
  191. /**
  192. * Test handle applies when conditions
  193. *
  194. * @return void
  195. * @triggers Dispatcher.beforeDispatch $this, compact('response', 'request')
  196. */
  197. public function testHandleAppliesWhen()
  198. {
  199. $request = new ServerRequest(['url' => '/articles/view']);
  200. $response = new Response();
  201. $event = new Event('Dispatcher.beforeDispatch', $this, compact('response', 'request'));
  202. $matcher = function () {
  203. return false;
  204. };
  205. $filter = $this->getMockBuilder('Cake\Routing\DispatcherFilter')
  206. ->setMethods(['beforeDispatch'])
  207. ->setConstructorArgs([['when' => $matcher]])
  208. ->getMock();
  209. $filter->expects($this->never())
  210. ->method('beforeDispatch');
  211. $filter->handle($event);
  212. }
  213. }