Passed
Push — master ( b75818...b2c04e )
by Alexander
11:23
created

RouterTest.php$1 ➔ getRequestHandler()   A

Complexity

Conditions 1

Size

Total Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 6
rs 10
cc 1
1
<?php
2
namespace Yiisoft\Router\Tests\Middleware;
3
4
use Nyholm\Psr7\Response;
5
use Nyholm\Psr7\Factory\Psr17Factory;
6
use Nyholm\Psr7\ServerRequest;
7
use PHPUnit\Framework\TestCase;
8
use Psr\Http\Message\ResponseInterface;
9
use Psr\Http\Message\ServerRequestInterface;
10
use Psr\Http\Server\MiddlewareInterface;
11
use Psr\Http\Server\RequestHandlerInterface;
12
use Yiisoft\Router\MatchingResult;
13
use Yiisoft\Router\Method;
14
use Yiisoft\Router\Middleware\Router;
15
use Yiisoft\Router\Route;
16
use Yiisoft\Router\UrlMatcherInterface;
17
18
final class RouterTest extends TestCase
19
{
20
    private function createRouterMiddleware(): Router
21
    {
22
        return new Router($this->getMatcher(), new Psr17Factory());
23
    }
24
25
    private function processWithRouter(ServerRequestInterface $request): ResponseInterface
26
    {
27
        return $this->createRouterMiddleware()->process($request, $this->createRequestHandler());
28
    }
29
30
    public function testProcessSuccess(): void
31
    {
32
        $request = new ServerRequest('GET', '/');
33
        $response = $this->processWithRouter($request);
34
        $this->assertSame(201, $response->getStatusCode());
35
    }
36
37
    public function testMissingRouteRespondWith404(): void
38
    {
39
        $request = new ServerRequest('GET', '/no-such-route');
40
        $response = $this->processWithRouter($request);
41
        $this->assertSame(404, $response->getStatusCode());
42
    }
43
44
    public function testMethodMismatchRespondWith405(): void
45
    {
46
        $request = new ServerRequest('POST', '/');
47
        $response = $this->processWithRouter($request);
48
        $this->assertSame(405, $response->getStatusCode());
49
        $this->assertSame('GET, HEAD', $response->getHeaderLine('Allow'));
50
    }
51
52
    private function getMatcher(): UrlMatcherInterface
53
    {
54
        $middleware = $this->createRouteMiddleware();
55
56
        return new class ($middleware) implements UrlMatcherInterface
57
        {
58
            private $middleware;
59
60
            public function __construct(MiddlewareInterface $middleware)
61
            {
62
                $this->middleware = $middleware;
63
            }
64
65
            /**
66
             * Emulates router with a single `GET /` route
67
             * @param ServerRequestInterface $request
68
             * @return MatchingResult
69
             */
70
            public function match(ServerRequestInterface $request): MatchingResult
71
            {
72
                if ($request->getUri()->getPath() !== '/') {
73
                    return MatchingResult::fromFailure(Method::ANY);
74
                }
75
76
                if ($request->getMethod() === 'GET') {
77
                    $route = Route::get('/')->to($this->middleware);
78
                    return MatchingResult::fromSuccess($route, ['parameter' => 'value']);
79
                }
80
81
                return MatchingResult::fromFailure([Method::GET, Method::HEAD]);
82
            }
83
        };
84
    }
85
86
    private function createRequestHandler(): RequestHandlerInterface
87
    {
88
        return new class implements RequestHandlerInterface {
89
            public function handle(ServerRequestInterface $request): ResponseInterface
90
            {
91
                return new Response(404);
92
            }
93
        };
94
    }
95
96
    private function createRouteMiddleware(): MiddlewareInterface
97
    {
98
        return new class implements MiddlewareInterface {
99
            public function process(
100
              ServerRequestInterface $request,
101
              RequestHandlerInterface $handler
102
            ): ResponseInterface
103
            {
104
                return (new Response())->withStatus(201);
105
            }
106
        };
107
    }
108
}
109