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
{
const LOCALCONFIGPRESENT = 1;
const DBAVAILABLE = 2;
const DBCONFIGAVAILABLE = 4;
const LOCALCONFIGPRESENT = 1;
const DBAVAILABLE = 2;
const DBCONFIGAVAILABLE = 4;
const MAINTENANCEDISABLED = 8;
/***
@ -58,7 +58,7 @@ class Mode
*
* @return Mode returns itself
*
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \Exception
*/
public function determine($basePath = null)
{
@ -88,8 +88,10 @@ class Mode
$this->mode |= Mode::DBCONFIGAVAILABLE;
if ($this->configCache->get('system', 'maintenance') ||
$this->database->selectFirst('config', ['v'], ['cat' => 'system', 'k' => 'maintenance'])) {
if (!empty($this->configCache->get('system', '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;
}
@ -134,4 +136,4 @@ class Mode
$this->has(Mode::DBCONFIGAVAILABLE) &&
$this->has(Mode::MAINTENANCEDISABLED);
}
}
}

View file

@ -125,7 +125,31 @@ class ModeTest extends MockedTest
->andReturn(false)->once();
$this->databaseMock->shouldReceive('selectFirst')
->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->determine();