156 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			156 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| 
								 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace think\tests;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use Mockery as m;
							 | 
						||
| 
								 | 
							
								use Mockery\MockInterface;
							 | 
						||
| 
								 | 
							
								use org\bovigo\vfs\vfsStream;
							 | 
						||
| 
								 | 
							
								use PHPUnit\Framework\TestCase;
							 | 
						||
| 
								 | 
							
								use think\App;
							 | 
						||
| 
								 | 
							
								use think\Console;
							 | 
						||
| 
								 | 
							
								use think\Event;
							 | 
						||
| 
								 | 
							
								use think\event\HttpEnd;
							 | 
						||
| 
								 | 
							
								use think\Exception;
							 | 
						||
| 
								 | 
							
								use think\exception\Handle;
							 | 
						||
| 
								 | 
							
								use think\Http;
							 | 
						||
| 
								 | 
							
								use think\Log;
							 | 
						||
| 
								 | 
							
								use think\Request;
							 | 
						||
| 
								 | 
							
								use think\Response;
							 | 
						||
| 
								 | 
							
								use think\Route;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class HttpTest extends TestCase
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    /** @var App|MockInterface */
							 | 
						||
| 
								 | 
							
								    protected $app;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /** @var Http|MockInterface */
							 | 
						||
| 
								 | 
							
								    protected $http;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    protected function tearDown(): void
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        m::close();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    protected function setUp()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $this->app = m::mock(App::class)->makePartial();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $this->http = m::mock(Http::class, [$this->app])->shouldAllowMockingProtectedMethods()->makePartial();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    protected function prepareApp($request, $response)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $this->app->shouldReceive('instance')->once()->with('request', $request);
							 | 
						||
| 
								 | 
							
								        $this->app->shouldReceive('initialized')->once()->andReturnFalse();
							 | 
						||
| 
								 | 
							
								        $this->app->shouldReceive('initialize')->once();
							 | 
						||
| 
								 | 
							
								        $this->app->shouldReceive('get')->with('request')->andReturn($request);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $route = m::mock(Route::class);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $route->shouldReceive('dispatch')->withArgs(function ($req, $withRoute) use ($request) {
							 | 
						||
| 
								 | 
							
								            if ($withRoute) {
							 | 
						||
| 
								 | 
							
								                $withRoute();
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            return $req === $request;
							 | 
						||
| 
								 | 
							
								        })->andReturn($response);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $route->shouldReceive('config')->with('route_annotation')->andReturn(true);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $this->app->shouldReceive('get')->with('route')->andReturn($route);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $console = m::mock(Console::class);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $console->shouldReceive('call');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $this->app->shouldReceive('get')->with('console')->andReturn($console);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testRun()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $root = vfsStream::setup('rootDir', null, [
							 | 
						||
| 
								 | 
							
								            'app'   => [
							 | 
						||
| 
								 | 
							
								                'controller'     => [],
							 | 
						||
| 
								 | 
							
								                'middleware.php' => '<?php return [];',
							 | 
						||
| 
								 | 
							
								            ],
							 | 
						||
| 
								 | 
							
								            'route' => [
							 | 
						||
| 
								 | 
							
								                'route.php' => '<?php return [];',
							 | 
						||
| 
								 | 
							
								            ],
							 | 
						||
| 
								 | 
							
								        ]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $this->app->shouldReceive('getBasePath')->andReturn($root->getChild('app')->url() . DIRECTORY_SEPARATOR);
							 | 
						||
| 
								 | 
							
								        $this->app->shouldReceive('getRootPath')->andReturn($root->url() . DIRECTORY_SEPARATOR);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $request  = m::mock(Request::class)->makePartial();
							 | 
						||
| 
								 | 
							
								        $response = m::mock(Response::class)->makePartial();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $this->prepareApp($request, $response);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $this->assertEquals($response, $this->http->run($request));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function multiAppRunProvider()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $request1 = m::mock(Request::class)->makePartial();
							 | 
						||
| 
								 | 
							
								        $request1->shouldReceive('subDomain')->andReturn('www');
							 | 
						||
| 
								 | 
							
								        $request1->shouldReceive('host')->andReturn('www.domain.com');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $request2 = m::mock(Request::class)->makePartial();
							 | 
						||
| 
								 | 
							
								        $request2->shouldReceive('subDomain')->andReturn('app2');
							 | 
						||
| 
								 | 
							
								        $request2->shouldReceive('host')->andReturn('app2.domain.com');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $request3 = m::mock(Request::class)->makePartial();
							 | 
						||
| 
								 | 
							
								        $request3->shouldReceive('pathinfo')->andReturn('some1/a/b/c');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $request4 = m::mock(Request::class)->makePartial();
							 | 
						||
| 
								 | 
							
								        $request4->shouldReceive('pathinfo')->andReturn('app3/a/b/c');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $request5 = m::mock(Request::class)->makePartial();
							 | 
						||
| 
								 | 
							
								        $request5->shouldReceive('pathinfo')->andReturn('some2/a/b/c');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return [
							 | 
						||
| 
								 | 
							
								            [$request1, true, 'app1'],
							 | 
						||
| 
								 | 
							
								            [$request2, true, 'app2'],
							 | 
						||
| 
								 | 
							
								            [$request3, true, 'app3'],
							 | 
						||
| 
								 | 
							
								            [$request4, true, null],
							 | 
						||
| 
								 | 
							
								            [$request5, true, 'some2', 'path'],
							 | 
						||
| 
								 | 
							
								            [$request1, false, 'some3'],
							 | 
						||
| 
								 | 
							
								        ];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testRunWithException()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $request  = m::mock(Request::class);
							 | 
						||
| 
								 | 
							
								        $response = m::mock(Response::class);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $this->app->shouldReceive('instance')->once()->with('request', $request);
							 | 
						||
| 
								 | 
							
								        $this->app->shouldReceive('initialize')->once();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $exception = new Exception();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $this->http->shouldReceive('runWithRequest')->once()->with($request)->andThrow($exception);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $handle = m::mock(Handle::class);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $handle->shouldReceive('report')->once()->with($exception);
							 | 
						||
| 
								 | 
							
								        $handle->shouldReceive('render')->once()->with($request, $exception)->andReturn($response);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $this->app->shouldReceive('make')->with(Handle::class)->andReturn($handle);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $this->assertEquals($response, $this->http->run($request));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testEnd()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $response = m::mock(Response::class);
							 | 
						||
| 
								 | 
							
								        $event    = m::mock(Event::class);
							 | 
						||
| 
								 | 
							
								        $event->shouldReceive('trigger')->once()->with(HttpEnd::class, $response);
							 | 
						||
| 
								 | 
							
								        $this->app->shouldReceive('get')->once()->with('event')->andReturn($event);
							 | 
						||
| 
								 | 
							
								        $log = m::mock(Log::class);
							 | 
						||
| 
								 | 
							
								        $log->shouldReceive('save')->once();
							 | 
						||
| 
								 | 
							
								        $this->app->shouldReceive('get')->once()->with('log')->andReturn($log);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $this->http->end($response);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 |