BodyParserMiddlewareTest   A
last analyzed

Complexity

Total Complexity 7

Size/Duplication

Total Lines 110
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 7
eloc 54
dl 0
loc 110
rs 10
c 0
b 0
f 0

7 Methods

Rating   Name   Duplication   Size   Complexity  
A assertHandlingRequestJustFallsBackToNext() 0 12 1
A requestsFromOtherMethodsJustFallbackToNextMiddleware() 0 7 1
A setUp() 0 3 1
A regularRequestsAreUrlDecoded() 0 25 1
A requestsWithNonEmptyBodyJustFallbackToNextMiddleware() 0 7 1
A provideIgnoredRequestMethods() 0 5 1
A jsonRequestsAreJsonDecoded() 0 26 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace ShlinkioTest\Shlink\Rest\Middleware;
6
7
use Laminas\Diactoros\Response;
8
use Laminas\Diactoros\ServerRequest;
9
use Laminas\Diactoros\Stream;
10
use PHPUnit\Framework\TestCase;
11
use Prophecy\Argument;
12
use Prophecy\PhpUnit\ProphecyTrait;
13
use Prophecy\Prophecy\ProphecyInterface;
14
use Psr\Http\Message\ServerRequestInterface;
15
use Psr\Http\Server\RequestHandlerInterface;
16
use Shlinkio\Shlink\Rest\Middleware\BodyParserMiddleware;
17
18
use function array_shift;
19
20
class BodyParserMiddlewareTest extends TestCase
21
{
22
    use ProphecyTrait;
23
24
    private BodyParserMiddleware $middleware;
25
26
    public function setUp(): void
27
    {
28
        $this->middleware = new BodyParserMiddleware();
29
    }
30
31
    /**
32
     * @test
33
     * @dataProvider provideIgnoredRequestMethods
34
     */
35
    public function requestsFromOtherMethodsJustFallbackToNextMiddleware(string $method): void
36
    {
37
        $request = $this->prophesize(ServerRequestInterface::class);
38
        $request->getMethod()->willReturn($method);
39
        $request->getParsedBody()->willReturn([]);
40
41
        self::assertHandlingRequestJustFallsBackToNext($request);
0 ignored issues
show
Bug Best Practice introduced by
The method ShlinkioTest\Shlink\Rest...stJustFallsBackToNext() is not static, but was called statically. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

41
        self::/** @scrutinizer ignore-call */ 
42
              assertHandlingRequestJustFallsBackToNext($request);
Loading history...
42
    }
43
44
    public function provideIgnoredRequestMethods(): iterable
45
    {
46
        yield 'GET' => ['GET'];
47
        yield 'HEAD' => ['HEAD'];
48
        yield 'OPTIONS' => ['OPTIONS'];
49
    }
50
51
    /** @test */
52
    public function requestsWithNonEmptyBodyJustFallbackToNextMiddleware(): void
53
    {
54
        $request = $this->prophesize(ServerRequestInterface::class);
55
        $request->getMethod()->willReturn('POST');
56
        $request->getParsedBody()->willReturn(['foo' => 'bar']);
57
58
        self::assertHandlingRequestJustFallsBackToNext($request);
0 ignored issues
show
Bug Best Practice introduced by
The method ShlinkioTest\Shlink\Rest...stJustFallsBackToNext() is not static, but was called statically. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

58
        self::/** @scrutinizer ignore-call */ 
59
              assertHandlingRequestJustFallsBackToNext($request);
Loading history...
59
    }
60
61
    private function assertHandlingRequestJustFallsBackToNext(ProphecyInterface $requestMock): void
62
    {
63
        $getContentType = $requestMock->getHeaderLine('Content-type')->willReturn('');
64
        $request = $requestMock->reveal();
65
66
        $nextHandler = $this->prophesize(RequestHandlerInterface::class);
67
        $handle = $nextHandler->handle($request)->willReturn(new Response());
68
69
        $this->middleware->process($request, $nextHandler->reveal());
70
71
        $handle->shouldHaveBeenCalledOnce();
72
        $getContentType->shouldNotHaveBeenCalled();
73
    }
74
75
    /** @test */
76
    public function jsonRequestsAreJsonDecoded(): void
77
    {
78
        $test = $this;
79
        $body = new Stream('php://temp', 'wr');
80
        $body->write('{"foo": "bar", "bar": ["one", 5]}');
81
        $request = (new ServerRequest())->withMethod('PUT')
82
                                        ->withBody($body)
83
                                        ->withHeader('content-type', 'application/json');
84
        $delegate = $this->prophesize(RequestHandlerInterface::class);
85
        $process = $delegate->handle(Argument::type(ServerRequestInterface::class))->will(
86
            function (array $args) use ($test) {
87
                /** @var ServerRequestInterface $req */
88
                $req = array_shift($args);
89
90
                $test->assertEquals([
91
                    'foo' => 'bar',
92
                    'bar' => ['one', 5],
93
                ], $req->getParsedBody());
94
95
                return new Response();
96
            },
97
        );
98
99
        $this->middleware->process($request, $delegate->reveal());
100
101
        $process->shouldHaveBeenCalledOnce();
102
    }
103
104
    /** @test */
105
    public function regularRequestsAreUrlDecoded(): void
106
    {
107
        $test = $this;
108
        $body = new Stream('php://temp', 'wr');
109
        $body->write('foo=bar&bar[]=one&bar[]=5');
110
        $request = (new ServerRequest())->withMethod('PUT')
111
                                        ->withBody($body);
112
        $delegate = $this->prophesize(RequestHandlerInterface::class);
113
        $process = $delegate->handle(Argument::type(ServerRequestInterface::class))->will(
114
            function (array $args) use ($test) {
115
                /** @var ServerRequestInterface $req */
116
                $req = array_shift($args);
117
118
                $test->assertEquals([
119
                    'foo' => 'bar',
120
                    'bar' => ['one', 5],
121
                ], $req->getParsedBody());
122
123
                return new Response();
124
            },
125
        );
126
127
        $this->middleware->process($request, $delegate->reveal());
128
129
        $process->shouldHaveBeenCalledOnce();
130
    }
131
}
132