3 * @copyright Copyright (C) 2010-2023, the Friendica project
5 * @license GNU AGPL version 3 or any later version
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU Affero General Public License as
9 * published by the Free Software Foundation, either version 3 of the
10 * License, or (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU Affero General Public License for more details.
17 * You should have received a copy of the GNU Affero General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
22 namespace Friendica\Test\src\App;
24 use Detection\MobileDetect;
25 use Friendica\App\Arguments;
26 use Friendica\App\Mode;
27 use Friendica\Core\Config\Capability\IManageConfigValues;
28 use Friendica\Database\Database;
29 use Friendica\Test\MockedTest;
30 use Friendica\Test\Util\VFSTrait;
31 use Friendica\Util\BasePath;
33 use Mockery\MockInterface;
35 class ModeTest extends MockedTest
40 * @var BasePath|MockInterface
42 private $basePathMock;
45 * @var Database|MockInterface
47 private $databaseMock;
50 * @var IManageConfigValues|MockInterface
54 protected function setUp(): void
60 $this->databaseMock = Mockery::mock(Database::class);
61 $this->configMock = Mockery::mock(IManageConfigValues::class);
64 public function testItEmpty()
67 self::assertTrue($mode->isInstall());
68 self::assertFalse($mode->isNormal());
71 public function testWithoutConfig()
73 self::assertTrue($this->root->hasChild('config/local.config.php'));
75 $this->delConfigFile('local.config.php');
77 self::assertFalse($this->root->hasChild('config/local.config.php'));
79 $mode = (new Mode())->determine($this->root->url(), $this->databaseMock, $this->configMock);
81 self::assertTrue($mode->isInstall());
82 self::assertFalse($mode->isNormal());
84 self::assertFalse($mode->has(Mode::LOCALCONFIGPRESENT));
87 public function testWithoutDatabase()
89 $this->databaseMock->shouldReceive('connected')->andReturn(false)->once();
91 $mode = (new Mode())->determine($this->root->url(), $this->databaseMock, $this->configMock);
93 self::assertFalse($mode->isNormal());
94 self::assertTrue($mode->isInstall());
96 self::assertTrue($mode->has(Mode::LOCALCONFIGPRESENT));
97 self::assertFalse($mode->has(Mode::DBAVAILABLE));
100 public function testWithMaintenanceMode()
102 $this->databaseMock->shouldReceive('connected')->andReturn(true)->once();
103 $this->configMock->shouldReceive('get')->with('system', 'maintenance')
104 ->andReturn(true)->once();
106 $mode = (new Mode())->determine($this->root->url(), $this->databaseMock, $this->configMock);
108 self::assertFalse($mode->isNormal());
109 self::assertFalse($mode->isInstall());
111 self::assertFalse($mode->has(Mode::MAINTENANCEDISABLED));
114 public function testNormalMode()
116 $this->databaseMock->shouldReceive('connected')->andReturn(true)->once();
117 $this->configMock->shouldReceive('get')->with('system', 'maintenance')
118 ->andReturn(false)->once();
120 $mode = (new Mode())->determine($this->root->url(), $this->databaseMock, $this->configMock);
122 self::assertTrue($mode->isNormal());
123 self::assertFalse($mode->isInstall());
125 self::assertTrue($mode->has(Mode::MAINTENANCEDISABLED));
129 * Test explicit disabled maintenance (in case you manually disable it)
131 public function testDisabledMaintenance()
133 $this->databaseMock->shouldReceive('connected')->andReturn(true)->once();
134 $this->configMock->shouldReceive('get')->with('system', 'maintenance')
135 ->andReturn(false)->once();
137 $mode = (new Mode())->determine($this->root->url(), $this->databaseMock, $this->configMock);
139 self::assertTrue($mode->isNormal());
140 self::assertFalse($mode->isInstall());
142 self::assertTrue($mode->has(Mode::MAINTENANCEDISABLED));
146 * Test that modes are immutable
148 public function testImmutable()
152 $modeNew = $mode->determine('', $this->databaseMock, $this->configMock);
154 self::assertNotSame($modeNew, $mode);
158 * Test if not called by index is backend
160 public function testIsBackendNotIsBackend()
163 $args = new Arguments();
164 $mobileDetect = new MobileDetect();
166 $mode = (new Mode())->determineRunMode(true, $server, $args, $mobileDetect);
168 self::assertTrue($mode->isBackend());
172 * Test is called by index but module is backend
174 public function testIsBackendButIndex()
177 $args = new Arguments('', '', Mode::BACKEND_MODULES[0]);
178 $mobileDetect = new MobileDetect();
180 $mode = (new Mode())->determineRunMode(false, $server, $args, $mobileDetect);
182 self::assertTrue($mode->isBackend());
186 * Test is called by index and module is not backend
188 public function testIsNotBackend()
191 $args = new Arguments('', '', Arguments::DEFAULT_MODULE);
192 $mobileDetect = new MobileDetect();
194 $mode = (new Mode())->determineRunMode(false, $server, $args, $mobileDetect);
196 self::assertFalse($mode->isBackend());
200 * Test if the call is an ajax call
202 public function testIsAjax()
204 // This is the server environment variable to determine ajax calls
206 'HTTP_X_REQUESTED_WITH' => 'xmlhttprequest',
209 $args = new Arguments('', '', Arguments::DEFAULT_MODULE);
210 $mobileDetect = new MobileDetect();
212 $mode = (new Mode())->determineRunMode(true, $server, $args, $mobileDetect);
214 self::assertTrue($mode->isAjax());
218 * Test if the call is not nan ajax call
220 public function testIsNotAjax()
223 $args = new Arguments('', '', Arguments::DEFAULT_MODULE);
224 $mobileDetect = new MobileDetect();
226 $mode = (new Mode())->determineRunMode(true, $server, $args, $mobileDetect);
228 self::assertFalse($mode->isAjax());
232 * Test if the call is a mobile and is a tablet call
234 public function testIsMobileIsTablet()
237 $args = new Arguments('', '', Arguments::DEFAULT_MODULE);
238 $mobileDetect = Mockery::mock(MobileDetect::class);
239 $mobileDetect->shouldReceive('isMobile')->andReturn(true);
240 $mobileDetect->shouldReceive('isTablet')->andReturn(true);
242 $mode = (new Mode())->determineRunMode(true, $server, $args, $mobileDetect);
244 self::assertTrue($mode->isMobile());
245 self::assertTrue($mode->isTablet());
250 * Test if the call is not a mobile and is not a tablet call
252 public function testIsNotMobileIsNotTablet()
255 $args = new Arguments('', '', Arguments::DEFAULT_MODULE);
256 $mobileDetect = Mockery::mock(MobileDetect::class);
257 $mobileDetect->shouldReceive('isMobile')->andReturn(false);
258 $mobileDetect->shouldReceive('isTablet')->andReturn(false);
260 $mode = (new Mode())->determineRunMode(true, $server, $args, $mobileDetect);
262 self::assertFalse($mode->isMobile());
263 self::assertFalse($mode->isTablet());