Passed
Pull Request — master (#204)
by
unknown
02:16
created

anonymous//tests/RateLimiter/RateLimiterTest.php$0   A

Complexity

Total Complexity 1

Size/Duplication

Total Lines 4
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 4
rs 10
wmc 1
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\CacheCounter;
15
use Yiisoft\Yii\Web\RateLimiter\RateLimiter;
16
17
final class RateLimiterTest extends TestCase
18
{
19
    /**
20
     * @test
21
     */
22
    public function singleRequestIsAllowed(): void
23
    {
24
        $middleware = $this->createRateLimiter($this->getCounter(1000));
25
        $response = $middleware->process($this->createRequest(), $this->createRequestHandler());
26
        $this->assertEquals(200, $response->getStatusCode());
27
    }
28
29
    /**
30
     * @test
31
     */
32
    public function moreThanDefaultNumberOfRequestsIsNotAllowed(): void
33
    {
34
        $middleware = $this->createRateLimiter($this->getCounter(1000));
35
36
        for ($i = 0; $i < 999; $i++) {
37
            $middleware->process($this->createRequest(), $this->createRequestHandler());
38
        }
39
40
        $response = $middleware->process($this->createRequest(), $this->createRequestHandler());
41
        $this->assertEquals(429, $response->getStatusCode());
42
    }
43
44
    /**
45
     * @test
46
     */
47
    public function customLimitWorksAsExpected(): void
48
    {
49
        $middleware = $this->createRateLimiter($this->getCounter(10));
50
51
        for ($i = 0; $i < 8; $i++) {
52
            $middleware->process($this->createRequest(), $this->createRequestHandler());
53
        }
54
55
        $response = $middleware->process($this->createRequest(), $this->createRequestHandler());
56
        $this->assertEquals(200, $response->getStatusCode());
57
58
        $response = $middleware->process($this->createRequest(), $this->createRequestHandler());
59
        $this->assertEquals(429, $response->getStatusCode());
60
    }
61
62
    /**
63
     * @test
64
     */
65
    public function withManualCounterId(): void
66
    {
67
        $cache = new ArrayCache();
68
        $counter = new CacheCounter(100, 3600, $cache);
69
70
        $middleware = $this->createRateLimiter($counter)->withCounterId('custom-id');
71
        $middleware->process($this->createRequest(), $this->createRequestHandler());
72
73
        $this->assertTrue($cache->has('custom-id'));
74
    }
75
76
    /**
77
     * @test
78
     */
79
    public function withManualCounterByCallback(): void
80
    {
81
        $cache = new ArrayCache();
82
        $counter = new CacheCounter(100, 3600, $cache);
83
84
        $middleware = $this->createRateLimiter($counter)->withCounterIdCallback(
85
            static function (ServerRequestInterface $request) {
86
                return $request->getMethod();
87
            }
88
        );
89
90
        $middleware->process($this->createRequest(), $this->createRequestHandler());
91
        $this->assertTrue($cache->has('GET'));
92
    }
93
94
    private function getCounter(int $limit): CacheCounter
95
    {
96
        return new CacheCounter($limit, 3600, new ArrayCache());
97
    }
98
99
    private function createRequestHandler(): RequestHandlerInterface
100
    {
101
        return new class implements RequestHandlerInterface {
102
            public function handle(ServerRequestInterface $request): ResponseInterface
103
            {
104
                return new Response(200);
105
            }
106
        };
107
    }
108
109
    private function createRequest(string $method = Method::GET, string $uri = '/'): ServerRequestInterface
110
    {
111
        return new ServerRequest($method, $uri);
112
    }
113
114
    private function createRateLimiter(CacheCounter $counter): RateLimiter
115
    {
116
        return new RateLimiter($counter, new Psr17Factory());
117
    }
118
}
119