]> git.mxchange.org Git - friendica.git/blob - tests/src/App/ArgumentsTest.php
Introduce Arguments / Module class
[friendica.git] / tests / src / App / ArgumentsTest.php
1 <?php
2
3 namespace Friendica\Test\src\App;
4
5 use Friendica\App;
6 use PHPUnit\Framework\TestCase;
7
8 class ArgumentsTest extends TestCase
9 {
10         private function assertArguments(array $assert, App\Arguments $arguments)
11         {
12                 $this->assertEquals($assert['queryString'], $arguments->getQueryString());
13                 $this->assertEquals($assert['command'], $arguments->getCommand());
14                 $this->assertEquals($assert['argv'], $arguments->getArgv());
15                 $this->assertEquals($assert['argc'], $arguments->getArgc());
16                 $this->assertCount($assert['argc'], $arguments->getArgv());
17         }
18
19         /**
20          * Test the default argument without any determinations
21          */
22         public function testDefault()
23         {
24                 $arguments = new App\Arguments();
25
26                 $this->assertArguments([
27                         'queryString' => '',
28                         'command'     => '',
29                         'argv'        => ['home'],
30                         'argc'        => 1,
31                 ],
32                         $arguments);
33         }
34
35         public function dataArguments()
36         {
37                 return [
38                         'withPagename'         => [
39                                 'assert' => [
40                                         'queryString' => 'profile/test/it?arg1=value1&arg2=value2',
41                                         'command'     => 'profile/test/it',
42                                         'argv'        => ['profile', 'test', 'it'],
43                                         'argc'        => 3,
44                                 ],
45                                 'server' => [
46                                         'QUERY_STRING' => 'pagename=profile/test/it?arg1=value1&arg2=value2',
47                                 ],
48                                 'get'    => [
49                                         'pagename' => 'profile/test/it',
50                                 ],
51                         ],
52                         'withQ'                => [
53                                 'assert' => [
54                                         'queryString' => 'profile/test/it?arg1=value1&arg2=value2',
55                                         'command'     => 'profile/test/it',
56                                         'argv'        => ['profile', 'test', 'it'],
57                                         'argc'        => 3,
58                                 ],
59                                 'server' => [
60                                         'QUERY_STRING' => 'q=profile/test/it?arg1=value1&arg2=value2',
61                                 ],
62                                 'get'    => [
63                                         'q' => 'profile/test/it',
64                                 ],
65                         ],
66                         'withWrongDelimiter'   => [
67                                 'assert' => [
68                                         'queryString' => 'profile/test/it?arg1=value1&arg2=value2',
69                                         'command'     => 'profile/test/it',
70                                         'argv'        => ['profile', 'test', 'it'],
71                                         'argc'        => 3,
72                                 ],
73                                 'server' => [
74                                         'QUERY_STRING' => 'pagename=profile/test/it&arg1=value1&arg2=value2',
75                                 ],
76                                 'get'    => [
77                                         'pagename' => 'profile/test/it',
78                                 ],
79                         ],
80                         'withUnixHomeDir'      => [
81                                 'assert' => [
82                                         'queryString' => '~test/it?arg1=value1&arg2=value2',
83                                         'command'     => 'profile/test/it',
84                                         'argv'        => ['profile', 'test', 'it'],
85                                         'argc'        => 3,
86                                 ],
87                                 'server' => [
88                                         'QUERY_STRING' => 'pagename=~test/it?arg1=value1&arg2=value2',
89                                 ],
90                                 'get'    => [
91                                         'pagename' => '~test/it',
92                                 ],
93                         ],
94                         'withDiasporaHomeDir'  => [
95                                 'assert' => [
96                                         'queryString' => 'u/test/it?arg1=value1&arg2=value2',
97                                         'command'     => 'profile/test/it',
98                                         'argv'        => ['profile', 'test', 'it'],
99                                         'argc'        => 3,
100                                 ],
101                                 'server' => [
102                                         'QUERY_STRING' => 'pagename=u/test/it?arg1=value1&arg2=value2',
103                                 ],
104                                 'get'    => [
105                                         'pagename' => 'u/test/it',
106                                 ],
107                         ],
108                         'withTrailingSlash'    => [
109                                 'assert' => [
110                                         'queryString' => 'profile/test/it?arg1=value1&arg2=value2/',
111                                         'command'     => 'profile/test/it',
112                                         'argv'        => ['profile', 'test', 'it'],
113                                         'argc'        => 3,
114                                 ],
115                                 'server' => [
116                                         'QUERY_STRING' => 'pagename=profile/test/it?arg1=value1&arg2=value2/',
117                                 ],
118                                 'get'    => [
119                                         'pagename' => 'profile/test/it',
120                                 ],
121                         ],
122                         'withWrongQueryString' => [
123                                 'assert' => [
124                                         // empty query string?!
125                                         'queryString' => '',
126                                         'command'     => 'profile/test/it',
127                                         'argv'        => ['profile', 'test', 'it'],
128                                         'argc'        => 3,
129                                 ],
130                                 'server' => [
131                                         'QUERY_STRING' => 'wrong=profile/test/it?arg1=value1&arg2=value2/',
132                                 ],
133                                 'get'    => [
134                                         'pagename' => 'profile/test/it',
135                                 ],
136                         ],
137                         'withMissingPageName'  => [
138                                 'assert' => [
139                                         'queryString' => 'notvalid/it?arg1=value1&arg2=value2/',
140                                         'command'     => App\Module::DEFAULT,
141                                         'argv'        => [App\Module::DEFAULT],
142                                         'argc'        => 1,
143                                 ],
144                                 'server' => [
145                                         'QUERY_STRING' => 'pagename=notvalid/it?arg1=value1&arg2=value2/',
146                                 ],
147                                 'get'    => [
148                                 ],
149                         ],
150                 ];
151         }
152
153         /**
154          * Test all variants of argument determination
155          *
156          * @dataProvider dataArguments
157          */
158         public function testDetermine(array $assert, array $server, array $get)
159         {
160                 $arguments = (new App\Arguments())
161                         ->determine($server, $get);
162
163                 $this->assertArguments($assert, $arguments);
164         }
165
166         /**
167          * Test if the get/has methods are working for the determined arguments
168          *
169          * @dataProvider dataArguments
170          */
171         public function testGetHas(array $assert, array $server, array $get)
172         {
173                 $arguments = (new App\Arguments())
174                         ->determine($server, $get);
175
176                 for ($i = 0; $i < $arguments->getArgc(); $i++) {
177                         $this->assertTrue($arguments->has($i));
178                         $this->assertEquals($assert['argv'][$i], $arguments->get($i));
179                 }
180
181                 $this->assertFalse($arguments->has($arguments->getArgc()));
182                 $this->assertEmpty($arguments->get($arguments->getArgc()));
183                 $this->assertEquals('default', $arguments->get($arguments->getArgc(), 'default'));
184         }
185
186         public function dataStripped()
187         {
188                 return [
189                         'strippedZRLFirst'  => [
190                                 'assert' => '?arg1=value1',
191                                 'input'  => '?zrl=nope&arg1=value1',
192                         ],
193                         'strippedZRLLast'   => [
194                                 'assert' => '?arg1=value1',
195                                 'input'  => '?arg1=value1&zrl=nope',
196                         ],
197                         'strippedZTLMiddle' => [
198                                 'assert' => '?arg1=value1&arg2=value2',
199                                 'input'  => '?arg1=value1&zrl=nope&arg2=value2',
200                         ],
201                         'strippedOWTFirst'  => [
202                                 'assert' => '?arg1=value1',
203                                 'input'  => '?owt=test&arg1=value1',
204                         ],
205                         'strippedOWTLast'   => [
206                                 'assert' => '?arg1=value1',
207                                 'input'  => '?arg1=value1&owt=test',
208                         ],
209                         'strippedOWTMiddle' => [
210                                 'assert' => '?arg1=value1&arg2=value2',
211                                 'input'  => '?arg1=value1&owt=test&arg2=value2',
212                         ],
213                 ];
214         }
215
216         /**
217          * Test the ZRL and OWT stripping
218          *
219          * @dataProvider dataStripped
220          */
221         public function testStrippedQueries(string $assert, string $input)
222         {
223                 $command = 'test/it';
224
225                 $arguments = (new App\Arguments())
226                         ->determine(['QUERY_STRING' => 'q=' . $command . $input,], ['pagename' => $command]);
227
228                 $this->assertEquals($command . $assert, $arguments->getQueryString());
229         }
230
231         /**
232          * Test that arguments are immutable
233          */
234         public function testImmutable()
235         {
236                 $argument = new App\Arguments();
237
238                 $argNew = $argument->determine([], []);
239
240                 $this->assertNotSame($argument, $argNew);
241         }
242 }