X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=tests%2Fsrc%2FApp%2FModeTest.php;h=fe65793f8e1b92e5699bf80aa447bd45d8a83a30;hb=f1e7d97b8cae93e1c77f5a5085880409b01fcdbe;hp=bac553eb8c5b86b7b1b270796fa01495abf79c5d;hpb=4ae37c61966a7f4c055369ee8fd0d4bc20808fdb;p=friendica.git diff --git a/tests/src/App/ModeTest.php b/tests/src/App/ModeTest.php index bac553eb8c..fe65793f8e 100644 --- a/tests/src/App/ModeTest.php +++ b/tests/src/App/ModeTest.php @@ -2,43 +2,66 @@ namespace Friendica\Test\src\App; +use Detection\MobileDetect; use Friendica\App\Mode; +use Friendica\App\Module; +use Friendica\Core\Config; +use Friendica\Database\Database; +use Friendica\Test\MockedTest; +use Friendica\Test\Util\DBAMockTrait; use Friendica\Test\Util\VFSTrait; -use PHPUnit\Framework\TestCase; +use Friendica\Util\BasePath; +use Mockery\MockInterface; -/** - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - */ -class ModeTest extends TestCase +class ModeTest extends MockedTest { use VFSTrait; + use DBAMockTrait; + + /** + * @var BasePath|MockInterface + */ + private $basePathMock; + + /** + * @var Database|MockInterface + */ + private $databaseMock; + + /** + * @var Config\Cache\ConfigCache|MockInterface + */ + private $configCacheMock; public function setUp() { - parent::setUp(); // TODO: Change the autogenerated stub + parent::setUp(); $this->setUpVfsDir(); + + $this->basePathMock = \Mockery::mock(BasePath::class); + $this->databaseMock = \Mockery::mock(Database::class); + $this->configCacheMock = \Mockery::mock(Config\Cache\ConfigCache::class); } public function testItEmpty() { - $mode = new Mode($this->root->url()); + $mode = new Mode(); $this->assertTrue($mode->isInstall()); $this->assertFalse($mode->isNormal()); } public function testWithoutConfig() { - $mode = new Mode($this->root->url()); + $this->basePathMock->shouldReceive('getPath')->andReturn($this->root->url())->once(); - $this->assertTrue($this->root->hasChild('config/local.ini.php')); + $this->assertTrue($this->root->hasChild('config/local.config.php')); - $this->delConfigFile('local.ini.php'); + $this->delConfigFile('local.config.php'); - $this->assertFalse($this->root->hasChild('config/local.ini.php')); + $this->assertFalse($this->root->hasChild('config/local.config.php')); - $mode->determine(); + $mode = (new Mode())->determine($this->basePathMock, $this->databaseMock, $this->configCacheMock); $this->assertTrue($mode->isInstall()); $this->assertFalse($mode->isNormal()); @@ -48,13 +71,11 @@ class ModeTest extends TestCase public function testWithoutDatabase() { - $dba = \Mockery::mock('alias:Friendica\Database\DBA'); - $dba - ->shouldReceive('connected') - ->andReturn(false); + $this->basePathMock->shouldReceive('getPath')->andReturn($this->root->url())->once(); - $mode = new Mode($this->root->url()); - $mode->determine(); + $this->databaseMock->shouldReceive('connected')->andReturn(false)->once(); + + $mode = (new Mode())->determine($this->basePathMock, $this->databaseMock, $this->configCacheMock); $this->assertFalse($mode->isNormal()); $this->assertTrue($mode->isInstall()); @@ -65,17 +86,13 @@ class ModeTest extends TestCase public function testWithoutDatabaseSetup() { - $dba = \Mockery::mock('alias:Friendica\Database\DBA'); - $dba - ->shouldReceive('connected') - ->andReturn(true); - $dba - ->shouldReceive('fetchFirst') - ->with('SHOW TABLES LIKE \'config\'') - ->andReturn(false); + $this->basePathMock->shouldReceive('getPath')->andReturn($this->root->url())->once(); + + $this->databaseMock->shouldReceive('connected')->andReturn(true)->once(); + $this->databaseMock->shouldReceive('fetchFirst') + ->with('SHOW TABLES LIKE \'config\'')->andReturn(false)->once(); - $mode = new Mode($this->root->url()); - $mode->determine(); + $mode = (new Mode())->determine($this->basePathMock, $this->databaseMock, $this->configCacheMock); $this->assertFalse($mode->isNormal()); $this->assertTrue($mode->isInstall()); @@ -85,23 +102,15 @@ class ModeTest extends TestCase public function testWithMaintenanceMode() { - $dba = \Mockery::mock('alias:Friendica\Database\DBA'); - $dba - ->shouldReceive('connected') - ->andReturn(true); - $dba - ->shouldReceive('fetchFirst') - ->with('SHOW TABLES LIKE \'config\'') - ->andReturn(true); + $this->basePathMock->shouldReceive('getPath')->andReturn($this->root->url())->once(); - $conf = \Mockery::mock('alias:Friendica\Core\Config'); - $conf - ->shouldReceive('get') - ->with('system', 'maintenance') - ->andReturn(true); + $this->databaseMock->shouldReceive('connected')->andReturn(true)->once(); + $this->databaseMock->shouldReceive('fetchFirst') + ->with('SHOW TABLES LIKE \'config\'')->andReturn(true)->once(); + $this->configCacheMock->shouldReceive('get')->with('system', 'maintenance') + ->andReturn(true)->once(); - $mode = new Mode($this->root->url()); - $mode->determine(); + $mode = (new Mode())->determine($this->basePathMock, $this->databaseMock, $this->configCacheMock); $this->assertFalse($mode->isNormal()); $this->assertFalse($mode->isInstall()); @@ -112,23 +121,43 @@ class ModeTest extends TestCase public function testNormalMode() { - $dba = \Mockery::mock('alias:Friendica\Database\DBA'); - $dba - ->shouldReceive('connected') - ->andReturn(true); - $dba - ->shouldReceive('fetchFirst') - ->with('SHOW TABLES LIKE \'config\'') - ->andReturn(true); + $this->basePathMock->shouldReceive('getPath')->andReturn($this->root->url())->once(); + + $this->databaseMock->shouldReceive('connected')->andReturn(true)->once(); + $this->databaseMock->shouldReceive('fetchFirst') + ->with('SHOW TABLES LIKE \'config\'')->andReturn(true)->once(); + $this->configCacheMock->shouldReceive('get')->with('system', 'maintenance') + ->andReturn(false)->once(); + $this->databaseMock->shouldReceive('selectFirst') + ->with('config', ['v'], ['cat' => 'system', 'k' => 'maintenance']) + ->andReturn(['v' => null])->once(); + + $mode = (new Mode())->determine($this->basePathMock, $this->databaseMock, $this->configCacheMock); + + $this->assertTrue($mode->isNormal()); + $this->assertFalse($mode->isInstall()); + + $this->assertTrue($mode->has(Mode::DBCONFIGAVAILABLE)); + $this->assertTrue($mode->has(Mode::MAINTENANCEDISABLED)); + } + + /** + * Test explicit disabled maintenance (in case you manually disable it) + */ + public function testDisabledMaintenance() + { + $this->basePathMock->shouldReceive('getPath')->andReturn($this->root->url())->once(); - $conf = \Mockery::mock('alias:Friendica\Core\Config'); - $conf - ->shouldReceive('get') - ->with('system', 'maintenance') - ->andReturn(false); + $this->databaseMock->shouldReceive('connected')->andReturn(true)->once(); + $this->databaseMock->shouldReceive('fetchFirst') + ->with('SHOW TABLES LIKE \'config\'')->andReturn(true)->once(); + $this->configCacheMock->shouldReceive('get')->with('system', 'maintenance') + ->andReturn(false)->once(); + $this->databaseMock->shouldReceive('selectFirst') + ->with('config', ['v'], ['cat' => 'system', 'k' => 'maintenance']) + ->andReturn(['v' => '0'])->once(); - $mode = new Mode($this->root->url()); - $mode->determine(); + $mode = (new Mode())->determine($this->basePathMock, $this->databaseMock, $this->configCacheMock); $this->assertTrue($mode->isNormal()); $this->assertFalse($mode->isInstall()); @@ -136,4 +165,127 @@ class ModeTest extends TestCase $this->assertTrue($mode->has(Mode::DBCONFIGAVAILABLE)); $this->assertTrue($mode->has(Mode::MAINTENANCEDISABLED)); } + + /** + * Test that modes are immutable + */ + public function testImmutable() + { + $this->basePathMock->shouldReceive('getPath')->andReturn(null)->once(); + + $mode = new Mode(); + + $modeNew = $mode->determine($this->basePathMock, $this->databaseMock, $this->configCacheMock); + + $this->assertNotSame($modeNew, $mode); + } + + /** + * Test if not called by index is backend + */ + public function testIsBackendNotIsBackend() + { + $server = []; + $module = new Module(); + $mobileDetect = new MobileDetect(); + + $mode = (new Mode())->determineRunMode(true, $module, $server, $mobileDetect); + + $this->assertTrue($mode->isBackend()); + } + + /** + * Test is called by index but module is backend + */ + public function testIsBackendButIndex() + { + $server = []; + $module = new Module(Module::DEFAULT, Module::DEFAULT_CLASS, true); + $mobileDetect = new MobileDetect(); + + $mode = (new Mode())->determineRunMode(false, $module, $server, $mobileDetect); + + $this->assertTrue($mode->isBackend()); + } + + /** + * Test is called by index and module is not backend + */ + public function testIsNotBackend() + { + $server = []; + $module = new Module(Module::DEFAULT, Module::DEFAULT_CLASS, false); + $mobileDetect = new MobileDetect(); + + $mode = (new Mode())->determineRunMode(false, $module, $server, $mobileDetect); + + $this->assertFalse($mode->isBackend()); + } + + /** + * Test if the call is an ajax call + */ + public function testIsAjax() + { + // This is the server environment variable to determine ajax calls + $server = [ + 'HTTP_X_REQUESTED_WITH' => 'xmlhttprequest', + ]; + + $module = new Module(Module::DEFAULT, Module::DEFAULT_CLASS, false); + $mobileDetect = new MobileDetect(); + + $mode = (new Mode())->determineRunMode(true, $module, $server, $mobileDetect); + + $this->assertTrue($mode->isAjax()); + } + + /** + * Test if the call is not nan ajax call + */ + public function testIsNotAjax() + { + $server = []; + $module = new Module(Module::DEFAULT, Module::DEFAULT_CLASS, false); + $mobileDetect = new MobileDetect(); + + $mode = (new Mode())->determineRunMode(true, $module, $server, $mobileDetect); + + $this->assertFalse($mode->isAjax()); + } + + /** + * Test if the call is a mobile and is a tablet call + */ + public function testIsMobileIsTablet() + { + $server = []; + $module = new Module(Module::DEFAULT, Module::DEFAULT_CLASS, false); + $mobileDetect = \Mockery::mock(MobileDetect::class); + $mobileDetect->shouldReceive('isMobile')->andReturn(true); + $mobileDetect->shouldReceive('isTablet')->andReturn(true); + + $mode = (new Mode())->determineRunMode(true, $module, $server, $mobileDetect); + + $this->assertTrue($mode->isMobile()); + $this->assertTrue($mode->isTablet()); + } + + + /** + * Test if the call is not a mobile and is not a tablet call + */ + public function testIsNotMobileIsNotTablet() + { + $server = []; + $module = new Module(Module::DEFAULT, Module::DEFAULT_CLASS, false); + $mobileDetect = \Mockery::mock(MobileDetect::class); + $mobileDetect->shouldReceive('isMobile')->andReturn(false); + $mobileDetect->shouldReceive('isTablet')->andReturn(false); + + $mode = (new Mode())->determineRunMode(true, $module, $server, $mobileDetect); + + $this->assertFalse($mode->isMobile()); + $this->assertFalse($mode->isTablet()); + } }