Passed
Pull Request — master (#198)
by
unknown
17:17 queued 15:11
created

testCustomPrefixDoesNotMatchCompletely()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 10
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 1
Metric Value
cc 1
eloc 6
nc 1
nop 0
dl 0
loc 10
rs 10
c 2
b 0
f 1
1
<?php
2
3
namespace Yiisoft\Yii\Web\Tests\Middleware;
4
5
use Nyholm\Psr7\Response;
6
use Nyholm\Psr7\ServerRequest;
7
use PHPUnit\Framework\MockObject\MockObject;
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\Aliases\Aliases;
13
use Yiisoft\Router\UrlGeneratorInterface;
14
use Yiisoft\Yii\Web\Exception\BadUriPrefixException;
15
use Yiisoft\Yii\Web\Middleware\SubFolder;
16
17
class SubFolderTest extends TestCase
18
{
19
    protected string $urlGeneratorUriPrefix;
20
    protected Aliases $aliases;
21
    protected ?ServerRequestInterface $lastRequest;
22
23
    public function setUp(): void
24
    {
25
        $this->urlGeneratorUriPrefix = '';
26
        $this->lastRequest = null;
27
        $this->aliases = new Aliases(['@web' => '/default/web']);
28
    }
29
30
    public function testDefault(): void
31
    {
32
        $request = $this->createRequest($uri = '/', $script = '/index.php');
33
        $mw = $this->createMiddleware();
34
35
        $this->process($mw, $request);
36
37
        $this->assertEquals('/default/web', $this->aliases->get('@web'));
38
        $this->assertEquals('', $this->urlGeneratorUriPrefix);
39
        $this->assertEquals($uri, $this->getRequestPath());
40
    }
41
42
    public function testCustomPrefix(): void
43
    {
44
        $request = $this->createRequest($uri = '/custom_public/index.php?test', $script = '/index.php');
45
        $mw = $this->createMiddleware();
46
        $mw->prefix = '/custom_public';
47
48
        $this->process($mw, $request);
49
50
        $this->assertEquals('/custom_public', $this->aliases->get('@web'));
51
        $this->assertEquals('/custom_public', $this->urlGeneratorUriPrefix);
52
        $this->assertEquals('/index.php', $this->getRequestPath());
53
    }
54
55
    public function testAutoPrefix(): void
56
    {
57
        $request = $this->createRequest($uri = '/public/', $script = '/public/index.php');
58
        $mw = $this->createMiddleware();
59
60
        $this->process($mw, $request);
61
62
        $this->assertEquals('/public', $this->aliases->get('@web'));
63
        $this->assertEquals('/public', $this->urlGeneratorUriPrefix);
64
        $this->assertEquals('/', $this->getRequestPath());
65
    }
66
67
    public function testAutoPrefixLogn(): void
68
    {
69
        $prefix = '/root/php/dev-server/project-42/index_html/public/web';
70
        $uri = "{$prefix}/";
71
        $script = "{$prefix}/index.php";
72
        $request = $this->createRequest($uri, $script);
73
        $mw = $this->createMiddleware();
74
75
        $this->process($mw, $request);
76
77
        $this->assertEquals($prefix, $this->aliases->get('@web'));
78
        $this->assertEquals($prefix, $this->urlGeneratorUriPrefix);
79
        $this->assertEquals('/', $this->getRequestPath());
80
    }
81
82
    public function testAutoPrefixAndUriWithoutTrailingSlash(): void
83
    {
84
        $request = $this->createRequest($uri = '/public', $script = '/public/index.php');
85
        $mw = $this->createMiddleware();
86
87
        $this->process($mw, $request);
88
89
        $this->assertEquals('/public', $this->aliases->get('@web'));
90
        $this->assertEquals('/public', $this->urlGeneratorUriPrefix);
91
        $this->assertEquals('/', $this->getRequestPath());
92
    }
93
94
    public function testAutoPrefixFullUrl(): void
95
    {
96
        $request = $this->createRequest($uri = '/public/index.php?test', $script = '/public/index.php');
97
        $mw = $this->createMiddleware();
98
99
        $this->process($mw, $request);
100
101
        $this->assertEquals('/public', $this->aliases->get('@web'));
102
        $this->assertEquals('/public', $this->urlGeneratorUriPrefix);
103
        $this->assertEquals('/index.php', $this->getRequestPath());
104
    }
105
106
    public function testFailedAutoPrefix(): void
107
    {
108
        $request = $this->createRequest($uri = '/web/index.php', $script = '/public/index.php');
109
        $mw = $this->createMiddleware();
110
111
        $this->process($mw, $request);
112
113
        $this->assertEquals('/default/web', $this->aliases->get('@web'));
114
        $this->assertEquals('', $this->urlGeneratorUriPrefix);
115
        $this->assertEquals($uri, $this->getRequestPath());
116
    }
117
118
    public function testCustomPrefixWithTrailingSlash(): void
119
    {
120
        $request = $this->createRequest($uri = '/web/', $script = '/public/index.php');
121
        $mw = $this->createMiddleware();
122
        $mw->prefix = '/web/';
123
124
        $this->expectException(BadUriPrefixException::class);
125
        $this->expectExceptionMessage('Wrong URI prefix value');
126
127
        $this->process($mw, $request);
128
    }
129
130
    public function testCustomPrefixFromMiddleOfUri(): void
131
    {
132
        $request = $this->createRequest($uri = '/web/middle/public', $script = '/public/index.php');
133
        $mw = $this->createMiddleware();
134
        $mw->prefix = '/middle';
135
136
        $this->expectException(BadUriPrefixException::class);
137
        $this->expectExceptionMessage('URI prefix does not match');
138
139
        $this->process($mw, $request);
140
    }
141
142
    public function testCustomPrefixDoesNotMatch(): void
143
    {
144
        $request = $this->createRequest($uri = '/web/', $script = '/public/index.php');
145
        $mw = $this->createMiddleware();
146
        $mw->prefix = '/other_prefix';
147
148
        $this->expectException(BadUriPrefixException::class);
149
        $this->expectExceptionMessage('URI prefix does not match');
150
151
        $this->process($mw, $request);
152
    }
153
154
    public function testCustomPrefixDoesNotMatchCompletely(): void
155
    {
156
        $request = $this->createRequest($uri = '/project1/web/', $script = '/public/index.php');
157
        $mw = $this->createMiddleware();
158
        $mw->prefix = '/project1/we';
159
160
        $this->expectException(BadUriPrefixException::class);
161
        $this->expectExceptionMessage('URI prefix does not match completely');
162
163
        $this->process($mw, $request);
164
    }
165
166
    public function testAutoPrefixDoesNotMatchCompletely(): void
167
    {
168
        $request = $this->createRequest($uri = '/public/web/', $script = '/pub/index.php');
169
        $mw = $this->createMiddleware();
170
171
        $this->process($mw, $request);
172
173
        $this->assertEquals('/default/web', $this->aliases->get('@web'));
174
        $this->assertEquals('', $this->urlGeneratorUriPrefix);
175
        $this->assertEquals($uri, $this->getRequestPath());
176
    }
177
178
    private function process(SubFolder $middleware, ServerRequestInterface $request): ResponseInterface
179
    {
180
        $handler = new class implements RequestHandlerInterface {
181
            public ?ServerRequestInterface $request = null;
182
            public function handle(ServerRequestInterface $request): ResponseInterface
183
            {
184
                $this->request = $request;
185
                return new Response();
186
            }
187
        };
188
        $this->lastRequest = &$handler->request;
189
        return $middleware->process($request, $handler);
190
    }
191
192
    private function getRequestPath(): string
193
    {
194
        return $this->lastRequest->getUri()->getPath();
0 ignored issues
show
Bug introduced by
The method getUri() does not exist on null. ( Ignorable by Annotation )

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

194
        return $this->lastRequest->/** @scrutinizer ignore-call */ getUri()->getPath();

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
195
    }
196
197
    private function createMiddleware(): SubFolder
198
    {
199
        // URL Generator
200
        /** @var MockObject|UrlGeneratorInterface $urlGenerator */
201
        $urlGenerator = $this->getMockBuilder(UrlGeneratorInterface::class)->getMock();
202
        $urlGenerator->method('setUriPrefix')->willReturnCallback(function ($prefix) {
203
            $this->urlGeneratorUriPrefix = $prefix;
204
        });
205
        $urlGenerator->method('getUriPrefix')->willReturnReference($this->urlGeneratorUriPrefix);
206
207
        return new SubFolder($urlGenerator, $this->aliases);
208
    }
209
210
    private function createRequest(string $uri = '/', string $scriptPath = '/'): ServerRequestInterface
211
    {
212
        $request = new ServerRequest('get', $uri, [], null, '1.1', ['SCRIPT_NAME' => $scriptPath]);
213
        return $request;
214
    }
215
}
216