namespace Friendica\Test\src\Core\Console;
+use Friendica\Core\Console\AutomaticInstallation;
+use Friendica\Test\Util\DBAMockTrait;
+use Friendica\Test\Util\DBStructureMockTrait;
+use Friendica\Test\Util\L10nMockTrait;
+use Friendica\Test\Util\RendererMockTrait;
use org\bovigo\vfs\vfsStream;
+use org\bovigo\vfs\vfsStreamFile;
/**
* @runTestsInSeparateProcesses
*/
class AutomaticInstallationConsoleTest extends ConsoleTest
{
+ use L10nMockTrait;
+ use DBAMockTrait;
+ use DBStructureMockTrait;
+ use RendererMockTrait;
+
private $db_host;
private $db_port;
private $db_data;
private $db_user;
private $db_pass;
+ /**
+ * @var vfsStreamFile Assert file without DB credentials
+ */
+ private $assertFile;
+ /**
+ * @var vfsStreamFile Assert file with DB credentials
+ */
+ private $assertFileDb;
+
public function setUp()
{
parent::setUp();
- if ($this->root->hasChild('config' . DIRECTORY_SEPARATOR . 'local.ini.php')) {
+ if ($this->root->hasChild('config' . DIRECTORY_SEPARATOR . 'local.config.php')) {
$this->root->getChild('config')
- ->removeChild('local.ini.php');
+ ->removeChild('local.config.php');
}
$this->db_host = getenv('MYSQL_HOST');
- $this->db_port = (!empty(getenv('MYSQL_PORT'))) ? getenv('MYSQL_PORT') : null;
+ $this->db_port = !empty(getenv('MYSQL_PORT')) ? getenv('MYSQL_PORT') : null;
$this->db_data = getenv('MYSQL_DATABASE');
$this->db_user = getenv('MYSQL_USERNAME') . getenv('MYSQL_USER');
$this->db_pass = getenv('MYSQL_PASSWORD');
+
+ $this->configMock
+ ->shouldReceive('get')
+ ->with('config', 'php_path')
+ ->andReturn(false);
+
+ $this->mockL10nT();
}
- private function assertConfig($family, $key, $value)
+ /**
+ * Creates the arguments which is asserted to be passed to 'replaceMacros()' for creating the local.config.php
+ *
+ * @param bool $withDb if true, DB will get saved too
+ *
+ * @return array The arguments to pass to the mock for 'replaceMacros()'
+ */
+ private function createArgumentsForMacro($withDb)
{
- $config = $this->execute(['config', $family, $key]);
- $this->assertEquals($family . "." . $key . " => " . $value . "\n", $config);
+ $args = [
+ '$phpath' => trim(shell_exec('which php')),
+ '$dbhost' => (($withDb) ? $this->db_host . (isset($this->db_port) ? ':' . $this->db_port : '') : ''),
+ '$dbuser' => (($withDb) ? $this->db_user : ''),
+ '$dbpass' => (($withDb) ? $this->db_pass : ''),
+ '$dbdata' => (($withDb) ? $this->db_data : ''),
+ '$timezone' => 'Europe/Berlin',
+ '$language' => 'de',
+ '$urlpath' => '/friendica',
+ '$adminmail' => 'admin@friendica.local'
+ ];
+
+ return $args;
}
private function assertFinished($txt, $withconfig = false, $copyfile = false)
Creating config file...
+
+ Complete!
CFG;
}
Copying config file...
+
+ Complete!
CFG;
}
$finished = <<<FIN
-Initializing setup...{$cfg}
+Initializing setup...
Complete!
-Checking basic setup...
+Checking environment...
NOTICE: Not checking .htaccess/URL-Rewrite during CLI installation.
Complete!
+{$cfg}
Checking database...
$finished = <<<FIN
Initializing setup...
-Creating config file...
-
Complete!
-Checking basic setup...
+Checking environment...
NOTICE: Not checking .htaccess/URL-Rewrite during CLI installation.
Complete!
+Creating config file...
+
+ Complete!
+
+
Checking database...
[Error] --------
-MySQL Connection: Failed, please check your MySQL settings and credentials.
+Could not connect to database.:
FIN;
*/
public function testWithConfig()
{
- $config = <<<CONF
-<?php return <<<INI
-
-[database]
-hostname =
-username =
-password =
-database =
-charset = utf8mb4
-
-
-; ****************************************************************
-; The configuration below will be overruled by the admin panel.
-; Changes made below will only have an effect if the database does
-; not contain any configuration for the friendica system.
-; ****************************************************************
-
-[config]
-admin_email =
-
-sitename = Friendica Social Network
-
-register_policy = REGISTER_OPEN
-register_text =
+ $this->mockConnect(true, 1);
+ $this->mockConnected(true, 1);
+ $this->mockExistsTable('user', false, 1);
+ $this->mockUpdate([$this->root->url(), false, true, true], null, 1);
-[system]
-default_timezone = UTC
-
-language = en
-INI;
-// Keep this line
+ $config = <<<CONF
+<?php
+// Local configuration
+
+// If you're unsure about what any of the config keys below do, please check the config/defaults.config.php for detailed
+// documentation of their data type and behavior.
+
+return [
+ 'database' => [
+ 'hostname' => '',
+ 'username' => '',
+ 'password' => '',
+ 'database' => '',
+ 'charset' => 'utf8mb4',
+ ],
+
+ // ****************************************************************
+ // The configuration below will be overruled by the admin panel.
+ // Changes made below will only have an effect if the database does
+ // not contain any configuration for the friendica system.
+ // ****************************************************************
+
+ 'config' => [
+ 'admin_email' => '',
+ 'sitename' => 'Friendica Social Network',
+ 'register_policy' => \Friendica\Module\Register::OPEN,
+ 'register_text' => '',
+ ],
+ 'system' => [
+ 'default_timezone' => 'UTC',
+ 'language' => 'en',
+ ],
+];
CONF;
- vfsStream::newFile('prepared.ini.php')
+ vfsStream::newFile('prepared.config.php')
->at($this->root)
->setContent($config);
- $txt = $this->execute(['autoinstall', '-f', 'prepared.ini.php']);
+ $console = new AutomaticInstallation($this->consoleArgv);
+ $console->setOption('f', 'prepared.config.php');
+
+ $txt = $this->dumpExecute($console);
$this->assertFinished($txt, false, true);
- $this->assertTrue($this->root->hasChild('config' . DIRECTORY_SEPARATOR . 'local.ini.php'));
+ $this->assertTrue($this->root->hasChild('config' . DIRECTORY_SEPARATOR . 'local.config.php'));
}
/**
*/
public function testWithEnvironmentAndSave()
{
+ $this->mockConnect(true, 1);
+ $this->mockConnected(true, 1);
+ $this->mockExistsTable('user', false, 1);
+ $this->mockUpdate([$this->root->url(), false, true, true], null, 1);
+
+ $this->mockGetMarkupTemplate('local.config.tpl', 'testTemplate', 1);
+ $this->mockReplaceMacros('testTemplate', $this->createArgumentsForMacro(true), '', 1);
+
$this->assertTrue(putenv('FRIENDICA_ADMIN_MAIL=admin@friendica.local'));
$this->assertTrue(putenv('FRIENDICA_TZ=Europe/Berlin'));
$this->assertTrue(putenv('FRIENDICA_LANG=de'));
+ $this->assertTrue(putenv('FRIENDICA_URL_PATH=/friendica'));
- $txt = $this->execute(['autoinstall', '--savedb']);
+ $console = new AutomaticInstallation($this->consoleArgv);
+ $console->setOption('savedb', true);
- $this->assertFinished($txt, true);
+ $txt = $this->dumpExecute($console);
- $this->assertTrue($this->root->hasChild('config' . DIRECTORY_SEPARATOR . 'local.ini.php'));
-
- $this->assertConfig('database', 'hostname', $this->db_host . (!empty($this->db_port) ? ':' . $this->db_port : ''));
- $this->assertConfig('database', 'username', $this->db_user);
- $this->assertConfig('database', 'database', $this->db_data);
- $this->assertConfig('config', 'admin_email', 'admin@friendica.local');
- $this->assertConfig('system', 'default_timezone', 'Europe/Berlin');
- $this->assertConfig('system', 'language', 'de');
+ $this->assertFinished($txt, true);
}
-
/**
* @medium
*/
public function testWithEnvironmentWithoutSave()
{
+ $this->mockConnect(true, 1);
+ $this->mockConnected(true, 1);
+ $this->mockExistsTable('user', false, 1);
+ $this->mockUpdate([$this->root->url(), false, true, true], null, 1);
+
+ $this->mockGetMarkupTemplate('local.config.tpl', 'testTemplate', 1);
+ $this->mockReplaceMacros('testTemplate', $this->createArgumentsForMacro(false), '', 1);
+
$this->assertTrue(putenv('FRIENDICA_ADMIN_MAIL=admin@friendica.local'));
$this->assertTrue(putenv('FRIENDICA_TZ=Europe/Berlin'));
$this->assertTrue(putenv('FRIENDICA_LANG=de'));
$this->assertTrue(putenv('FRIENDICA_URL_PATH=/friendica'));
- $txt = $this->execute(['autoinstall']);
-
- $this->assertFinished($txt, true);
+ $console = new AutomaticInstallation($this->consoleArgv);
- $this->assertTrue($this->root->hasChild('config' . DIRECTORY_SEPARATOR . 'local.ini.php'));
+ $txt = $this->dumpExecute($console);
- $this->assertConfig('database', 'hostname', '');
- $this->assertConfig('database', 'username', '');
- $this->assertConfig('database', 'database', '');
- $this->assertConfig('config', 'admin_email', 'admin@friendica.local');
- $this->assertConfig('system', 'default_timezone', 'Europe/Berlin');
- $this->assertConfig('system', 'language', 'de');
- $this->assertConfig('system', 'urlpath', '/friendica');
+ $this->assertFinished($txt, true);
}
/**
*/
public function testWithArguments()
{
- $args = ['autoinstall'];
- array_push($args, '--dbhost');
- array_push($args, $this->db_host);
- array_push($args, '--dbuser');
- array_push($args, $this->db_user);
+ $this->mockConnect(true, 1);
+ $this->mockConnected(true, 1);
+ $this->mockExistsTable('user', false, 1);
+ $this->mockUpdate([$this->root->url(), false, true, true], null, 1);
+
+ $this->mockGetMarkupTemplate('local.config.tpl', 'testTemplate', 1);
+ $this->mockReplaceMacros('testTemplate', $this->createArgumentsForMacro(true), '', 1);
+
+ $console = new AutomaticInstallation($this->consoleArgv);
+
+ $console->setOption('dbhost', $this->db_host);
+ $console->setOption('dbuser', $this->db_user);
if (!empty($this->db_pass)) {
- array_push($args, '--dbpass');
- array_push($args, $this->db_pass);
+ $console->setOption('dbpass', $this->db_pass);
}
if (!empty($this->db_port)) {
- array_push($args, '--dbport');
- array_push($args, $this->db_port);
+ $console->setOption('dbport', $this->db_port);
}
- array_push($args, '--dbdata');
- array_push($args, $this->db_data);
+ $console->setOption('dbdata', $this->db_data);
- array_push($args, '--admin');
- array_push($args, 'admin@friendica.local');
- array_push($args, '--tz');
- array_push($args, 'Europe/Berlin');
- array_push($args, '--lang');
- array_push($args, 'de');
+ $console->setOption('admin', 'admin@friendica.local');
+ $console->setOption('tz', 'Europe/Berlin');
+ $console->setOption('lang', 'de');
- array_push($args, '--urlpath');
- array_push($args, '/friendica');
+ $console->setOption('urlpath', '/friendica');
- $txt = $this->execute($args);
+ $txt = $this->dumpExecute($console);
$this->assertFinished($txt, true);
-
- $this->assertTrue($this->root->hasChild('config' . DIRECTORY_SEPARATOR . 'local.ini.php'));
-
- $this->assertConfig('database', 'hostname', $this->db_host . (!empty($this->db_port) ? ':' . $this->db_port : ''));
- $this->assertConfig('database', 'username', $this->db_user);
- $this->assertConfig('database', 'database', $this->db_data);
- $this->assertConfig('config', 'admin_email', 'admin@friendica.local');
- $this->assertConfig('system', 'default_timezone', 'Europe/Berlin');
- $this->assertConfig('system', 'language', 'de');
- $this->assertConfig('system', 'urlpath', '/friendica');
}
/**
* @runTestsInSeparateProcesses
+ * @preserveGlobalState disabled
*/
public function testNoDatabaseConnection()
{
- $dbaMock = \Mockery::mock('alias:Friendica\Database\DBA');
- $dbaMock
- ->shouldReceive('connected')
- ->andReturn(false);
+ $this->mockConnect(false, 1);
- $txt = $this->execute(['autoinstall']);
+ $this->mockGetMarkupTemplate('local.config.tpl', 'testTemplate', 1);
+ $this->mockReplaceMacros('testTemplate', $this->createArgumentsForMacro(false), '', 1);
+
+ $this->assertTrue(putenv('FRIENDICA_ADMIN_MAIL=admin@friendica.local'));
+ $this->assertTrue(putenv('FRIENDICA_TZ=Europe/Berlin'));
+ $this->assertTrue(putenv('FRIENDICA_LANG=de'));
+ $this->assertTrue(putenv('FRIENDICA_URL_PATH=/friendica'));
+
+ $console = new AutomaticInstallation($this->consoleArgv);
+
+ $txt = $this->dumpExecute($console);
$this->assertStuckDB($txt);
}
bin/console autoinstall [-h|--help|-?] [-v] [-a] [-f]
Description
- Installs Friendica with data based on the local.ini.php file or environment variables
+ Installs Friendica with data based on the local.config.php file or environment variables
Notes
Not checking .htaccess/URL-Rewrite during CLI installation.
-h|--help|-? Show help information
-v Show more debug information.
-a All setup checks are required (except .htaccess)
- -f|--file <config> prepared config file (e.g. "config/local.ini.php" itself) which will override every other config option - except the environment variables)
+ -f|--file <config> prepared config file (e.g. "config/local.config.php" itself) which will override every other config option - except the environment variables)
-s|--savedb Save the DB credentials to the file (if environment variables is used)
-H|--dbhost <host> The host of the mysql/mariadb database (env MYSQL_HOST)
-p|--dbport <port> The port of the mysql/mariadb database (env MYSQL_PORT)
FRIENDICA_LANG The langauge of Friendica
Examples
- bin/console autoinstall -f 'input.ini.php
- Installs Friendica with the prepared 'input.ini.php' file
+ bin/console autoinstall -f 'input.config.php
+ Installs Friendica with the prepared 'input.config.php' file
bin/console autoinstall --savedb
- Installs Friendica with environment variables and saves them to the 'config/local.ini.php' file
+ Installs Friendica with environment variables and saves them to the 'config/local.config.php' file
bin/console autoinstall -h localhost -p 3365 -U user -P passwort1234 -d friendica
Installs Friendica with a local mysql database with credentials
HELP;
- $txt = $this->execute(['autoinstall', '-h']);
+ $console = new AutomaticInstallation($this->consoleArgv);
+ $console->setOption('help', true);
+
+ $txt = $this->dumpExecute($console);
$this->assertEquals($txt, $theHelp);
}