]> git.mxchange.org Git - friendica.git/blob - tests/src/App/ArgumentsTest.php
Merge pull request #12606 from nupplaphil/bug/file_put
[friendica.git] / tests / src / App / ArgumentsTest.php
1 <?php
2 /**
3  * @copyright Copyright (C) 2010-2023, the Friendica project
4  *
5  * @license GNU AGPL version 3 or any later version
6  *
7  * This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU Affero General Public License as
9  * published by the Free Software Foundation, either version 3 of the
10  * License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU Affero General Public License for more details.
16  *
17  * You should have received a copy of the GNU Affero General Public License
18  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
19  *
20  */
21
22 namespace Friendica\Test\src\App;
23
24 use Friendica\App;
25 use PHPUnit\Framework\TestCase;
26
27 class ArgumentsTest extends TestCase
28 {
29         private function assertArguments(array $assert, App\Arguments $arguments)
30         {
31                 self::assertEquals($assert['queryString'], $arguments->getQueryString());
32                 self::assertEquals($assert['command'], $arguments->getCommand());
33                 self::assertEquals($assert['argv'], $arguments->getArgv());
34                 self::assertEquals($assert['argc'], $arguments->getArgc());
35                 self::assertEquals($assert['method'], $arguments->getMethod());
36                 self::assertCount($assert['argc'], $arguments->getArgv());
37         }
38
39         /**
40          * Test the default argument without any determinations
41          */
42         public function testDefault()
43         {
44                 $arguments = new App\Arguments();
45
46                 self::assertArguments([
47                         'queryString' => '',
48                         'command'     => '',
49                         'argv'        => [],
50                         'argc'        => 0,
51                         'method'      => App\Router::GET
52                 ],
53                         $arguments);
54         }
55
56         public function dataArguments()
57         {
58                 return [
59                         'withPagename'         => [
60                                 'assert' => [
61                                         'queryString' => 'profile/test/it?arg1=value1&arg2=value2',
62                                         'command'     => 'profile/test/it',
63                                         'argv'        => ['profile', 'test', 'it'],
64                                         'argc'        => 3,
65                                         'method'      => App\Router::GET,
66                                 ],
67                                 'server' => [
68                                         'QUERY_STRING' => 'pagename=profile/test/it&arg1=value1&arg2=value2',
69                                 ],
70                                 'get'    => [
71                                         'pagename' => 'profile/test/it',
72                                 ],
73                         ],
74                         'withUnixHomeDir'      => [
75                                 'assert' => [
76                                         'queryString' => '~test/it?arg1=value1&arg2=value2',
77                                         'command'     => '~test/it',
78                                         'argv'        => ['~test', 'it'],
79                                         'argc'        => 2,
80                                         'method'      => App\Router::GET,
81                                 ],
82                                 'server' => [
83                                         'QUERY_STRING' => 'pagename=~test/it&arg1=value1&arg2=value2',
84                                 ],
85                                 'get'    => [
86                                         'pagename' => '~test/it',
87                                 ],
88                         ],
89                         'withDiasporaHomeDir'  => [
90                                 'assert' => [
91                                         'queryString' => 'u/test/it?arg1=value1&arg2=value2',
92                                         'command'     => 'u/test/it',
93                                         'argv'        => ['u', 'test', 'it'],
94                                         'argc'        => 3,
95                                         'method'      => App\Router::GET,
96                                 ],
97                                 'server' => [
98                                         'QUERY_STRING' => 'pagename=u/test/it&arg1=value1&arg2=value2',
99                                 ],
100                                 'get'    => [
101                                         'pagename' => 'u/test/it',
102                                 ],
103                         ],
104                         'withTrailingSlash'    => [
105                                 'assert' => [
106                                         'queryString' => 'profile/test/it?arg1=value1&arg2=value2%2F',
107                                         'command'     => 'profile/test/it',
108                                         'argv'        => ['profile', 'test', 'it'],
109                                         'argc'        => 3,
110                                         'method'      => App\Router::GET,
111                                 ],
112                                 'server' => [
113                                         'QUERY_STRING' => 'pagename=profile/test/it&arg1=value1&arg2=value2/',
114                                 ],
115                                 'get'    => [
116                                         'pagename' => 'profile/test/it',
117                                 ],
118                         ],
119                         'withWrongQueryString' => [
120                                 'assert' => [
121                                         'queryString' => 'profile/test/it?wrong=profile%2Ftest%2Fit&arg1=value1&arg2=value2%2F',
122                                         'command'     => 'profile/test/it',
123                                         'argv'        => ['profile', 'test', 'it'],
124                                         'argc'        => 3,
125                                         'method'      => App\Router::GET,
126                                 ],
127                                 'server' => [
128                                         'QUERY_STRING' => 'wrong=profile/test/it&arg1=value1&arg2=value2/',
129                                 ],
130                                 'get'    => [
131                                         'pagename' => 'profile/test/it',
132                                 ],
133                         ],
134                         'withMissingPageName'  => [
135                                 'assert' => [
136                                         'queryString' => 'notvalid/it?arg1=value1&arg2=value2%2F',
137                                         'command'     => 'notvalid/it',
138                                         'argv'        => ['notvalid', 'it'],
139                                         'argc'        => 2,
140                                         'method'      => App\Router::GET,
141                                 ],
142                                 'server' => [
143                                         'QUERY_STRING' => 'pagename=notvalid/it&arg1=value1&arg2=value2/',
144                                 ],
145                                 'get'    => [
146                                 ],
147                         ],
148                         'withNothing'  => [
149                                 'assert' => [
150                                         'queryString' => '?arg1=value1&arg2=value2%2F',
151                                         'command'     => '',
152                                         'argv'        => [],
153                                         'argc'        => 0,
154                                         'method'      => App\Router::GET,
155                                 ],
156                                 'server' => [
157                                         'QUERY_STRING' => 'arg1=value1&arg2=value2/',
158                                 ],
159                                 'get'    => [
160                                 ],
161                         ],
162                         'withFileExtension'  => [
163                                 'assert' => [
164                                         'queryString' => 'api/call.json',
165                                         'command'     => 'api/call.json',
166                                         'argv'        => ['api', 'call.json'],
167                                         'argc'        => 2,
168                                         'method'      => App\Router::GET,
169                                 ],
170                                 'server' => [
171                                         'QUERY_STRING' => 'pagename=api/call.json',
172                                 ],
173                                 'get'    => [
174                                         'pagename' => 'api/call.json'
175                                 ],
176                         ],
177                         'withHTTPMethod'  => [
178                                 'assert' => [
179                                         'queryString' => 'api/call.json',
180                                         'command'     => 'api/call.json',
181                                         'argv'        => ['api', 'call.json'],
182                                         'argc'        => 2,
183                                         'method'      => App\Router::POST,
184                                 ],
185                                 'server' => [
186                                         'QUERY_STRING' => 'pagename=api/call.json',
187                                         'REQUEST_METHOD' => App\Router::POST,
188                                 ],
189                                 'get'    => [
190                                         'pagename' => 'api/call.json'
191                                 ],
192                         ],
193                 ];
194         }
195
196         /**
197          * Test all variants of argument determination
198          *
199          * @dataProvider dataArguments
200          */
201         public function testDetermine(array $assert, array $server, array $get)
202         {
203                 $arguments = (new App\Arguments())
204                         ->determine($server, $get);
205
206                 self::assertArguments($assert, $arguments);
207         }
208
209         /**
210          * Test if the get/has methods are working for the determined arguments
211          *
212          * @dataProvider dataArguments
213          */
214         public function testGetHas(array $assert, array $server, array $get)
215         {
216                 $arguments = (new App\Arguments())
217                         ->determine($server, $get);
218
219                 for ($i = 0; $i < $arguments->getArgc(); $i++) {
220                         self::assertTrue($arguments->has($i));
221                         self::assertEquals($assert['argv'][$i], $arguments->get($i));
222                 }
223
224                 self::assertFalse($arguments->has($arguments->getArgc()));
225                 self::assertEmpty($arguments->get($arguments->getArgc()));
226                 self::assertEquals('default', $arguments->get($arguments->getArgc(), 'default'));
227         }
228
229         public function dataStripped()
230         {
231                 return [
232                         'strippedZRLFirst'  => [
233                                 'assert' => '?arg1=value1',
234                                 'input'  => '&zrl=nope&arg1=value1',
235                         ],
236                         'strippedZRLLast'   => [
237                                 'assert' => '?arg1=value1',
238                                 'input'  => '&arg1=value1&zrl=nope',
239                         ],
240                         'strippedZTLMiddle' => [
241                                 'assert' => '?arg1=value1&arg2=value2',
242                                 'input'  => '&arg1=value1&zrl=nope&arg2=value2',
243                         ],
244                         'strippedOWTFirst'  => [
245                                 'assert' => '?arg1=value1',
246                                 'input'  => '&owt=test&arg1=value1',
247                         ],
248                         'strippedOWTLast'   => [
249                                 'assert' => '?arg1=value1',
250                                 'input'  => '&arg1=value1&owt=test',
251                         ],
252                         'strippedOWTMiddle' => [
253                                 'assert' => '?arg1=value1&arg2=value2',
254                                 'input'  => '&arg1=value1&owt=test&arg2=value2',
255                         ],
256                 ];
257         }
258
259         /**
260          * Test the ZRL and OWT stripping
261          *
262          * @dataProvider dataStripped
263          */
264         public function testStrippedQueries(string $assert, string $input)
265         {
266                 $command = 'test/it';
267
268                 $arguments = (new App\Arguments())
269                         ->determine(['QUERY_STRING' => 'pagename=' . $command . $input,], ['pagename' => $command]);
270
271                 self::assertEquals($command . $assert, $arguments->getQueryString());
272         }
273
274         /**
275          * Test that arguments are immutable
276          */
277         public function testImmutable()
278         {
279                 $argument = new App\Arguments();
280
281                 $argNew = $argument->determine([], []);
282
283                 self::assertNotSame($argument, $argNew);
284         }
285 }