1
1
Fork 0

Fix App\Mode determination

This commit is contained in:
Philipp Holzer 2019-07-21 14:40:50 +02:00
parent 7aa9917ca8
commit 05102911db
No known key found for this signature in database
GPG key ID: D8365C3D36B77D90
2 changed files with 34 additions and 8 deletions

View file

@ -13,9 +13,9 @@ use Friendica\Util\BasePath;
*/ */
class Mode class Mode
{ {
const LOCALCONFIGPRESENT = 1; const LOCALCONFIGPRESENT = 1;
const DBAVAILABLE = 2; const DBAVAILABLE = 2;
const DBCONFIGAVAILABLE = 4; const DBCONFIGAVAILABLE = 4;
const MAINTENANCEDISABLED = 8; const MAINTENANCEDISABLED = 8;
/*** /***
@ -58,7 +58,7 @@ class Mode
* *
* @return Mode returns itself * @return Mode returns itself
* *
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Exception
*/ */
public function determine($basePath = null) public function determine($basePath = null)
{ {
@ -88,8 +88,10 @@ class Mode
$this->mode |= Mode::DBCONFIGAVAILABLE; $this->mode |= Mode::DBCONFIGAVAILABLE;
if ($this->configCache->get('system', 'maintenance') || if (!empty($this->configCache->get('system', 'maintenance')) ||
$this->database->selectFirst('config', ['v'], ['cat' => 'system', 'k' => 'maintenance'])) { // Don't use Config or Configuration here because we're possibly BEFORE initializing the Configuration,
// so this could lead to a dependency circle
!empty($this->database->selectFirst('config', ['v'], ['cat' => 'system', 'k' => 'maintenance'])['v'])) {
return $this; return $this;
} }
@ -134,4 +136,4 @@ class Mode
$this->has(Mode::DBCONFIGAVAILABLE) && $this->has(Mode::DBCONFIGAVAILABLE) &&
$this->has(Mode::MAINTENANCEDISABLED); $this->has(Mode::MAINTENANCEDISABLED);
} }
} }

View file

@ -125,7 +125,31 @@ class ModeTest extends MockedTest
->andReturn(false)->once(); ->andReturn(false)->once();
$this->databaseMock->shouldReceive('selectFirst') $this->databaseMock->shouldReceive('selectFirst')
->with('config', ['v'], ['cat' => 'system', 'k' => 'maintenance']) ->with('config', ['v'], ['cat' => 'system', 'k' => 'maintenance'])
->andReturn(false)->once(); ->andReturn(['v' => null])->once();
$mode = new Mode($this->basePathMock, $this->databaseMock, $this->configCacheMock);
$mode->determine();
$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->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->basePathMock, $this->databaseMock, $this->configCacheMock); $mode = new Mode($this->basePathMock, $this->databaseMock, $this->configCacheMock);
$mode->determine(); $mode->determine();