Completed
Pull Request — master (#112)
by
unknown
03:38 queued 01:44
created

CsrfTest::createPostServerRequestWithBodyToken()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 1
eloc 2
c 1
b 0
f 1
nc 1
nop 1
dl 0
loc 4
rs 10
1
<?php
2
3
4
namespace Yiisoft\Yii\Web\Tests\Middleware;
5
6
use Nyholm\Psr7\Factory\Psr17Factory;
7
use Nyholm\Psr7\Response;
8
use Nyholm\Psr7\ServerRequest;
9
use PHPUnit\Framework\MockObject\MockObject;
10
use PHPUnit\Framework\TestCase;
11
use Psr\Http\Message\ResponseInterface;
12
use Psr\Http\Message\ServerRequestInterface;
13
use Psr\Http\Server\RequestHandlerInterface;
14
use Yiisoft\Router\Method;
15
use Yiisoft\Security\Random;
16
use Yiisoft\Security\TokenMasker;
17
use Yiisoft\Yii\Web\Middleware\Csrf;
18
use Yiisoft\Yii\Web\Session\SessionInterface;
19
20
final class CsrfTest extends TestCase
21
{
22
    private const PARAM_NAME = 'csrf';
23
24
    public function testProcessIsValidTokenWithRequest()
25
    {
26
        $token = $this->generateToken();
27
        $middleware = $this->createCsrfMiddlewareWithToken($token);
28
        $response = $middleware->process($this->createPostServerRequestWithBodyToken($token), $this->createRequestHandler());
29
        $this->assertEquals(200, $response->getStatusCode());
30
    }
31
32
33
    public function testProcessIsValidTokenWithHeaders()
34
    {
35
        $token = $this->generateToken();
36
        $middleware = $this->createCsrfMiddlewareWithToken($token);
37
        $response = $middleware->process($this->createPostServerRequestWithHeaderToken($token), $this->createRequestHandler());
38
        $this->assertEquals(200, $response->getStatusCode());
39
    }
40
41
    public function testProcessIsAllowMethod()
42
    {
43
        $middleware = $this->createCsrfMiddlewareWithToken('');
44
        $response = $middleware->process($this->createServerRequest(Method::GET), $this->createRequestHandler());
45
        $this->assertEquals(200, $response->getStatusCode());
46
    }
47
48
    public function testProcessInvalidToken()
49
    {
50
        $middleware = $this->createCsrfMiddlewareWithToken($this->generateToken());
51
        $response = $middleware->process($this->createPostServerRequestWithBodyToken($this->generateToken()), $this->createRequestHandler());
52
        $this->assertEquals(400, $response->getStatusCode());
53
    }
54
55
56
    public function testProcessEmptyTokenInSession()
57
    {
58
        $middleware = $this->createCsrfMiddlewareWithToken('');
59
        $response = $middleware->process($this->createPostServerRequestWithBodyToken($this->generateToken()), $this->createRequestHandler());
60
        $this->assertEquals(400, $response->getStatusCode());
61
    }
62
63
64
    public function testProcessEmptyTokenInRequest()
65
    {
66
        $middleware = $this->createCsrfMiddlewareWithToken($this->generateToken());
67
        $response = $middleware->process($this->createServerRequest(), $this->createRequestHandler());
68
        $this->assertEquals(400, $response->getStatusCode());
69
    }
70
71
72
    private function createServerRequest(string $method = Method::POST, array $bodyParams = [], array $headParams = []): ServerRequestInterface
73
    {
74
        $request = new ServerRequest($method, '/', $headParams);
75
        return $request->withParsedBody($bodyParams);
76
    }
77
78
    private function createPostServerRequestWithBodyToken(string $token): ServerRequestInterface
79
    {
80
        return $this->createServerRequest(Method::POST, [
81
            self::PARAM_NAME => TokenMasker::mask($token),
82
        ]);
83
    }
84
85
    private function createPostServerRequestWithHeaderToken(string $token): ServerRequestInterface
86
    {
87
        return $this->createServerRequest(Method::POST, [], [
88
            Csrf::HEADER_NAME => TokenMasker::mask($token),
89
        ]);
90
    }
91
92
    private function createRequestHandler(): RequestHandlerInterface
93
    {
94
        return new class implements RequestHandlerInterface {
95
            public function handle(ServerRequestInterface $request): ResponseInterface
96
            {
97
                return new Response(200);
98
            }
99
        };
100
    }
101
102
    private function createSessionMock(string $returnToken)
103
    {
104
        /**
105
         * @var SessionInterface|MockObject $sessionMock
106
         */
107
        $sessionMock = $this->createMock(SessionInterface::class);
108
109
        $sessionMock
110
            ->expects($this->once())
111
            ->method('get')
112
            ->willReturn($returnToken);
113
114
        return $sessionMock;
115
    }
116
117
118
    private function createCsrfMiddlewareWithToken(string $token): Csrf
119
    {
120
        $middleware = new Csrf(new Psr17Factory(), $this->createSessionMock($token));
121
        $middleware->setName(self::PARAM_NAME);
122
123
        return $middleware;
124
    }
125
126
    private function generateToken(): string
127
    {
128
        return Random::string();
129
    }
130
}
131