Passed
Pull Request — master (#203)
by
unknown
01:55
created

RateLimiterTest.php$1 ➔ createRequest()   A

Complexity

Conditions 1

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
c 0
b 0
f 0
dl 0
loc 3
rs 10
1
<?php
2
3
namespace Yiisoft\Yii\Web\Tests\RateLimiter;
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\ResponseInterface;
10
use Psr\Http\Message\ServerRequestInterface;
11
use Psr\Http\Server\RequestHandlerInterface;
12
use Yiisoft\Cache\ArrayCache;
13
use Yiisoft\Http\Method;
14
use Yiisoft\Yii\Web\RateLimiter\CacheStorage;
15
use Yiisoft\Yii\Web\RateLimiter\Counter;
16
use Yiisoft\Yii\Web\RateLimiter\RateLimiter;
17
18
final class RateLimiterTest extends TestCase
19
{
20
    /**
21
     * @test
22
     */
23
    public function singleRequestIsAllowed(): void
24
    {
25
        $middleware = $this->createRateLimiter($this->getCounter());
26
        $response = $middleware->process($this->createRequest(), $this->createRequestHandler());
27
        $this->assertEquals(200, $response->getStatusCode());
28
    }
29
30
    /**
31
     * @test
32
     */
33
    public function moreThanDefaultNumberOfRequestsIsNotAllowed(): void
34
    {
35
        $middleware = $this->createRateLimiter($this->getCounter());
36
37
        for ($i = 0; $i < 1000; $i++) {
38
            $middleware->process($this->createRequest(), $this->createRequestHandler());
39
        }
40
41
        $response = $middleware->process($this->createRequest(), $this->createRequestHandler());
42
        $this->assertEquals(429, $response->getStatusCode());
43
    }
44
45
    /**
46
     * @test
47
     */
48
    public function customLimitWorksAsExpected(): void
49
    {
50
        $middleware = $this->createRateLimiter($this->getCounter())->withLimit(11);
51
52
        for ($i = 0; $i < 10; $i++) {
53
            $middleware->process($this->createRequest(), $this->createRequestHandler());
54
        }
55
56
        $response = $middleware->process($this->createRequest(), $this->createRequestHandler());
57
        $this->assertEquals(200, $response->getStatusCode());
58
59
        $response = $middleware->process($this->createRequest(), $this->createRequestHandler());
60
        $this->assertEquals(429, $response->getStatusCode());
61
    }
62
63
    /**
64
     * @test
65
     */
66
    public function disableAutoIncrement(): void
67
    {
68
        $counter = $this->getCounter();
69
        $middleware = $this->createRateLimiter($counter)->setAutoIncrement(false);
70
        $response = $middleware->process($this->createRequest(), $this->createRequestHandler());
71
        $this->assertEquals(200, $response->getStatusCode());
72
        $this->assertEquals(0, $counter->getCounterValue());
73
    }
74
75
    private function getCounter(): Counter
76
    {
77
        return new Counter(new CacheStorage(new ArrayCache()));
78
    }
79
80
    private function createRequestHandler(): RequestHandlerInterface
81
    {
82
        return new class implements RequestHandlerInterface {
83
            public function handle(ServerRequestInterface $request): ResponseInterface
84
            {
85
                return new Response(200);
86
            }
87
        };
88
    }
89
90
    private function createRequest(string $method = Method::GET, string $uri = '/'): ServerRequestInterface
91
    {
92
        return new ServerRequest($method, $uri);
93
    }
94
95
    private function createRateLimiter(Counter $counter): RateLimiter
96
    {
97
        return new RateLimiter($counter, new Psr17Factory());
98
    }
99
}
100