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)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |