MiddlewareQueueTest.php 9.1 KB

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