*/
class Mode
{
- const LOCALCONFIGPRESENT = 1;
- const DBAVAILABLE = 2;
- const DBCONFIGAVAILABLE = 4;
+ const LOCALCONFIGPRESENT = 1;
+ const DBAVAILABLE = 2;
+ const DBCONFIGAVAILABLE = 4;
const MAINTENANCEDISABLED = 8;
/***
*
* @return Mode returns itself
*
- * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+ * @throws \Exception
*/
public function determine($basePath = null)
{
$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;
}
$this->has(Mode::DBCONFIGAVAILABLE) &&
$this->has(Mode::MAINTENANCEDISABLED);
}
-}
\ No newline at end of file
+}
->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();