MiddlewareQueueTest.php 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  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.3.0
  13. * @license https://opensource.org/licenses/mit-license.php MIT License
  14. */
  15. namespace Cake\Test\TestCase\Http;
  16. use Cake\Core\Configure;
  17. use Cake\Http\MiddlewareQueue;
  18. use Cake\TestSuite\TestCase;
  19. use TestApp\Middleware\DumbMiddleware;
  20. use TestApp\Middleware\SampleMiddleware;
  21. /**
  22. * Test case for the MiddlewareQueue
  23. */
  24. class MiddlewareQueueTest extends TestCase
  25. {
  26. /**
  27. * setUp
  28. *
  29. * @return void
  30. */
  31. public function setUp()
  32. {
  33. parent::setUp();
  34. $this->appNamespace = Configure::read('App.namespace');
  35. static::setAppNamespace();
  36. }
  37. /**
  38. * tearDown
  39. *
  40. * @return void
  41. */
  42. public function tearDown()
  43. {
  44. parent::tearDown();
  45. static::setAppNamespace($this->appNamespace);
  46. }
  47. public function testConstructorAddingMiddleware()
  48. {
  49. $cb = function () {
  50. };
  51. $queue = new MiddlewareQueue([$cb]);
  52. $this->assertCount(1, $queue);
  53. $this->assertSame($cb, $queue->get(0));
  54. }
  55. /**
  56. * Test get()
  57. *
  58. * @return void
  59. */
  60. public function testGet()
  61. {
  62. $queue = new MiddlewareQueue();
  63. $cb = function () {
  64. };
  65. $queue->add($cb);
  66. $this->assertSame($cb, $queue->get(0));
  67. $this->assertNull($queue->get(1));
  68. }
  69. /**
  70. * Test the return value of add()
  71. *
  72. * @return void
  73. */
  74. public function testAddReturn()
  75. {
  76. $queue = new MiddlewareQueue();
  77. $cb = function () {
  78. };
  79. $this->assertSame($queue, $queue->add($cb));
  80. }
  81. /**
  82. * Test the add orders correctly
  83. *
  84. * @return void
  85. */
  86. public function testAddOrdering()
  87. {
  88. $one = function () {
  89. };
  90. $two = function () {
  91. };
  92. $queue = new MiddlewareQueue();
  93. $this->assertCount(0, $queue);
  94. $queue->add($one);
  95. $this->assertCount(1, $queue);
  96. $queue->add($two);
  97. $this->assertCount(2, $queue);
  98. $this->assertSame($one, $queue->get(0));
  99. $this->assertSame($two, $queue->get(1));
  100. }
  101. /**
  102. * Test the prepend can be chained
  103. *
  104. * @return void
  105. */
  106. public function testPrependReturn()
  107. {
  108. $cb = function () {
  109. };
  110. $queue = new MiddlewareQueue();
  111. $this->assertSame($queue, $queue->prepend($cb));
  112. }
  113. /**
  114. * Test the prepend orders correctly.
  115. *
  116. * @return void
  117. */
  118. public function testPrependOrdering()
  119. {
  120. $one = function () {
  121. };
  122. $two = function () {
  123. };
  124. $queue = new MiddlewareQueue();
  125. $this->assertCount(0, $queue);
  126. $queue->add($one);
  127. $this->assertCount(1, $queue);
  128. $queue->prepend($two);
  129. $this->assertCount(2, $queue);
  130. $this->assertSame($two, $queue->get(0));
  131. $this->assertSame($one, $queue->get(1));
  132. }
  133. /**
  134. * Test updating queue using class name
  135. *
  136. * @return void
  137. */
  138. public function testAddingPrependingUsingString()
  139. {
  140. $queue = new MiddlewareQueue();
  141. $queue->add('Sample');
  142. $queue->prepend('TestApp\Middleware\SampleMiddleware');
  143. $this->assertInstanceOf('TestApp\Middleware\SampleMiddleware', $queue->get(0));
  144. $this->assertInstanceOf('TestApp\Middleware\SampleMiddleware', $queue->get(1));
  145. }
  146. /**
  147. * Test updating queue using array
  148. *
  149. * @return void
  150. */
  151. public function testAddingPrependingUsingArray()
  152. {
  153. $one = function () {
  154. };
  155. $queue = new MiddlewareQueue();
  156. $queue->add([$one]);
  157. $queue->prepend(['TestApp\Middleware\SampleMiddleware']);
  158. $this->assertInstanceOf('TestApp\Middleware\SampleMiddleware', $queue->get(0));
  159. $this->assertSame($one, $queue->get(1));
  160. }
  161. /**
  162. * Test insertAt ordering
  163. *
  164. * @return void
  165. */
  166. public function testInsertAt()
  167. {
  168. $one = function () {
  169. };
  170. $two = function () {
  171. };
  172. $three = function () {
  173. };
  174. $four = new SampleMiddleware();
  175. $queue = new MiddlewareQueue();
  176. $queue->add($one)->add($two)->insertAt(0, $three)->insertAt(2, $four);
  177. $this->assertSame($three, $queue->get(0));
  178. $this->assertSame($one, $queue->get(1));
  179. $this->assertSame($four, $queue->get(2));
  180. $this->assertSame($two, $queue->get(3));
  181. $queue = new MiddlewareQueue();
  182. $queue->add($one)->add($two)->insertAt(1, $three);
  183. $this->assertSame($one, $queue->get(0));
  184. $this->assertSame($three, $queue->get(1));
  185. $this->assertSame($two, $queue->get(2));
  186. }
  187. /**
  188. * Test insertAt out of the existing range
  189. *
  190. * @return void
  191. */
  192. public function testInsertAtOutOfBounds()
  193. {
  194. $one = function () {
  195. };
  196. $two = function () {
  197. };
  198. $queue = new MiddlewareQueue();
  199. $queue->add($one)->insertAt(99, $two);
  200. $this->assertCount(2, $queue);
  201. $this->assertSame($one, $queue->get(0));
  202. $this->assertSame($two, $queue->get(1));
  203. }
  204. /**
  205. * Test insertAt with a negative index
  206. *
  207. * @return void
  208. */
  209. public function testInsertAtNegative()
  210. {
  211. $one = function () {
  212. };
  213. $two = function () {
  214. };
  215. $three = new SampleMiddleware();
  216. $queue = new MiddlewareQueue();
  217. $queue->add($one)->insertAt(-1, $two)->insertAt(-1, $three);
  218. $this->assertCount(3, $queue);
  219. $this->assertSame($two, $queue->get(0));
  220. $this->assertSame($three, $queue->get(1));
  221. $this->assertSame($one, $queue->get(2));
  222. }
  223. /**
  224. * Test insertBefore
  225. *
  226. * @return void
  227. */
  228. public function testInsertBefore()
  229. {
  230. $one = function () {
  231. };
  232. $two = new SampleMiddleware();
  233. $three = function () {
  234. };
  235. $four = new DumbMiddleware();
  236. $queue = new MiddlewareQueue();
  237. $queue->add($one)->add($two)->insertBefore(SampleMiddleware::class, $three)->insertBefore(SampleMiddleware::class, $four);
  238. $this->assertCount(4, $queue);
  239. $this->assertSame($one, $queue->get(0));
  240. $this->assertSame($three, $queue->get(1));
  241. $this->assertSame($four, $queue->get(2));
  242. $this->assertSame($two, $queue->get(3));
  243. $two = SampleMiddleware::class;
  244. $queue = new MiddlewareQueue();
  245. $queue
  246. ->add($one)
  247. ->add($two)
  248. ->insertBefore(SampleMiddleware::class, $three);
  249. $this->assertCount(3, $queue);
  250. $this->assertSame($one, $queue->get(0));
  251. $this->assertSame($three, $queue->get(1));
  252. $this->assertInstanceOf(SampleMiddleware::class, $queue->get(2));
  253. }
  254. /**
  255. * Test insertBefore an invalid classname
  256. *
  257. * @return void
  258. */
  259. public function testInsertBeforeInvalid()
  260. {
  261. $this->expectException(\LogicException::class);
  262. $this->expectExceptionMessage('No middleware matching \'InvalidClassName\' could be found.');
  263. $one = function () {
  264. };
  265. $two = new SampleMiddleware();
  266. $three = function () {
  267. };
  268. $queue = new MiddlewareQueue();
  269. $queue->add($one)->add($two)->insertBefore('InvalidClassName', $three);
  270. }
  271. /**
  272. * Test insertAfter
  273. *
  274. * @return void
  275. */
  276. public function testInsertAfter()
  277. {
  278. $one = new SampleMiddleware();
  279. $two = function () {
  280. };
  281. $three = function () {
  282. };
  283. $four = new DumbMiddleware();
  284. $queue = new MiddlewareQueue();
  285. $queue
  286. ->add($one)
  287. ->add($two)
  288. ->insertAfter(SampleMiddleware::class, $three)
  289. ->insertAfter(SampleMiddleware::class, $four);
  290. $this->assertCount(4, $queue);
  291. $this->assertSame($one, $queue->get(0));
  292. $this->assertSame($four, $queue->get(1));
  293. $this->assertSame($three, $queue->get(2));
  294. $this->assertSame($two, $queue->get(3));
  295. $one = 'Sample';
  296. $queue = new MiddlewareQueue();
  297. $queue
  298. ->add($one)
  299. ->add($two)
  300. ->insertAfter('Sample', $three);
  301. $this->assertCount(3, $queue);
  302. $this->assertInstanceOf(SampleMiddleware::class, $queue->get(0));
  303. $this->assertSame($three, $queue->get(1));
  304. $this->assertSame($two, $queue->get(2));
  305. }
  306. /**
  307. * Test insertAfter an invalid classname
  308. *
  309. * @return void
  310. */
  311. public function testInsertAfterInvalid()
  312. {
  313. $one = new SampleMiddleware();
  314. $two = function () {
  315. };
  316. $three = function () {
  317. };
  318. $queue = new MiddlewareQueue();
  319. $queue->add($one)->add($two)->insertAfter('InvalidClass', $three);
  320. $this->assertCount(3, $queue);
  321. $this->assertSame($one, $queue->get(0));
  322. $this->assertSame($two, $queue->get(1));
  323. $this->assertSame($three, $queue->get(2));
  324. }
  325. }