3 * @copyright Copyright (C) 2010-2023, the Friendica project
5 * @license GNU AGPL version 3 or any later version
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.
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.
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/>.
22 namespace Friendica\Test\src\App;
25 use PHPUnit\Framework\TestCase;
27 class ArgumentsTest extends TestCase
29 private function assertArguments(array $assert, App\Arguments $arguments)
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());
40 * Test the default argument without any determinations
42 public function testDefault()
44 $arguments = new App\Arguments();
46 self::assertArguments([
51 'method' => App\Router::GET
56 public function dataArguments()
61 'queryString' => 'profile/test/it?arg1=value1&arg2=value2',
62 'command' => 'profile/test/it',
63 'argv' => ['profile', 'test', 'it'],
65 'method' => App\Router::GET,
68 'QUERY_STRING' => 'pagename=profile/test/it&arg1=value1&arg2=value2',
71 'pagename' => 'profile/test/it',
74 'withUnixHomeDir' => [
76 'queryString' => '~test/it?arg1=value1&arg2=value2',
77 'command' => '~test/it',
78 'argv' => ['~test', 'it'],
80 'method' => App\Router::GET,
83 'QUERY_STRING' => 'pagename=~test/it&arg1=value1&arg2=value2',
86 'pagename' => '~test/it',
89 'withDiasporaHomeDir' => [
91 'queryString' => 'u/test/it?arg1=value1&arg2=value2',
92 'command' => 'u/test/it',
93 'argv' => ['u', 'test', 'it'],
95 'method' => App\Router::GET,
98 'QUERY_STRING' => 'pagename=u/test/it&arg1=value1&arg2=value2',
101 'pagename' => 'u/test/it',
104 'withTrailingSlash' => [
106 'queryString' => 'profile/test/it?arg1=value1&arg2=value2%2F',
107 'command' => 'profile/test/it',
108 'argv' => ['profile', 'test', 'it'],
110 'method' => App\Router::GET,
113 'QUERY_STRING' => 'pagename=profile/test/it&arg1=value1&arg2=value2/',
116 'pagename' => 'profile/test/it',
119 'withWrongQueryString' => [
121 'queryString' => 'profile/test/it?wrong=profile%2Ftest%2Fit&arg1=value1&arg2=value2%2F',
122 'command' => 'profile/test/it',
123 'argv' => ['profile', 'test', 'it'],
125 'method' => App\Router::GET,
128 'QUERY_STRING' => 'wrong=profile/test/it&arg1=value1&arg2=value2/',
131 'pagename' => 'profile/test/it',
134 'withMissingPageName' => [
136 'queryString' => 'notvalid/it?arg1=value1&arg2=value2%2F',
137 'command' => 'notvalid/it',
138 'argv' => ['notvalid', 'it'],
140 'method' => App\Router::GET,
143 'QUERY_STRING' => 'pagename=notvalid/it&arg1=value1&arg2=value2/',
150 'queryString' => '?arg1=value1&arg2=value2%2F',
154 'method' => App\Router::GET,
157 'QUERY_STRING' => 'arg1=value1&arg2=value2/',
162 'withFileExtension' => [
164 'queryString' => 'api/call.json',
165 'command' => 'api/call.json',
166 'argv' => ['api', 'call.json'],
168 'method' => App\Router::GET,
171 'QUERY_STRING' => 'pagename=api/call.json',
174 'pagename' => 'api/call.json'
177 'withHTTPMethod' => [
179 'queryString' => 'api/call.json',
180 'command' => 'api/call.json',
181 'argv' => ['api', 'call.json'],
183 'method' => App\Router::POST,
186 'QUERY_STRING' => 'pagename=api/call.json',
187 'REQUEST_METHOD' => App\Router::POST,
190 'pagename' => 'api/call.json'
197 * Test all variants of argument determination
199 * @dataProvider dataArguments
201 public function testDetermine(array $assert, array $server, array $get)
203 $arguments = (new App\Arguments())
204 ->determine($server, $get);
206 self::assertArguments($assert, $arguments);
210 * Test if the get/has methods are working for the determined arguments
212 * @dataProvider dataArguments
214 public function testGetHas(array $assert, array $server, array $get)
216 $arguments = (new App\Arguments())
217 ->determine($server, $get);
219 for ($i = 0; $i < $arguments->getArgc(); $i++) {
220 self::assertTrue($arguments->has($i));
221 self::assertEquals($assert['argv'][$i], $arguments->get($i));
224 self::assertFalse($arguments->has($arguments->getArgc()));
225 self::assertEmpty($arguments->get($arguments->getArgc()));
226 self::assertEquals('default', $arguments->get($arguments->getArgc(), 'default'));
229 public function dataStripped()
232 'strippedZRLFirst' => [
233 'assert' => '?arg1=value1',
234 'input' => '&zrl=nope&arg1=value1',
236 'strippedZRLLast' => [
237 'assert' => '?arg1=value1',
238 'input' => '&arg1=value1&zrl=nope',
240 'strippedZTLMiddle' => [
241 'assert' => '?arg1=value1&arg2=value2',
242 'input' => '&arg1=value1&zrl=nope&arg2=value2',
244 'strippedOWTFirst' => [
245 'assert' => '?arg1=value1',
246 'input' => '&owt=test&arg1=value1',
248 'strippedOWTLast' => [
249 'assert' => '?arg1=value1',
250 'input' => '&arg1=value1&owt=test',
252 'strippedOWTMiddle' => [
253 'assert' => '?arg1=value1&arg2=value2',
254 'input' => '&arg1=value1&owt=test&arg2=value2',
260 * Test the ZRL and OWT stripping
262 * @dataProvider dataStripped
264 public function testStrippedQueries(string $assert, string $input)
266 $command = 'test/it';
268 $arguments = (new App\Arguments())
269 ->determine(['QUERY_STRING' => 'pagename=' . $command . $input,], ['pagename' => $command]);
271 self::assertEquals($command . $assert, $arguments->getQueryString());
275 * Test that arguments are immutable
277 public function testImmutable()
279 $argument = new App\Arguments();
281 $argNew = $argument->determine([], []);
283 self::assertNotSame($argument, $argNew);