3 namespace Friendica\Test\src\App;
5 use Friendica\App\Router;
6 use Friendica\Core\L10n;
8 use Friendica\Network\HTTPException\MethodNotAllowedException;
9 use Friendica\Network\HTTPException\NotFoundException;
10 use Mockery\MockInterface;
11 use PHPUnit\Framework\TestCase;
13 class RouterTest extends TestCase
15 /** @var L10n|MockInterface */
18 protected function setUp()
22 $this->l10n = \Mockery::mock(L10n::class);
23 $this->l10n->shouldReceive('t')->andReturnUsing(function ($args) { return $args; });
26 public function testGetModuleClass()
28 $router = new Router(['REQUEST_METHOD' => Router::GET], $this->l10n);
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');
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'));
50 public function testPostModuleClass()
52 $router = new Router(['REQUEST_METHOD' => Router::POST], $this->l10n);
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');
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'));
74 public function testGetModuleClassNotFound()
76 $this->expectException(NotFoundException::class);
78 $router = new Router(['REQUEST_METHOD' => Router::GET], $this->l10n);
80 $router->getModuleClass('/unsupported');
83 public function testGetModuleClassNotFoundTypo()
85 $this->expectException(NotFoundException::class);
87 $router = new Router(['REQUEST_METHOD' => Router::GET], $this->l10n);
89 $routeCollector = $router->getRouteCollector();
90 $routeCollector->addRoute([Router::GET], '/test', 'TestModuleClassName');
92 $router->getModuleClass('/tes');
95 public function testGetModuleClassNotFoundOptional()
97 $this->expectException(NotFoundException::class);
99 $router = new Router(['REQUEST_METHOD' => Router::GET], $this->l10n);
101 $routeCollector = $router->getRouteCollector();
102 $routeCollector->addRoute([Router::GET], '/optional[/option]', 'OptionalModuleClassName');
104 $router->getModuleClass('/optional/opt');
107 public function testGetModuleClassNotFoundVariable()
109 $this->expectException(NotFoundException::class);
111 $router = new Router(['REQUEST_METHOD' => Router::GET], $this->l10n);
113 $routeCollector = $router->getRouteCollector();
114 $routeCollector->addRoute([Router::GET], '/variable/{var}', 'VariableModuleClassName');
116 $router->getModuleClass('/variable');
119 public function testGetModuleClassMethodNotAllowed()
121 $this->expectException(MethodNotAllowedException::class);
123 $router = new Router(['REQUEST_METHOD' => Router::POST], $this->l10n);
125 $routeCollector = $router->getRouteCollector();
126 $routeCollector->addRoute([Router::GET], '/test', 'TestModuleClassName');
128 $router->getModuleClass('/test');
131 public function testPostModuleClassMethodNotAllowed()
133 $this->expectException(MethodNotAllowedException::class);
135 $router = new Router(['REQUEST_METHOD' => Router::GET], $this->l10n);
137 $routeCollector = $router->getRouteCollector();
138 $routeCollector->addRoute([Router::POST], '/test', 'TestModuleClassName');
140 $router->getModuleClass('/test');
143 public function dataRoutes()
148 '/' => [Module\Home::class, [Router::GET]],
150 '/route' => [Module\Friendica::class, [Router::GET]],
156 '/route' => [Module\Xrd::class, [Router::GET]],
160 '/it' => [Module\NodeInfo::class, [Router::POST]],
162 '/double' => [Module\Profile\Index::class, [Router::GET, Router::POST]]
169 * @dataProvider dataRoutes
171 public function testGetRoutes(array $routes)
173 $router = (new Router([
174 'REQUEST_METHOD' => Router::GET
175 ], $this->l10n))->loadRoutes($routes);
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'));
184 * @dataProvider dataRoutes
186 public function testPostRouter(array $routes)
188 $router = (new Router([
189 'REQUEST_METHOD' => Router::POST
190 ], $this->l10n))->loadRoutes($routes);
193 $this->assertEquals(Module\NodeInfo::class, $router->getModuleClass('/post/it'));
194 $this->assertEquals(Module\Profile\Index::class, $router->getModuleClass('/double'));