RunnerTest.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. <?php
  2. declare(strict_types=1);
  3. /**
  4. * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
  5. * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
  6. *
  7. * Licensed under The MIT License
  8. * For full copyright and license information, please see the LICENSE.txt
  9. * Redistributions of files must retain the above copyright notice.
  10. *
  11. * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
  12. * @link https://cakephp.org CakePHP(tm) Project
  13. * @since 3.3.0
  14. * @license https://opensource.org/licenses/mit-license.php MIT License
  15. */
  16. namespace Cake\Test\TestCase;
  17. use Cake\Http\MiddlewareQueue;
  18. use Cake\Http\Runner;
  19. use Cake\TestSuite\TestCase;
  20. use RuntimeException;
  21. /**
  22. * Test case for runner.
  23. */
  24. class RunnerTest extends TestCase
  25. {
  26. /**
  27. * setup
  28. *
  29. * @return void
  30. */
  31. public function setUp()
  32. {
  33. parent::setUp();
  34. $this->stack = new MiddlewareQueue();
  35. $this->ok = function ($req, $res, $next) {
  36. return $next($req, $res);
  37. };
  38. $this->pass = function ($req, $res, $next) {
  39. return $next($req, $res);
  40. };
  41. $this->fail = function ($req, $res, $next) {
  42. throw new RuntimeException('A bad thing');
  43. };
  44. }
  45. /**
  46. * Test running a single middleware object.
  47. *
  48. * @return void
  49. */
  50. public function testRunSingle()
  51. {
  52. $this->stack->add($this->ok);
  53. $req = $this->getMockBuilder('Psr\Http\Message\ServerRequestInterface')->getMock();
  54. $res = $this->getMockBuilder('Psr\Http\Message\ResponseInterface')->getMock();
  55. $runner = new Runner();
  56. $result = $runner->run($this->stack, $req, $res);
  57. $this->assertSame($res, $result);
  58. }
  59. /**
  60. * Test replacing a response in a middleware.
  61. *
  62. * @return void
  63. */
  64. public function testRunResponseReplace()
  65. {
  66. $one = function ($req, $res, $next) {
  67. $res = $this->getMockBuilder('Psr\Http\Message\ResponseInterface')->getMock();
  68. return $next($req, $res);
  69. };
  70. $this->stack->add($one);
  71. $runner = new Runner();
  72. $req = $this->getMockBuilder('Psr\Http\Message\ServerRequestInterface')->getMock();
  73. $res = $this->getMockBuilder('Psr\Http\Message\ResponseInterface')->getMock();
  74. $result = $runner->run($this->stack, $req, $res);
  75. $this->assertNotSame($res, $result, 'Response was not replaced');
  76. $this->assertInstanceOf('Psr\Http\Message\ResponseInterface', $result);
  77. }
  78. /**
  79. * Test that middleware is run in sequence
  80. *
  81. * @return void
  82. */
  83. public function testRunSequencing()
  84. {
  85. $log = [];
  86. $one = function ($req, $res, $next) use (&$log) {
  87. $log[] = 'one';
  88. return $next($req, $res);
  89. };
  90. $two = function ($req, $res, $next) use (&$log) {
  91. $log[] = 'two';
  92. return $next($req, $res);
  93. };
  94. $three = function ($req, $res, $next) use (&$log) {
  95. $log[] = 'three';
  96. return $next($req, $res);
  97. };
  98. $this->stack->add($one)->add($two)->add($three);
  99. $runner = new Runner();
  100. $req = $this->getMockBuilder('Psr\Http\Message\ServerRequestInterface')->getMock();
  101. $res = $this->getMockBuilder('Psr\Http\Message\ResponseInterface')->getMock();
  102. $result = $runner->run($this->stack, $req, $res);
  103. $this->assertSame($res, $result, 'Response is not correct');
  104. $expected = ['one', 'two', 'three'];
  105. $this->assertEquals($expected, $log);
  106. }
  107. /**
  108. * Test that exceptions bubble up.
  109. *
  110. */
  111. public function testRunExceptionInMiddleware()
  112. {
  113. $this->expectException(\RuntimeException::class);
  114. $this->expectExceptionMessage('A bad thing');
  115. $this->stack->add($this->ok)->add($this->fail);
  116. $req = $this->getMockBuilder('Psr\Http\Message\ServerRequestInterface')->getMock();
  117. $res = $this->getMockBuilder('Psr\Http\Message\ResponseInterface')->getMock();
  118. $runner = new Runner();
  119. $runner->run($this->stack, $req, $res);
  120. }
  121. }