123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- <?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);
- }
- }
|