namespace Friendica\Test\src\Core\Console;
+use Friendica\Core\Config\Cache\ConfigCache;
use Friendica\Core\Console\AutomaticInstallation;
+use Friendica\Core\Installer;
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_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->mockConfigGet('config', 'php_path', false);
-
- $this->assertFile = dirname(__DIR__) . DIRECTORY_SEPARATOR .
- '..' . DIRECTORY_SEPARATOR .
- '..' . DIRECTORY_SEPARATOR .
- 'datasets' . DIRECTORY_SEPARATOR .
- 'ini' . DIRECTORY_SEPARATOR .
- 'assert.ini.php';
- $this->assertFileDb = dirname(__DIR__) . DIRECTORY_SEPARATOR .
- '..' . DIRECTORY_SEPARATOR .
- '..' . DIRECTORY_SEPARATOR .
- 'datasets' . DIRECTORY_SEPARATOR .
- 'ini' . DIRECTORY_SEPARATOR .
- 'assert_db.ini.php';
+ $this->mockL10nT();
+ }
+
+ /**
+ * 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)
+ {
+ $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' => Installer::DEFAULT_TZ,
+ '$language' => Installer::DEFAULT_LANG,
+ '$urlpath' => '/friendica',
+ '$basepath' => '/test',
+ '$hostname' => 'friendica.local',
+ '$adminmail' => 'admin@friendica.local'
+ ];
+
+ return $args;
}
private function assertFinished($txt, $withconfig = false, $copyfile = false)
Checking database...
[Error] --------
-:
+Could not connect to database.:
FIN;
$this->assertEquals($finished, $txt);
}
+ public function dataInstaller()
+ {
+ return [
+ 'empty' => [
+ 'data' => [
+ 'database' => [
+ 'hostname' => '',
+ 'username' => '',
+ 'password' => '',
+ 'database' => '',
+ ],
+ 'config' => [
+ 'php_path' => '',
+ 'hostname' => '',
+ 'admin_email' => '',
+ ],
+ 'system' => [
+ 'urlpath' => '',
+ 'basepath' => '',
+ 'ssl_policy' => '',
+ 'default_timezone' => '',
+ 'language' => '',
+ ],
+ ],
+ ]
+ ];
+ }
+
/**
- * @medium
+ * Test the automatic installation without any parameter
+ * @dataProvider dataInstaller
*/
- public function testWithConfig()
+ public function testEmpty(array $data)
{
+ $configCache = new ConfigCache();
+ $configCache->load($data);
+ $configCache->set('system', 'basepath', $this->root->url());
+
+ $this->mockApp($this->root, $configCache);
+
$this->mockConnect(true, 1);
$this->mockConnected(true, 1);
$this->mockExistsTable('user', false, 1);
- $this->mockUpdate([false, true, true], null, 1);
-
- $config = <<<CONF
-<?php return <<<INI
+ $this->mockUpdate([$this->root->url(), false, true, true], null, 1);
-[database]
-hostname =
-username =
-password =
-database =
-charset = utf8mb4
+ $this->mockGetMarkupTemplate('local.config.tpl', 'testTemplate', 1);
+ $this->mockReplaceMacros('testTemplate', \Mockery::any(), '', 1);
+ $console = new AutomaticInstallation($this->consoleArgv);
-; ****************************************************************
-; 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 =
+ $txt = $this->dumpExecute($console);
-sitename = Friendica Social Network
+ $this->assertEquals(Installer::DEFAULT_LANG, $configCache->get('system', 'language'));
+ $this->assertEquals(Installer::DEFAULT_TZ, $configCache->get('system', 'default_timezone'));
+ $this->assertEquals(Installer::DEFAULT_HOST, $configCache->get('database', 'hostname'));
+ $this->assertFinished($txt, true, false);
-register_policy = REGISTER_OPEN
-register_text =
+ }
-[system]
-default_timezone = UTC
+ /**
+ * @medium
+ * @dataProvider dataInstaller
+ */
+ public function testWithConfig(array $data)
+ {
+ $this->mockConnect(true, 1);
+ $this->mockConnected(true, 1);
+ $this->mockExistsTable('user', false, 1);
+ $this->mockUpdate([$this->root->url(), false, true, true], null, 1);
-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);
- $console = new AutomaticInstallation();
- $console->setOption('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'));
}
/**
$this->mockConnect(true, 1);
$this->mockConnected(true, 1);
$this->mockExistsTable('user', false, 1);
- $this->mockUpdate([false, true, true], null, 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'));
- $console = new AutomaticInstallation();
+ $console = new AutomaticInstallation($this->consoleArgv);
$console->setOption('savedb', true);
$txt = $this->dumpExecute($console);
$this->assertFinished($txt, true);
-
- $this->assertTrue($this->root->hasChild('config' . DIRECTORY_SEPARATOR . 'local.ini.php'));
-
- $this->assertFileEquals(
- $this->assertFileDb,
- $this->root->getChild('config' . DIRECTORY_SEPARATOR . 'local.ini.php')->url());
}
/**
$this->mockConnect(true, 1);
$this->mockConnected(true, 1);
$this->mockExistsTable('user', false, 1);
- $this->mockUpdate([false, true, true], null, 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'));
- $console = new AutomaticInstallation();
+ $console = new AutomaticInstallation($this->consoleArgv);
$txt = $this->dumpExecute($console);
$this->assertFinished($txt, true);
-
- $this->assertTrue($this->root->hasChild('config' . DIRECTORY_SEPARATOR . 'local.ini.php'));
-
- $this->assertFileEquals(
- $this->assertFile,
- $this->root->getChild('config' . DIRECTORY_SEPARATOR . 'local.ini.php')->url());
}
/**
$this->mockConnect(true, 1);
$this->mockConnected(true, 1);
$this->mockExistsTable('user', false, 1);
- $this->mockUpdate([false, true, true], null, 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();
+ $console = new AutomaticInstallation($this->consoleArgv);
$console->setOption('dbhost', $this->db_host);
$console->setOption('dbuser', $this->db_user);
$txt = $this->dumpExecute($console);
$this->assertFinished($txt, true);
-
- $this->assertTrue($this->root->hasChild('config' . DIRECTORY_SEPARATOR . 'local.ini.php'));
-
- $this->assertFileEquals(
- $this->assertFileDb,
- $this->root->getChild('config' . DIRECTORY_SEPARATOR . 'local.ini.php')->url());
}
/**
{
$this->mockConnect(false, 1);
- $console = new AutomaticInstallation();
+ $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);
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;
- $console = new AutomaticInstallation();
+ $console = new AutomaticInstallation($this->consoleArgv);
$console->setOption('help', true);
$txt = $this->dumpExecute($console);