]> git.mxchange.org Git - friendica.git/blob - tests/src/App/ModuleTest.php
Add Arguments & Modules class
[friendica.git] / tests / src / App / ModuleTest.php
1 <?php
2
3 namespace Friendica\Test\src\App;
4
5 use Friendica\App;
6 use Friendica\Core\Config\Configuration;
7 use Friendica\LegacyModule;
8 use Friendica\Module\PageNotFound;
9 use Friendica\Module\WellKnown\HostMeta;
10 use Friendica\Test\DatabaseTest;
11
12 class ModuleTest extends DatabaseTest
13 {
14         private function assertModule(array $assert, App\Module $module)
15         {
16                 $this->assertEquals($assert['isBackend'], $module->isBackend());
17                 $this->assertEquals($assert['name'], $module->getName());
18                 $this->assertEquals($assert['class'], $module->getClassName());
19         }
20
21         /**
22          * Test the default module mode
23          */
24         public function testDefault()
25         {
26                 $module = new App\Module();
27
28                 $this->assertModule([
29                         'isBackend' => false,
30                         'name'      => App\Module::DEFAULT,
31                         'class'     => App\Module::DEFAULT_CLASS,
32                 ], $module);
33         }
34
35         public function dataModuleName()
36         {
37                 return [
38                         'default'                   => [
39                                 'assert' => [
40                                         'isBackend' => false,
41                                         'name'      => 'network',
42                                         'class'     => App\Module::DEFAULT_CLASS,
43                                 ],
44                                 'args'   => new App\Arguments('network/data/in',
45                                         'network/data/in',
46                                         ['network', 'data', 'in'],
47                                         3),
48                                 'server' => [],
49                         ],
50                         'withStrikeAndPoint'        => [
51                                 'assert' => [
52                                         'isBackend' => false,
53                                         'name'      => 'with_strike_and_point',
54                                         'class'     => App\Module::DEFAULT_CLASS,
55                                 ],
56                                 'args'   => new App\Arguments('with-strike.and-point/data/in',
57                                         'with-strike.and-point/data/in',
58                                         ['with-strike.and-point', 'data', 'in'],
59                                         3),
60                                 'server' => [],
61                         ],
62                         'withNothing'               => [
63                                 'assert' => [
64                                         'isBackend' => false,
65                                         'name'      => App\Module::DEFAULT,
66                                         'class'     => App\Module::DEFAULT_CLASS,
67                                 ],
68                                 'args'   => new App\Arguments(),
69                                 'server' => []
70                         ],
71                         'withIndex'                 => [
72                                 'assert' => [
73                                         'isBackend' => false,
74                                         'name'      => App\Module::DEFAULT,
75                                         'class'     => App\Module::DEFAULT_CLASS,
76                                 ],
77                                 'args'   => new App\Arguments(),
78                                 'server' => ['PHP_SELF' => 'index.php']
79                         ],
80                         'withIndexButBackendMod'    => [
81                                 'assert' => [
82                                         'isBackend' => false,
83                                         'name'      => App\Module::BACKEND_MODULES[0],
84                                         'class'     => App\Module::DEFAULT_CLASS,
85                                 ],
86                                 'args'   => new App\Arguments(App\Module::BACKEND_MODULES[0] . '/data/in',
87                                         App\Module::BACKEND_MODULES[0] . '/data/in',
88                                         [App\Module::BACKEND_MODULES[0], 'data', 'in'],
89                                         3),
90                                 'server' => ['PHP_SELF' => 'index.php']
91                         ],
92                         'withNotIndexAndBackendMod' => [
93                                 'assert' => [
94                                         'isBackend' => true,
95                                         'name'      => App\Module::BACKEND_MODULES[0],
96                                         'class'     => App\Module::DEFAULT_CLASS,
97                                 ],
98                                 'args'   => new App\Arguments(App\Module::BACKEND_MODULES[0] . '/data/in',
99                                         App\Module::BACKEND_MODULES[0] . '/data/in',
100                                         [App\Module::BACKEND_MODULES[0], 'data', 'in'],
101                                         3),
102                                 'server' => ['PHP_SELF' => 'daemon.php']
103                         ],
104                         'withFirefoxApp'            => [
105                                 'assert' => [
106                                         'isBackend' => false,
107                                         'name'      => 'login',
108                                         'class'     => App\Module::DEFAULT_CLASS,
109                                 ],
110                                 'args'   => new App\Arguments('users/sign_in',
111                                         'users/sign_in',
112                                         ['users', 'sign_in'],
113                                         3),
114                                 'server' => ['PHP_SELF' => 'index.php'],
115                         ],
116                 ];
117         }
118
119         /**
120          * Test the module name and backend determination
121          *
122          * @dataProvider dataModuleName
123          */
124         public function testModuleName(array $assert, App\Arguments $args, array $server)
125         {
126                 $module = (new App\Module())->determineModule($args, $server);
127
128                 $this->assertModule($assert, $module);
129         }
130
131         public function dataModuleClass()
132         {
133                 return [
134                         'default' => [
135                                 'assert'  => App\Module::DEFAULT_CLASS,
136                                 'name'    => App\Module::DEFAULT,
137                                 'command' => App\Module::DEFAULT,
138                                 'privAdd' => false,
139                         ],
140                         'legacy'  => [
141                                 'assert'  => LegacyModule::class,
142                                 // API is one of the last modules to switch from legacy to new BaseModule
143                                 // so this should be a stable test case until we completely switch ;-)
144                                 'name'    => 'api',
145                                 'command' => 'api/test/it',
146                                 'privAdd' => false,
147                         ],
148                         'new'     => [
149                                 'assert'  => HostMeta::class,
150                                 'not_required',
151                                 'command' => '.well-known/host-meta',
152                                 'privAdd' => false,
153                         ],
154                         '404'     => [
155                                 'assert'  => PageNotFound::class,
156                                 'name'    => 'invalid',
157                                 'command' => 'invalid',
158                                 'privAdd' => false,
159                         ]
160                 ];
161         }
162
163         /**
164          * Test the determination of the module class
165          *
166          * @dataProvider dataModuleClass
167          */
168         public function testModuleClass($assert, string $name, string $command, bool $privAdd)
169         {
170                 $config = \Mockery::mock(Configuration::class);
171                 $config->shouldReceive('get')->with('config', 'private_addons', false)->andReturn($privAdd)->atMost()->once();
172
173                 $module = (new App\Module($name))->determineClass(new App\Arguments('', $command), new App\Router(), $config);
174
175                 $this->assertEquals($assert, $module->getClassName());
176         }
177
178         /**
179          * Test that modules are immutable
180          */
181         public function testImmutable()
182         {
183                 $module = new App\Module();
184
185                 $moduleNew = $module->determineModule(new App\Arguments(), []);
186
187                 $this->assertNotSame($moduleNew, $module);
188         }
189 }