]> git.mxchange.org Git - friendica.git/blob - tests/src/App/RouterTest.php
2fcc02ff517ef3874e5789d87bdb386f4d8dd5d6
[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\Module;
7 use Friendica\Network\HTTPException\MethodNotAllowedException;
8 use Friendica\Network\HTTPException\NotFoundException;
9 use PHPUnit\Framework\TestCase;
10
11 class RouterTest extends TestCase
12 {
13         public function testGetModuleClass()
14         {
15                 $router = new Router(['REQUEST_METHOD' => 'GET']);
16
17                 $routeCollector = $router->getRouteCollector();
18                 $routeCollector->addRoute(['GET'], '/', 'IndexModuleClassName');
19                 $routeCollector->addRoute(['GET'], '/test', 'TestModuleClassName');
20                 $routeCollector->addRoute(['GET'], '/test/sub', 'TestSubModuleClassName');
21                 $routeCollector->addRoute(['GET'], '/optional[/option]', 'OptionalModuleClassName');
22                 $routeCollector->addRoute(['GET'], '/variable/{var}', 'VariableModuleClassName');
23                 $routeCollector->addRoute(['GET'], '/optionalvariable[/{option}]', 'OptionalVariableModuleClassName');
24                 $routeCollector->addRoute(['POST', 'PUT', 'PATCH', 'DELETE', 'HEAD'], '/unsupported', 'UnsupportedMethodModuleClassName');
25
26                 $this->assertEquals('IndexModuleClassName', $router->getModuleClass('/'));
27                 $this->assertEquals('TestModuleClassName', $router->getModuleClass('/test'));
28                 $this->assertEquals('TestSubModuleClassName', $router->getModuleClass('/test/sub'));
29                 $this->assertEquals('OptionalModuleClassName', $router->getModuleClass('/optional'));
30                 $this->assertEquals('OptionalModuleClassName', $router->getModuleClass('/optional/option'));
31                 $this->assertEquals('VariableModuleClassName', $router->getModuleClass('/variable/123abc'));
32                 $this->assertEquals('OptionalVariableModuleClassName', $router->getModuleClass('/optionalvariable'));
33                 $this->assertEquals('OptionalVariableModuleClassName', $router->getModuleClass('/optionalvariable/123abc'));
34         }
35
36         public function testGetModuleClassNotFound()
37         {
38                 $this->expectException(NotFoundException::class);
39
40                 $router = new Router(['REQUEST_METHOD' => 'GET']);
41
42                 $router->getModuleClass('/unsupported');
43         }
44
45         public function testGetModuleClassNotFoundTypo()
46         {
47                 $this->expectException(NotFoundException::class);
48
49                 $router = new Router(['REQUEST_METHOD' => 'GET']);
50
51                 $routeCollector = $router->getRouteCollector();
52                 $routeCollector->addRoute(['GET'], '/test', 'TestModuleClassName');
53
54                 $router->getModuleClass('/tes');
55         }
56
57         public function testGetModuleClassNotFoundOptional()
58         {
59                 $this->expectException(NotFoundException::class);
60
61                 $router = new Router(['REQUEST_METHOD' => 'GET']);
62
63                 $routeCollector = $router->getRouteCollector();
64                 $routeCollector->addRoute(['GET'], '/optional[/option]', 'OptionalModuleClassName');
65
66                 $router->getModuleClass('/optional/opt');
67         }
68
69         public function testGetModuleClassNotFoundVariable()
70         {
71                 $this->expectException(NotFoundException::class);
72
73                 $router = new Router(['REQUEST_METHOD' => 'GET']);
74
75                 $routeCollector = $router->getRouteCollector();
76                 $routeCollector->addRoute(['GET'], '/variable/{var}', 'VariableModuleClassName');
77
78                 $router->getModuleClass('/variable');
79         }
80
81         public function testGetModuleClassMethodNotAllowed()
82         {
83                 $this->expectException(MethodNotAllowedException::class);
84
85                 $router = new Router(['REQUEST_METHOD' => 'POST']);
86
87                 $routeCollector = $router->getRouteCollector();
88                 $routeCollector->addRoute(['GET'], '/test', 'TestModuleClassName');
89
90                 $router->getModuleClass('/test');
91         }
92
93         public function dataRoutes()
94         {
95                 return [
96                         'default' => [
97                                 'routes' => [
98                                         '/'       => [Module\Home::class, [Router::GET]],
99                                         '/group'  => [
100                                                 '/route' => [Module\Friendica::class, [Router::GET]],
101                                         ],
102
103
104                                         '/group2' => [
105                                                 '/group3' => [
106                                                         '/route' => [Module\Xrd::class, [Router::GET]],
107                                                 ],
108                                         ],
109                                         '/post' => [
110                                                 '/it' => [Module\NodeInfo::class, [Router::POST]],
111                                         ],
112                                         '/double' => [Module\Profile::class, [Router::GET, Router::POST]]
113                                 ],
114                         ],
115                 ];
116         }
117
118         /**
119          * @dataProvider dataRoutes
120          */
121         public function testGetRoutes(array $routes)
122         {
123                 $router = (new Router([
124                         'REQUEST_METHOD' => Router::GET
125                 ]))->addRoutes($routes);
126
127                 $this->assertEquals(Module\Home::class, $router->getModuleClass('/'));
128                 $this->assertEquals(Module\Friendica::class, $router->getModuleClass('/group/route'));
129                 $this->assertEquals(Module\Xrd::class, $router->getModuleClass('/group2/group3/route'));
130                 $this->assertNull($router->getModuleClass('/post/it'));
131                 $this->assertEquals(Module\Profile::class, $router->getModuleClass('/double'));
132         }
133
134         /**
135          * @dataProvider dataRoutes
136          */
137         public function testPostRouter(array $routes)
138         {
139                 $router = (new Router([
140                         'REQUEST_METHOD' => Router::POST
141                 ]))->addRoutes($routes);
142
143                 // Don't find GET
144                 $this->assertNull($router->getModuleClass('/'));
145                 $this->assertNull($router->getModuleClass('/group/route'));
146                 $this->assertNull($router->getModuleClass('/group2/group3/route'));
147                 $this->assertEquals(Module\NodeInfo::class, $router->getModuleClass('/post/it'));
148                 $this->assertEquals(Module\Profile::class, $router->getModuleClass('/double'));
149         }
150 }