Passed
Push — master ( 81ac1b...8d070d )
by Alexander
07:32
created

MiddlewareTest::testLimitingIsStartedWhenExpected()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 27
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 16
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 27
rs 9.7333
1
<?php
2
3
namespace Yiisoft\Yii\RateLimiter\Tests;
4
5
use Nyholm\Psr7\Factory\Psr17Factory;
6
use Nyholm\Psr7\Response;
7
use Nyholm\Psr7\ServerRequest;
8
use PHPUnit\Framework\TestCase;
9
use Psr\Http\Message\ServerRequestInterface;
10
use Psr\Http\Server\RequestHandlerInterface;
11
use Yiisoft\Http\Method;
12
use Yiisoft\Yii\RateLimiter\CounterInterface;
13
use Yiisoft\Yii\RateLimiter\Middleware;
14
15
final class MiddlewareTest extends TestCase
16
{
17
    public function testSingleRequestWorksAsExpected(): void
18
    {
19
        $counter = new FakeCounter(100, 100);
20
        $response = $this->createRateLimiter($counter)->process($this->createRequest(), $this->createRequestHandler());
21
        $this->assertEquals(200, $response->getStatusCode());
22
23
        $this->assertEquals(
24
            [
25
                'X-Rate-Limit-Limit' => ['100'],
26
                'X-Rate-Limit-Remaining' => ['99'],
27
                'X-Rate-Limit-Reset' => ['100'],
28
            ],
29
            $response->getHeaders()
30
        );
31
    }
32
33
    public function testLimitingIsStartedWhenExpected(): void
34
    {
35
        $counter = new FakeCounter(2, 100);
36
        $middleware = $this->createRateLimiter($counter);
37
38
        // last allowed request
39
        $response = $middleware->process($this->createRequest(), $this->createRequestHandler());
40
        $this->assertEquals(200, $response->getStatusCode());
41
        $this->assertEquals(
42
            [
43
                'X-Rate-Limit-Limit' => ['2'],
44
                'X-Rate-Limit-Remaining' => ['1'],
45
                'X-Rate-Limit-Reset' => ['100'],
46
            ],
47
            $response->getHeaders()
48
        );
49
50
        // first denied request
51
        $response = $middleware->process($this->createRequest(), $this->createRequestHandler());
52
        $this->assertEquals(429, $response->getStatusCode());
53
        $this->assertEquals(
54
            [
55
                'X-Rate-Limit-Limit' => ['2'],
56
                'X-Rate-Limit-Remaining' => ['0'],
57
                'X-Rate-Limit-Reset' => ['100'],
58
            ],
59
            $response->getHeaders()
60
        );
61
    }
62
63
    public function testCounterIdCouldBeSet(): void
64
    {
65
        $counter = new FakeCounter(100, 100);
66
        $middleware = $this->createRateLimiter($counter)->withCounterId('custom-id');
67
        $middleware->process($this->createRequest(), $this->createRequestHandler());
68
        $this->assertEquals('custom-id', $counter->getId());
69
    }
70
71
    public function testCounterIdCouldBeSetWithCallback(): void
72
    {
73
        $counter = new FakeCounter(100, 100);
74
        $middleware = $this->createRateLimiter($counter)->withCounterIdCallback(
75
            static function (ServerRequestInterface $request) {
76
                return $request->getMethod();
77
            }
78
        );
79
80
        $middleware->process($this->createRequest(), $this->createRequestHandler());
81
        $this->assertEquals('GET', $counter->getId());
82
    }
83
84
    private function createRequestHandler(): RequestHandlerInterface
85
    {
86
        $requestHandler = $this->createMock(RequestHandlerInterface::class);
87
        $requestHandler
88
            ->method('handle')
89
            ->willReturn(new Response(200));
90
91
        return $requestHandler;
92
    }
93
94
    private function createRequest(string $method = Method::GET, string $uri = '/'): ServerRequestInterface
95
    {
96
        return new ServerRequest($method, $uri);
97
    }
98
99
    private function createRateLimiter(CounterInterface $counter): Middleware
100
    {
101
        return new Middleware($counter, new Psr17Factory());
102
    }
103
}
104