]> git.mxchange.org Git - friendica.git/blob - tests/src/App/RouterTest.php
Merge pull request #8156 from MrPetovan/task/7817-custom-fields-part-2
[friendica.git] / tests / src / App / RouterTest.php
1 <?php
2
3 namespace Friendica\Test\src\App;
4
5 use Friendica\App\Router;
6 use Friendica\Core\L10n;
7 use Friendica\Module;
8 use Friendica\Network\HTTPException\MethodNotAllowedException;
9 use Friendica\Network\HTTPException\NotFoundException;
10 use Mockery\MockInterface;
11 use PHPUnit\Framework\TestCase;
12
13 class RouterTest extends TestCase
14 {
15         /** @var L10n|MockInterface */
16         private $l10n;
17
18         protected function setUp()
19         {
20                 parent::setUp();
21
22                 $this->l10n = \Mockery::mock(L10n::class);
23                 $this->l10n->shouldReceive('t')->andReturnUsing(function ($args) { return $args; });
24         }
25
26         public function testGetModuleClass()
27         {
28                 $router = new Router(['REQUEST_METHOD' => Router::GET], $this->l10n);
29
30                 $routeCollector = $router->getRouteCollector();
31                 $routeCollector->addRoute([Router::GET], '/', 'IndexModuleClassName');
32                 $routeCollector->addRoute([Router::GET], '/test', 'TestModuleClassName');
33                 $routeCollector->addRoute([Router::GET, Router::POST], '/testgetpost', 'TestGetPostModuleClassName');
34                 $routeCollector->addRoute([Router::GET], '/test/sub', 'TestSubModuleClassName');
35                 $routeCollector->addRoute([Router::GET], '/optional[/option]', 'OptionalModuleClassName');
36                 $routeCollector->addRoute([Router::GET], '/variable/{var}', 'VariableModuleClassName');
37                 $routeCollector->addRoute([Router::GET], '/optionalvariable[/{option}]', 'OptionalVariableModuleClassName');
38
39                 $this->assertEquals('IndexModuleClassName', $router->getModuleClass('/'));
40                 $this->assertEquals('TestModuleClassName', $router->getModuleClass('/test'));
41                 $this->assertEquals('TestGetPostModuleClassName', $router->getModuleClass('/testgetpost'));
42                 $this->assertEquals('TestSubModuleClassName', $router->getModuleClass('/test/sub'));
43                 $this->assertEquals('OptionalModuleClassName', $router->getModuleClass('/optional'));
44                 $this->assertEquals('OptionalModuleClassName', $router->getModuleClass('/optional/option'));
45                 $this->assertEquals('VariableModuleClassName', $router->getModuleClass('/variable/123abc'));
46                 $this->assertEquals('OptionalVariableModuleClassName', $router->getModuleClass('/optionalvariable'));
47                 $this->assertEquals('OptionalVariableModuleClassName', $router->getModuleClass('/optionalvariable/123abc'));
48         }
49
50         public function testPostModuleClass()
51         {
52                 $router = new Router(['REQUEST_METHOD' => Router::POST], $this->l10n);
53
54                 $routeCollector = $router->getRouteCollector();
55                 $routeCollector->addRoute([Router::POST], '/', 'IndexModuleClassName');
56                 $routeCollector->addRoute([Router::POST], '/test', 'TestModuleClassName');
57                 $routeCollector->addRoute([Router::GET, Router::POST], '/testgetpost', 'TestGetPostModuleClassName');
58                 $routeCollector->addRoute([Router::POST], '/test/sub', 'TestSubModuleClassName');
59                 $routeCollector->addRoute([Router::POST], '/optional[/option]', 'OptionalModuleClassName');
60                 $routeCollector->addRoute([Router::POST], '/variable/{var}', 'VariableModuleClassName');
61                 $routeCollector->addRoute([Router::POST], '/optionalvariable[/{option}]', 'OptionalVariableModuleClassName');
62
63                 $this->assertEquals('IndexModuleClassName', $router->getModuleClass('/'));
64                 $this->assertEquals('TestModuleClassName', $router->getModuleClass('/test'));
65                 $this->assertEquals('TestGetPostModuleClassName', $router->getModuleClass('/testgetpost'));
66                 $this->assertEquals('TestSubModuleClassName', $router->getModuleClass('/test/sub'));
67                 $this->assertEquals('OptionalModuleClassName', $router->getModuleClass('/optional'));
68                 $this->assertEquals('OptionalModuleClassName', $router->getModuleClass('/optional/option'));
69                 $this->assertEquals('VariableModuleClassName', $router->getModuleClass('/variable/123abc'));
70                 $this->assertEquals('OptionalVariableModuleClassName', $router->getModuleClass('/optionalvariable'));
71                 $this->assertEquals('OptionalVariableModuleClassName', $router->getModuleClass('/optionalvariable/123abc'));
72         }
73
74         public function testGetModuleClassNotFound()
75         {
76                 $this->expectException(NotFoundException::class);
77
78                 $router = new Router(['REQUEST_METHOD' => Router::GET], $this->l10n);
79
80                 $router->getModuleClass('/unsupported');
81         }
82
83         public function testGetModuleClassNotFoundTypo()
84         {
85                 $this->expectException(NotFoundException::class);
86
87                 $router = new Router(['REQUEST_METHOD' => Router::GET], $this->l10n);
88
89                 $routeCollector = $router->getRouteCollector();
90                 $routeCollector->addRoute([Router::GET], '/test', 'TestModuleClassName');
91
92                 $router->getModuleClass('/tes');
93         }
94
95         public function testGetModuleClassNotFoundOptional()
96         {
97                 $this->expectException(NotFoundException::class);
98
99                 $router = new Router(['REQUEST_METHOD' => Router::GET], $this->l10n);
100
101                 $routeCollector = $router->getRouteCollector();
102                 $routeCollector->addRoute([Router::GET], '/optional[/option]', 'OptionalModuleClassName');
103
104                 $router->getModuleClass('/optional/opt');
105         }
106
107         public function testGetModuleClassNotFoundVariable()
108         {
109                 $this->expectException(NotFoundException::class);
110
111                 $router = new Router(['REQUEST_METHOD' => Router::GET], $this->l10n);
112
113                 $routeCollector = $router->getRouteCollector();
114                 $routeCollector->addRoute([Router::GET], '/variable/{var}', 'VariableModuleClassName');
115
116                 $router->getModuleClass('/variable');
117         }
118
119         public function testGetModuleClassMethodNotAllowed()
120         {
121                 $this->expectException(MethodNotAllowedException::class);
122
123                 $router = new Router(['REQUEST_METHOD' => Router::POST], $this->l10n);
124
125                 $routeCollector = $router->getRouteCollector();
126                 $routeCollector->addRoute([Router::GET], '/test', 'TestModuleClassName');
127
128                 $router->getModuleClass('/test');
129         }
130         
131         public function testPostModuleClassMethodNotAllowed()
132         {
133                 $this->expectException(MethodNotAllowedException::class);
134
135                 $router = new Router(['REQUEST_METHOD' => Router::GET], $this->l10n);
136
137                 $routeCollector = $router->getRouteCollector();
138                 $routeCollector->addRoute([Router::POST], '/test', 'TestModuleClassName');
139
140                 $router->getModuleClass('/test');
141         }
142
143         public function dataRoutes()
144         {
145                 return [
146                         'default' => [
147                                 'routes' => [
148                                         '/'       => [Module\Home::class, [Router::GET]],
149                                         '/group'  => [
150                                                 '/route' => [Module\Friendica::class, [Router::GET]],
151                                         ],
152
153
154                                         '/group2' => [
155                                                 '/group3' => [
156                                                         '/route' => [Module\Xrd::class, [Router::GET]],
157                                                 ],
158                                         ],
159                                         '/post' => [
160                                                 '/it' => [Module\NodeInfo::class, [Router::POST]],
161                                         ],
162                                         '/double' => [Module\Profile\Index::class, [Router::GET, Router::POST]]
163                                 ],
164                         ],
165                 ];
166         }
167
168         /**
169          * @dataProvider dataRoutes
170          */
171         public function testGetRoutes(array $routes)
172         {
173                 $router = (new Router([
174                         'REQUEST_METHOD' => Router::GET
175                 ], $this->l10n))->loadRoutes($routes);
176
177                 $this->assertEquals(Module\Home::class, $router->getModuleClass('/'));
178                 $this->assertEquals(Module\Friendica::class, $router->getModuleClass('/group/route'));
179                 $this->assertEquals(Module\Xrd::class, $router->getModuleClass('/group2/group3/route'));
180                 $this->assertEquals(Module\Profile\Index::class, $router->getModuleClass('/double'));
181         }
182
183         /**
184          * @dataProvider dataRoutes
185          */
186         public function testPostRouter(array $routes)
187         {
188                 $router = (new Router([
189                         'REQUEST_METHOD' => Router::POST
190                 ], $this->l10n))->loadRoutes($routes);
191
192                 // Don't find GET
193                 $this->assertEquals(Module\NodeInfo::class, $router->getModuleClass('/post/it'));
194                 $this->assertEquals(Module\Profile\Index::class, $router->getModuleClass('/double'));
195         }
196 }