109 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			PHP
		
	
	
| <?php
 | |
| 
 | |
| namespace think\tests;
 | |
| 
 | |
| use Mockery as m;
 | |
| use Mockery\MockInterface;
 | |
| use PHPUnit\Framework\TestCase;
 | |
| use think\Exception;
 | |
| use think\exception\Handle;
 | |
| use think\Middleware;
 | |
| use think\Pipeline;
 | |
| use think\Request;
 | |
| use think\Response;
 | |
| 
 | |
| class MiddlewareTest extends TestCase
 | |
| {
 | |
|     use InteractsWithApp;
 | |
| 
 | |
|     /** @var Middleware|MockInterface */
 | |
|     protected $middleware;
 | |
| 
 | |
|     protected function tearDown(): void
 | |
|     {
 | |
|         m::close();
 | |
|     }
 | |
| 
 | |
|     protected function setUp()
 | |
|     {
 | |
|         $this->prepareApp();
 | |
| 
 | |
|         $this->middleware = new Middleware($this->app);
 | |
|     }
 | |
| 
 | |
|     public function testSetMiddleware()
 | |
|     {
 | |
|         $this->middleware->add('BarMiddleware', 'bar');
 | |
| 
 | |
|         $this->assertEquals(1, count($this->middleware->all('bar')));
 | |
| 
 | |
|         $this->middleware->controller('BarMiddleware');
 | |
|         $this->assertEquals(1, count($this->middleware->all('controller')));
 | |
| 
 | |
|         $this->middleware->import(['FooMiddleware']);
 | |
|         $this->assertEquals(1, count($this->middleware->all()));
 | |
| 
 | |
|         $this->middleware->unshift(['BazMiddleware', 'baz']);
 | |
|         $this->assertEquals(2, count($this->middleware->all()));
 | |
|         $this->assertEquals([['BazMiddleware', 'handle'], 'baz'], $this->middleware->all()[0]);
 | |
| 
 | |
|         $this->config->shouldReceive('get')->with('middleware.alias', [])->andReturn(['foo' => ['FooMiddleware', 'FarMiddleware']]);
 | |
| 
 | |
|         $this->middleware->add('foo');
 | |
|         $this->assertEquals(3, count($this->middleware->all()));
 | |
|         $this->middleware->add(function () {
 | |
|         });
 | |
|         $this->middleware->add(function () {
 | |
|         });
 | |
|         $this->assertEquals(5, count($this->middleware->all()));
 | |
|     }
 | |
| 
 | |
|     public function testPipelineAndEnd()
 | |
|     {
 | |
|         $bar = m::mock("overload:BarMiddleware");
 | |
|         $foo = m::mock("overload:FooMiddleware", Foo::class);
 | |
| 
 | |
|         $request  = m::mock(Request::class);
 | |
|         $response = m::mock(Response::class);
 | |
| 
 | |
|         $e = new Exception();
 | |
| 
 | |
|         $handle = m::mock(Handle::class);
 | |
|         $handle->shouldReceive('report')->with($e)->andReturnNull();
 | |
|         $handle->shouldReceive('render')->with($request, $e)->andReturn($response);
 | |
| 
 | |
|         $foo->shouldReceive('handle')->once()->andReturnUsing(function ($request, $next) {
 | |
|             return $next($request);
 | |
|         });
 | |
|         $bar->shouldReceive('handle')->once()->andReturnUsing(function ($request, $next) use ($e) {
 | |
|             $next($request);
 | |
|             throw  $e;
 | |
|         });
 | |
| 
 | |
|         $foo->shouldReceive('end')->once()->with($response)->andReturnNull();
 | |
| 
 | |
|         $this->app->shouldReceive('make')->with(Handle::class)->andReturn($handle);
 | |
| 
 | |
|         $this->config->shouldReceive('get')->once()->with('middleware.priority', [])->andReturn(['FooMiddleware', 'BarMiddleware']);
 | |
| 
 | |
|         $this->middleware->import([function ($request, $next) {
 | |
|             return $next($request);
 | |
|         }, 'BarMiddleware', 'FooMiddleware']);
 | |
| 
 | |
|         $this->assertInstanceOf(Pipeline::class, $pipeline = $this->middleware->pipeline());
 | |
| 
 | |
|         $pipeline->send($request)->then(function ($request) use ($e, $response) {
 | |
|             throw $e;
 | |
|         });
 | |
| 
 | |
|         $this->middleware->end($response);
 | |
|     }
 | |
| }
 | |
| 
 | |
| class Foo
 | |
| {
 | |
|     public function end(Response $response)
 | |
|     {
 | |
|     }
 | |
| }
 |