Bugfixing & Enhancement
- Added Mocking Engine for App, DBA, Config - Using Mocking Engine for AutomaticInstallationConsoleTest - Using Mocking Engine for ConfigConsoleTest - Removing MultiUserConsole - Workaround
This commit is contained in:
parent
f7147fae96
commit
0e22c18a9d
10 changed files with 515 additions and 175 deletions
90
tests/Util/AppMockTrait.php
Normal file
90
tests/Util/AppMockTrait.php
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Friendica\Test\Util;
|
||||||
|
|
||||||
|
use Friendica\App;
|
||||||
|
use Friendica\BaseObject;
|
||||||
|
use Friendica\Render\FriendicaSmartyEngine;
|
||||||
|
use org\bovigo\vfs\vfsStreamDirectory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Trait to Mock the global App instance
|
||||||
|
*/
|
||||||
|
trait AppMockTrait
|
||||||
|
{
|
||||||
|
use ConfigMockTrait;
|
||||||
|
use DBAMockTrait;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var App The Friendica global App Mock
|
||||||
|
*/
|
||||||
|
protected $app;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mock the App
|
||||||
|
*
|
||||||
|
* @param vfsStreamDirectory $root The root directory
|
||||||
|
*/
|
||||||
|
public function mockApp($root)
|
||||||
|
{
|
||||||
|
/// @todo This mock is ugly. We return an empty string for each translation - no workaround yet
|
||||||
|
$l10nMock = \Mockery::mock('alias:Friendica\Core\L10n');
|
||||||
|
$l10nMock->shouldReceive('t')
|
||||||
|
->andReturn('');
|
||||||
|
|
||||||
|
$this->mockConfigGet('system', 'theme', 'testtheme');
|
||||||
|
|
||||||
|
// Mocking App and most used functions
|
||||||
|
$this->app = \Mockery::mock('Friendica\App');
|
||||||
|
$this->app
|
||||||
|
->shouldReceive('getBasePath')
|
||||||
|
->andReturn($root->url());
|
||||||
|
|
||||||
|
$this->app
|
||||||
|
->shouldReceive('getConfigValue')
|
||||||
|
->with('database', 'hostname')
|
||||||
|
->andReturn(getenv('MYSQL_HOST'));
|
||||||
|
$this->app
|
||||||
|
->shouldReceive('getConfigValue')
|
||||||
|
->with('database', 'username')
|
||||||
|
->andReturn(getenv('MYSQL_USERNAME'));
|
||||||
|
$this->app
|
||||||
|
->shouldReceive('getConfigValue')
|
||||||
|
->with('database', 'password')
|
||||||
|
->andReturn(getenv('MYSQL_PASSWORD'));
|
||||||
|
$this->app
|
||||||
|
->shouldReceive('getConfigValue')
|
||||||
|
->with('database', 'database')
|
||||||
|
->andReturn(getenv('MYSQL_DATABASE'));
|
||||||
|
$this->app
|
||||||
|
->shouldReceive('getTemplateEngine')
|
||||||
|
->andReturn(new FriendicaSmartyEngine());
|
||||||
|
$this->app
|
||||||
|
->shouldReceive('getCurrentTheme')
|
||||||
|
->andReturn('Smarty3');
|
||||||
|
$this->app
|
||||||
|
->shouldReceive('getTemplateLeftDelimiter')
|
||||||
|
->with('smarty3')
|
||||||
|
->andReturn('{{');
|
||||||
|
$this->app
|
||||||
|
->shouldReceive('getTemplateRightDelimiter')
|
||||||
|
->with('smarty3')
|
||||||
|
->andReturn('}}');
|
||||||
|
$this->app
|
||||||
|
->shouldReceive('saveTimestamp')
|
||||||
|
->andReturn(true);
|
||||||
|
$this->app
|
||||||
|
->shouldReceive('getBaseUrl')
|
||||||
|
->andReturn('http://friendica.local');
|
||||||
|
|
||||||
|
// Mocking the Theme
|
||||||
|
// Necessary for macro engine with template files
|
||||||
|
$themeMock = \Mockery::mock('alias:Friendica\Core\Theme');
|
||||||
|
$themeMock
|
||||||
|
->shouldReceive('install')
|
||||||
|
->with('testtheme')
|
||||||
|
->andReturn(true);
|
||||||
|
|
||||||
|
BaseObject::setApp($this->app);
|
||||||
|
}
|
||||||
|
}
|
59
tests/Util/ConfigMockTrait.php
Normal file
59
tests/Util/ConfigMockTrait.php
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Friendica\Test\Util;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Trait to Mock Config settings
|
||||||
|
*/
|
||||||
|
trait ConfigMockTrait
|
||||||
|
{
|
||||||
|
private $configMock;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mocking a config setting
|
||||||
|
*
|
||||||
|
* @param string $family The family of the config double
|
||||||
|
* @param string $key The key of the config double
|
||||||
|
* @param mixed $value The value of the config double
|
||||||
|
* @param null|int $times How often the Config will get used
|
||||||
|
*/
|
||||||
|
public function mockConfigGet($family, $key, $value, $times = null)
|
||||||
|
{
|
||||||
|
if (!isset($this->configMock)) {
|
||||||
|
$this->configMock = \Mockery::mock('alias:Friendica\Core\Config');
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->configMock
|
||||||
|
->shouldReceive('get')
|
||||||
|
->times($times)
|
||||||
|
->with($family, $key)
|
||||||
|
->andReturn($value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mocking setting a new config entry
|
||||||
|
*
|
||||||
|
* @param string $family The family of the config double
|
||||||
|
* @param string $key The key of the config double
|
||||||
|
* @param mixed $value The value of the config double
|
||||||
|
* @param null|int $times How often the Config will get used
|
||||||
|
* @param bool $return Return value of the set (default is true)
|
||||||
|
*/
|
||||||
|
public function mockConfigSet($family, $key, $value, $times = null, $return = true)
|
||||||
|
{
|
||||||
|
if (!isset($this->configMock)) {
|
||||||
|
$this->configMock = \Mockery::mock('alias:Friendica\Core\Config');
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->mockConfigGet($family, $key, false, 1);
|
||||||
|
if ($return) {
|
||||||
|
$this->mockConfigGet($family, $key, $value, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->configMock
|
||||||
|
->shouldReceive('set')
|
||||||
|
->times($times)
|
||||||
|
->with($family, $key, $value)
|
||||||
|
->andReturn($return);
|
||||||
|
}
|
||||||
|
}
|
35
tests/Util/DBAMockTrait.php
Normal file
35
tests/Util/DBAMockTrait.php
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Friendica\Test\Util;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Trait to mock the DBA connection status
|
||||||
|
*/
|
||||||
|
trait DBAMockTrait
|
||||||
|
{
|
||||||
|
private $dbaMock;
|
||||||
|
|
||||||
|
public function mockConnect($return = true, $times = null)
|
||||||
|
{
|
||||||
|
if (!isset($this->dbaMock)) {
|
||||||
|
$this->dbaMock = \Mockery::mock('alias:Friendica\Database\DBA');
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->dbaMock
|
||||||
|
->shouldReceive('connect')
|
||||||
|
->times($times)
|
||||||
|
->andReturn($return);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function mockConnected($return = true, $times = null)
|
||||||
|
{
|
||||||
|
if (!isset($this->dbaMock)) {
|
||||||
|
$this->dbaMock = \Mockery::mock('alias:Friendica\Database\DBA');
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->dbaMock
|
||||||
|
->shouldReceive('connected')
|
||||||
|
->times($times)
|
||||||
|
->andReturn($return);
|
||||||
|
}
|
||||||
|
}
|
37
tests/Util/DBStructureMockTrait.php
Normal file
37
tests/Util/DBStructureMockTrait.php
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Friendica\Test\Util;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Trait to mock the DBStructure connection status
|
||||||
|
*/
|
||||||
|
trait DBStructureMockTrait
|
||||||
|
{
|
||||||
|
private $dbStructure;
|
||||||
|
|
||||||
|
public function mockUpdate($args = [], $return = true, $times = null)
|
||||||
|
{
|
||||||
|
if (!isset($this->dbStructure)) {
|
||||||
|
$this->dbStructure = \Mockery::mock('alias:Friendica\Database\DBStructure');
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->dbStructure
|
||||||
|
->shouldReceive('update')
|
||||||
|
->withArgs($args)
|
||||||
|
->times($times)
|
||||||
|
->andReturn($return);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function mockExistsTable($tableName, $return = true, $times = null)
|
||||||
|
{
|
||||||
|
if (!isset($this->dbStructure)) {
|
||||||
|
$this->dbStructure = \Mockery::mock('alias:Friendica\Database\DBStructure');
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->dbStructure
|
||||||
|
->shouldReceive('existsTable')
|
||||||
|
->with($tableName)
|
||||||
|
->times($times)
|
||||||
|
->andReturn($return);
|
||||||
|
}
|
||||||
|
}
|
56
tests/datasets/ini/assert.ini.php
Normal file
56
tests/datasets/ini/assert.ini.php
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
<?php return <<<INI
|
||||||
|
|
||||||
|
; If you're unsure about what any of the config keys below do, please check the config/defaults.ini.php for detailed
|
||||||
|
; documentation of their data type and behavior.
|
||||||
|
|
||||||
|
[database]
|
||||||
|
hostname = ""
|
||||||
|
username = ""
|
||||||
|
password = ""
|
||||||
|
database = ""
|
||||||
|
charset = utf8mb4
|
||||||
|
|
||||||
|
; ****************************************************************
|
||||||
|
; Some config values below can be overruled from the admin settings
|
||||||
|
; ****************************************************************
|
||||||
|
|
||||||
|
[config]
|
||||||
|
php_path = "/usr/bin/php"
|
||||||
|
|
||||||
|
admin_email = "admin@friendica.local"
|
||||||
|
|
||||||
|
sitename = Friendica Social Network
|
||||||
|
|
||||||
|
register_policy = REGISTER_OPEN
|
||||||
|
register_text =
|
||||||
|
|
||||||
|
max_import_size = 200000
|
||||||
|
|
||||||
|
[system]
|
||||||
|
urlpath = "/friendica"
|
||||||
|
|
||||||
|
default_timezone = "Europe/Berlin"
|
||||||
|
|
||||||
|
language = "de"
|
||||||
|
|
||||||
|
allowed_themes = vier,quattro,duepuntozero,smoothly,frio
|
||||||
|
theme = vier
|
||||||
|
|
||||||
|
allowed_link_protocols[0] = ftp
|
||||||
|
allowed_link_protocols[1] = ftps
|
||||||
|
allowed_link_protocols[2] = mailto
|
||||||
|
allowed_link_protocols[3] = cid
|
||||||
|
allowed_link_protocols[4] = gopher
|
||||||
|
|
||||||
|
maximagesize = 800000
|
||||||
|
|
||||||
|
no_regfullname = true
|
||||||
|
|
||||||
|
block_local_dir = false
|
||||||
|
|
||||||
|
directory = https://dir.friendica.social
|
||||||
|
|
||||||
|
auth_cookie_lifetime = 7
|
||||||
|
|
||||||
|
INI;
|
||||||
|
// Keep this line
|
56
tests/datasets/ini/assert_db.ini.php
Normal file
56
tests/datasets/ini/assert_db.ini.php
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
<?php return <<<INI
|
||||||
|
|
||||||
|
; If you're unsure about what any of the config keys below do, please check the config/defaults.ini.php for detailed
|
||||||
|
; documentation of their data type and behavior.
|
||||||
|
|
||||||
|
[database]
|
||||||
|
hostname = "localhost:3306"
|
||||||
|
username = "friendica"
|
||||||
|
password = "friendica"
|
||||||
|
database = "friendica"
|
||||||
|
charset = utf8mb4
|
||||||
|
|
||||||
|
; ****************************************************************
|
||||||
|
; Some config values below can be overruled from the admin settings
|
||||||
|
; ****************************************************************
|
||||||
|
|
||||||
|
[config]
|
||||||
|
php_path = "/usr/bin/php"
|
||||||
|
|
||||||
|
admin_email = "admin@friendica.local"
|
||||||
|
|
||||||
|
sitename = Friendica Social Network
|
||||||
|
|
||||||
|
register_policy = REGISTER_OPEN
|
||||||
|
register_text =
|
||||||
|
|
||||||
|
max_import_size = 200000
|
||||||
|
|
||||||
|
[system]
|
||||||
|
urlpath = "/friendica"
|
||||||
|
|
||||||
|
default_timezone = "Europe/Berlin"
|
||||||
|
|
||||||
|
language = "de"
|
||||||
|
|
||||||
|
allowed_themes = vier,quattro,duepuntozero,smoothly,frio
|
||||||
|
theme = vier
|
||||||
|
|
||||||
|
allowed_link_protocols[0] = ftp
|
||||||
|
allowed_link_protocols[1] = ftps
|
||||||
|
allowed_link_protocols[2] = mailto
|
||||||
|
allowed_link_protocols[3] = cid
|
||||||
|
allowed_link_protocols[4] = gopher
|
||||||
|
|
||||||
|
maximagesize = 800000
|
||||||
|
|
||||||
|
no_regfullname = true
|
||||||
|
|
||||||
|
block_local_dir = false
|
||||||
|
|
||||||
|
directory = https://dir.friendica.social
|
||||||
|
|
||||||
|
auth_cookie_lifetime = 7
|
||||||
|
|
||||||
|
INI;
|
||||||
|
// Keep this line
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
namespace Friendica\Test\src\Core\Console;
|
namespace Friendica\Test\src\Core\Console;
|
||||||
|
|
||||||
|
use Friendica\Core\Console\AutomaticInstallation;
|
||||||
|
use Friendica\Test\Util\DBStructureMockTrait;
|
||||||
use org\bovigo\vfs\vfsStream;
|
use org\bovigo\vfs\vfsStream;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -11,12 +13,17 @@ use org\bovigo\vfs\vfsStream;
|
||||||
*/
|
*/
|
||||||
class AutomaticInstallationConsoleTest extends ConsoleTest
|
class AutomaticInstallationConsoleTest extends ConsoleTest
|
||||||
{
|
{
|
||||||
|
use DBStructureMockTrait;
|
||||||
|
|
||||||
private $db_host;
|
private $db_host;
|
||||||
private $db_port;
|
private $db_port;
|
||||||
private $db_data;
|
private $db_data;
|
||||||
private $db_user;
|
private $db_user;
|
||||||
private $db_pass;
|
private $db_pass;
|
||||||
|
|
||||||
|
private $assertFile;
|
||||||
|
private $assertFileDb;
|
||||||
|
|
||||||
public function setUp()
|
public function setUp()
|
||||||
{
|
{
|
||||||
parent::setUp();
|
parent::setUp();
|
||||||
|
@ -32,19 +39,20 @@ class AutomaticInstallationConsoleTest extends ConsoleTest
|
||||||
$this->db_user = getenv('MYSQL_USERNAME') . getenv('MYSQL_USER');
|
$this->db_user = getenv('MYSQL_USERNAME') . getenv('MYSQL_USER');
|
||||||
$this->db_pass = getenv('MYSQL_PASSWORD');
|
$this->db_pass = getenv('MYSQL_PASSWORD');
|
||||||
|
|
||||||
// Mocking 'DBStructure::existsTable()' because with CI, we cannot create an empty database
|
$this->mockConfigGet('config', 'php_path', false);
|
||||||
// therefore we temporary override the existing database
|
|
||||||
/// @todo Mocking the DB-Calls of ConsoleTest so we don't need this specific mock anymore
|
|
||||||
$existsMock = \Mockery::mock('alias:Friendica\Database\DBStructure');
|
|
||||||
$existsMock->shouldReceive('existsTable')
|
|
||||||
->with('user')
|
|
||||||
->andReturn(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
private function assertConfig($family, $key, $value)
|
$this->assertFile = dirname(__DIR__) . DIRECTORY_SEPARATOR .
|
||||||
{
|
'..' . DIRECTORY_SEPARATOR .
|
||||||
$config = $this->execute(['config', $family, $key]);
|
'..' . DIRECTORY_SEPARATOR .
|
||||||
$this->assertEquals($family . "." . $key . " => " . $value . "\n", $config);
|
'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';
|
||||||
}
|
}
|
||||||
|
|
||||||
private function assertFinished($txt, $withconfig = false, $copyfile = false)
|
private function assertFinished($txt, $withconfig = false, $copyfile = false)
|
||||||
|
@ -113,14 +121,17 @@ FIN;
|
||||||
$finished = <<<FIN
|
$finished = <<<FIN
|
||||||
Initializing setup...
|
Initializing setup...
|
||||||
|
|
||||||
Creating config file...
|
Complete!
|
||||||
|
|
||||||
|
|
||||||
|
Checking environment...
|
||||||
|
|
||||||
|
NOTICE: Not checking .htaccess/URL-Rewrite during CLI installation.
|
||||||
|
|
||||||
Complete!
|
Complete!
|
||||||
|
|
||||||
|
|
||||||
Checking basic setup...
|
Creating config file...
|
||||||
|
|
||||||
NOTICE: Not checking .htaccess/URL-Rewrite during CLI installation.
|
|
||||||
|
|
||||||
Complete!
|
Complete!
|
||||||
|
|
||||||
|
@ -128,7 +139,7 @@ Checking basic setup...
|
||||||
Checking database...
|
Checking database...
|
||||||
|
|
||||||
[Error] --------
|
[Error] --------
|
||||||
MySQL Connection: Failed, please check your MySQL settings and credentials.
|
:
|
||||||
|
|
||||||
|
|
||||||
FIN;
|
FIN;
|
||||||
|
@ -141,6 +152,11 @@ FIN;
|
||||||
*/
|
*/
|
||||||
public function testWithConfig()
|
public function testWithConfig()
|
||||||
{
|
{
|
||||||
|
$this->mockConnect(true, 1);
|
||||||
|
$this->mockConnected(true, 1);
|
||||||
|
$this->mockExistsTable('user', false, 1);
|
||||||
|
$this->mockUpdate([false, true, true], null, 1);
|
||||||
|
|
||||||
$config = <<<CONF
|
$config = <<<CONF
|
||||||
<?php return <<<INI
|
<?php return <<<INI
|
||||||
|
|
||||||
|
@ -179,7 +195,10 @@ CONF;
|
||||||
->at($this->root)
|
->at($this->root)
|
||||||
->setContent($config);
|
->setContent($config);
|
||||||
|
|
||||||
$txt = $this->execute(['autoinstall', '-f', 'prepared.ini.php']);
|
$console = new AutomaticInstallation();
|
||||||
|
$console->setOption('f', 'prepared.ini.php');
|
||||||
|
|
||||||
|
$txt = $this->dumpExecute($console);
|
||||||
|
|
||||||
$this->assertFinished($txt, false, true);
|
$this->assertFinished($txt, false, true);
|
||||||
|
|
||||||
|
@ -191,23 +210,28 @@ CONF;
|
||||||
*/
|
*/
|
||||||
public function testWithEnvironmentAndSave()
|
public function testWithEnvironmentAndSave()
|
||||||
{
|
{
|
||||||
|
$this->mockConnect(true, 1);
|
||||||
|
$this->mockConnected(true, 1);
|
||||||
|
$this->mockExistsTable('user', false, 1);
|
||||||
|
$this->mockUpdate([false, true, true], null, 1);
|
||||||
|
|
||||||
$this->assertTrue(putenv('FRIENDICA_ADMIN_MAIL=admin@friendica.local'));
|
$this->assertTrue(putenv('FRIENDICA_ADMIN_MAIL=admin@friendica.local'));
|
||||||
$this->assertTrue(putenv('FRIENDICA_TZ=Europe/Berlin'));
|
$this->assertTrue(putenv('FRIENDICA_TZ=Europe/Berlin'));
|
||||||
$this->assertTrue(putenv('FRIENDICA_LANG=de'));
|
$this->assertTrue(putenv('FRIENDICA_LANG=de'));
|
||||||
|
$this->assertTrue(putenv('FRIENDICA_URL_PATH=/friendica'));
|
||||||
|
|
||||||
$txt = $this->execute(['autoinstall', '--savedb']);
|
$console = new AutomaticInstallation();
|
||||||
|
$console->setOption('savedb', true);
|
||||||
|
|
||||||
|
$txt = $this->dumpExecute($console);
|
||||||
|
|
||||||
$this->assertFinished($txt, true);
|
$this->assertFinished($txt, true);
|
||||||
|
|
||||||
$this->assertTrue($this->root->hasChild('config' . DIRECTORY_SEPARATOR . 'local.ini.php'));
|
$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->assertFileEquals(
|
||||||
$this->assertConfig('database', 'username', $this->db_user);
|
$this->assertFileDb,
|
||||||
$this->assertConfig('database', 'database', $this->db_data);
|
$this->root->getChild('config' . DIRECTORY_SEPARATOR . 'local.ini.php')->url());
|
||||||
$this->assertConfig('config', 'admin_email', 'admin@friendica.local');
|
|
||||||
$this->assertConfig('system', 'default_timezone', 'Europe/Berlin');
|
|
||||||
// TODO language changes back to en
|
|
||||||
//$this->assertConfig('system', 'language', 'de');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -215,25 +239,27 @@ CONF;
|
||||||
*/
|
*/
|
||||||
public function testWithEnvironmentWithoutSave()
|
public function testWithEnvironmentWithoutSave()
|
||||||
{
|
{
|
||||||
|
$this->mockConnect(true, 1);
|
||||||
|
$this->mockConnected(true, 1);
|
||||||
|
$this->mockExistsTable('user', false, 1);
|
||||||
|
$this->mockUpdate([false, true, true], null, 1);
|
||||||
|
|
||||||
$this->assertTrue(putenv('FRIENDICA_ADMIN_MAIL=admin@friendica.local'));
|
$this->assertTrue(putenv('FRIENDICA_ADMIN_MAIL=admin@friendica.local'));
|
||||||
$this->assertTrue(putenv('FRIENDICA_TZ=Europe/Berlin'));
|
$this->assertTrue(putenv('FRIENDICA_TZ=Europe/Berlin'));
|
||||||
$this->assertTrue(putenv('FRIENDICA_LANG=de'));
|
$this->assertTrue(putenv('FRIENDICA_LANG=de'));
|
||||||
$this->assertTrue(putenv('FRIENDICA_URL_PATH=/friendica'));
|
$this->assertTrue(putenv('FRIENDICA_URL_PATH=/friendica'));
|
||||||
|
|
||||||
$txt = $this->execute(['autoinstall']);
|
$console = new AutomaticInstallation();
|
||||||
|
|
||||||
$this->assertFinished($txt, true);
|
$returnStr = $this->dumpExecute($console);
|
||||||
|
|
||||||
|
$this->assertFinished($returnStr, true);
|
||||||
|
|
||||||
$this->assertTrue($this->root->hasChild('config' . DIRECTORY_SEPARATOR . 'local.ini.php'));
|
$this->assertTrue($this->root->hasChild('config' . DIRECTORY_SEPARATOR . 'local.ini.php'));
|
||||||
|
|
||||||
$this->assertConfig('database', 'hostname', '');
|
$this->assertFileEquals(
|
||||||
$this->assertConfig('database', 'username', '');
|
$this->assertFile,
|
||||||
$this->assertConfig('database', 'database', '');
|
$this->root->getChild('config' . DIRECTORY_SEPARATOR . 'local.ini.php')->url());
|
||||||
$this->assertConfig('config', 'admin_email', 'admin@friendica.local');
|
|
||||||
$this->assertConfig('system', 'default_timezone', 'Europe/Berlin');
|
|
||||||
$this->assertConfig('system', 'urlpath', '/friendica');
|
|
||||||
// TODO language changes back to en
|
|
||||||
//$this->assertConfig('system', 'language', 'de');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -241,46 +267,38 @@ CONF;
|
||||||
*/
|
*/
|
||||||
public function testWithArguments()
|
public function testWithArguments()
|
||||||
{
|
{
|
||||||
$args = ['autoinstall'];
|
$this->mockConnect(true, 1);
|
||||||
array_push($args, '--dbhost');
|
$this->mockConnected(true, 1);
|
||||||
array_push($args, $this->db_host);
|
$this->mockExistsTable('user', false, 1);
|
||||||
array_push($args, '--dbuser');
|
$this->mockUpdate([false, true, true], null, 1);
|
||||||
array_push($args, $this->db_user);
|
|
||||||
|
$console = new AutomaticInstallation();
|
||||||
|
|
||||||
|
$console->setOption('dbhost', $this->db_host);
|
||||||
|
$console->setOption('dbuser', $this->db_user);
|
||||||
if (!empty($this->db_pass)) {
|
if (!empty($this->db_pass)) {
|
||||||
array_push($args, '--dbpass');
|
$console->setOption('dbpass', $this->db_pass);
|
||||||
array_push($args, $this->db_pass);
|
|
||||||
}
|
}
|
||||||
if (!empty($this->db_port)) {
|
if (!empty($this->db_port)) {
|
||||||
array_push($args, '--dbport');
|
$console->setOption('dbport', $this->db_port);
|
||||||
array_push($args, $this->db_port);
|
|
||||||
}
|
}
|
||||||
array_push($args, '--dbdata');
|
$console->setOption('dbdata', $this->db_data);
|
||||||
array_push($args, $this->db_data);
|
|
||||||
|
|
||||||
array_push($args, '--admin');
|
$console->setOption('admin', 'admin@friendica.local');
|
||||||
array_push($args, 'admin@friendica.local');
|
$console->setOption('tz', 'Europe/Berlin');
|
||||||
array_push($args, '--tz');
|
$console->setOption('lang', 'de');
|
||||||
array_push($args, 'Europe/Berlin');
|
|
||||||
array_push($args, '--lang');
|
|
||||||
array_push($args, 'de');
|
|
||||||
|
|
||||||
array_push($args, '--urlpath');
|
$console->setOption('urlpath', '/friendica');
|
||||||
array_push($args, '/friendica');
|
|
||||||
|
|
||||||
$txt = $this->execute($args);
|
$returnStr = $this->dumpExecute($console);
|
||||||
|
|
||||||
$this->assertFinished($txt, true);
|
$this->assertFinished($returnStr, true);
|
||||||
|
|
||||||
$this->assertTrue($this->root->hasChild('config' . DIRECTORY_SEPARATOR . 'local.ini.php'));
|
$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->assertFileEquals(
|
||||||
$this->assertConfig('database', 'username', $this->db_user);
|
$this->assertFileDb,
|
||||||
$this->assertConfig('database', 'database', $this->db_data);
|
$this->root->getChild('config' . DIRECTORY_SEPARATOR . 'local.ini.php')->url());
|
||||||
$this->assertConfig('config', 'admin_email', 'admin@friendica.local');
|
|
||||||
$this->assertConfig('system', 'default_timezone', 'Europe/Berlin');
|
|
||||||
$this->assertConfig('system', 'urlpath', '/friendica');
|
|
||||||
// TODO language changes back to en
|
|
||||||
//$this->assertConfig('system', 'language', 'de');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -289,17 +307,13 @@ CONF;
|
||||||
*/
|
*/
|
||||||
public function testNoDatabaseConnection()
|
public function testNoDatabaseConnection()
|
||||||
{
|
{
|
||||||
// TODO DBA mocking for whole console tests make this test work again
|
$this->mockConnect(false, 1);
|
||||||
$this->markTestSkipped('DBA is already loaded, we have to mock the whole App to make it work');
|
|
||||||
|
|
||||||
$dbaMock = \Mockery::mock('alias:Friendica\Database\DBA');
|
$console = new AutomaticInstallation();
|
||||||
$dbaMock
|
|
||||||
->shouldReceive('connected')
|
|
||||||
->andReturn(false);
|
|
||||||
|
|
||||||
$txt = $this->execute(['autoinstall']);
|
$returnStr = $this->dumpExecute($console);
|
||||||
|
|
||||||
$this->assertStuckDB($txt);
|
$this->assertStuckDB($returnStr);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testGetHelp()
|
public function testGetHelp()
|
||||||
|
@ -357,7 +371,10 @@ Examples
|
||||||
|
|
||||||
HELP;
|
HELP;
|
||||||
|
|
||||||
$txt = $this->execute(['autoinstall', '-h']);
|
$console = new AutomaticInstallation();
|
||||||
|
$console->setOption('help', true);
|
||||||
|
|
||||||
|
$txt = $this->dumpExecute($console);
|
||||||
|
|
||||||
$this->assertEquals($txt, $theHelp);
|
$this->assertEquals($txt, $theHelp);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,8 @@
|
||||||
|
|
||||||
namespace Friendica\Test\src\Core\Console;
|
namespace Friendica\Test\src\Core\Console;
|
||||||
|
|
||||||
use Friendica\Database\DBA;
|
use Friendica\Core\Console\Config;
|
||||||
|
use \Mockery as m;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @runTestsInSeparateProcesses
|
* @runTestsInSeparateProcesses
|
||||||
|
@ -11,76 +12,105 @@ use Friendica\Database\DBA;
|
||||||
*/
|
*/
|
||||||
class ConfigConsoleTest extends ConsoleTest
|
class ConfigConsoleTest extends ConsoleTest
|
||||||
{
|
{
|
||||||
public function tearDown()
|
protected function setUp()
|
||||||
{
|
{
|
||||||
DBA::delete('config', ['k' => 'test']);
|
parent::setUp();
|
||||||
|
|
||||||
parent::tearDown();
|
m::getConfiguration()->setConstantsMap([
|
||||||
}
|
'Friendica\App\Mode' => [
|
||||||
|
'DBCONFIGAVAILABLE' => 0
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
|
||||||
private function assertGet($family, $key, $value) {
|
$mode = m::mock('alias:Friendica\App\Mode');
|
||||||
$config = $this->execute(['config', $family, $key]);
|
$mode
|
||||||
$this->assertEquals($family . "." . $key . " => " . $value . "\n", $config);
|
->shouldReceive('has')
|
||||||
}
|
->andReturn(true);
|
||||||
|
|
||||||
private function assertSet($family, $key, $value) {
|
$this->app
|
||||||
$config = $this->execute(['config', $family, $key, $value]);
|
->shouldReceive('getMode')
|
||||||
$this->assertEquals($family . "." . $key . " <= " . $value . "\n", $config);
|
->andReturn($mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
function testSetGetKeyValue() {
|
function testSetGetKeyValue() {
|
||||||
$this->assertSet( 'config', 'test', 'now');
|
$this->mockConfigSet('config', 'test', 'now', 1);
|
||||||
$this->assertGet('config', 'test', 'now');
|
$console = new Config();
|
||||||
$this->assertSet('config', 'test', '');
|
$console->setArgument(0, 'config');
|
||||||
$this->assertGet('config', 'test', '');
|
$console->setArgument(1, 'test');
|
||||||
DBA::delete('config', ['k' => 'test']);
|
$console->setArgument(2, 'now');
|
||||||
$this->assertGet('config', 'test', null);
|
$txt = $this->dumpExecute($console);
|
||||||
|
$this->assertEquals("config.test <= now\n", $txt);
|
||||||
|
|
||||||
|
$this->mockConfigGet('config', 'test', 'now', 1);
|
||||||
|
$console = new Config();
|
||||||
|
$console->setArgument(0, 'config');
|
||||||
|
$console->setArgument(1, 'test');
|
||||||
|
$txt = $this->dumpExecute($console);
|
||||||
|
$this->assertEquals("config.test => now\n", $txt);
|
||||||
|
|
||||||
|
$this->mockConfigGet('config', 'test', null, 1);
|
||||||
|
$console = new Config();
|
||||||
|
$console->setArgument(0, 'config');
|
||||||
|
$console->setArgument(1, 'test');
|
||||||
|
$txt = $this->dumpExecute($console);
|
||||||
|
$this->assertEquals("config.test => \n", $txt);
|
||||||
}
|
}
|
||||||
|
|
||||||
function testSetArrayValue() {
|
function testSetArrayValue() {
|
||||||
$testArray = [1, 2, 3];
|
$testArray = [1, 2, 3];
|
||||||
DBA::insert('config', ['cat' => 'config', 'k' => 'test', 'v' => serialize($testArray)]);
|
$this->mockConfigGet('config', 'test', $testArray, 1);
|
||||||
|
|
||||||
$txt = $this->execute(['config', 'config', 'test', 'now']);
|
$console = new Config();
|
||||||
|
$console->setArgument(0, 'config');
|
||||||
|
$console->setArgument(1, 'test');
|
||||||
|
$console->setArgument(2, 'now');
|
||||||
|
$txt = $this->dumpExecute($console);
|
||||||
|
|
||||||
$this->assertEquals("[Error] config.test is an array and can't be set using this command.\n", $txt);
|
$this->assertEquals("[Error] config.test is an array and can't be set using this command.\n", $txt);
|
||||||
}
|
}
|
||||||
|
|
||||||
function testTooManyArguments() {
|
function testTooManyArguments() {
|
||||||
$txt = $this->execute(['config', 'config', 'test', 'it', 'now']);
|
$console = new Config();
|
||||||
|
$console->setArgument(0, 'config');
|
||||||
|
$console->setArgument(1, 'test');
|
||||||
|
$console->setArgument(2, 'it');
|
||||||
|
$console->setArgument(3, 'now');
|
||||||
|
$txt = $this->dumpExecute($console);
|
||||||
$assertion = '[Warning] Too many arguments';
|
$assertion = '[Warning] Too many arguments';
|
||||||
$firstline = substr($txt, 0, strlen($assertion));
|
$firstline = substr($txt, 0, strlen($assertion));
|
||||||
|
|
||||||
$this->assertEquals($assertion, $firstline);
|
$this->assertEquals($assertion, $firstline);
|
||||||
}
|
}
|
||||||
|
|
||||||
function testVerbose() {
|
function testVerbose() {
|
||||||
$this->assertSet('test', 'it', 'now');
|
$this->mockConfigGet('test', 'it', 'now', 1);
|
||||||
$executable = $this->getExecutablePath();
|
$console = new Config();
|
||||||
|
$console->setArgument(0, 'test');
|
||||||
|
$console->setArgument(1, 'it');
|
||||||
|
$console->setOption('v', 1);
|
||||||
$assertion = <<<CONF
|
$assertion = <<<CONF
|
||||||
Executable: {$executable}
|
Executable: -
|
||||||
Arguments: array (
|
|
||||||
0 => 'config',
|
|
||||||
1 => 'test',
|
|
||||||
)
|
|
||||||
Options: array (
|
|
||||||
'v' => 1,
|
|
||||||
)
|
|
||||||
Command: config
|
|
||||||
Executable: {$executable}
|
|
||||||
Class: Friendica\Core\Console\Config
|
Class: Friendica\Core\Console\Config
|
||||||
Arguments: array (
|
Arguments: array (
|
||||||
0 => 'test',
|
0 => 'test',
|
||||||
|
1 => 'it',
|
||||||
)
|
)
|
||||||
Options: array (
|
Options: array (
|
||||||
'v' => 1,
|
'v' => 1,
|
||||||
)
|
)
|
||||||
[test]
|
test.it => now
|
||||||
it => now
|
|
||||||
|
|
||||||
CONF;
|
CONF;
|
||||||
$txt = $this->execute(['config', 'test', '-v']);
|
$txt = $this->dumpExecute($console);
|
||||||
|
|
||||||
$this->assertEquals($assertion, $txt);
|
$this->assertEquals($assertion, $txt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function testUnableToSet() {
|
||||||
|
$this->mockConfigSet('test', 'it', 'now', 1, false);
|
||||||
|
$console = new Config();
|
||||||
|
$console->setArgument(0, 'test');
|
||||||
|
$console->setArgument(1, 'it');
|
||||||
|
$console->setArgument(2, 'now');
|
||||||
|
$txt = $this->dumpExecute($console);
|
||||||
|
$this->assertSame("Unable to set test.it\n", $txt);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,27 +2,16 @@
|
||||||
|
|
||||||
namespace Friendica\Test\src\Core\Console;
|
namespace Friendica\Test\src\Core\Console;
|
||||||
|
|
||||||
use Friendica\App;
|
use Asika\SimpleConsole\Console;
|
||||||
use Friendica\BaseObject;
|
use Friendica\Test\Util\AppMockTrait;
|
||||||
use Friendica\Database\DBA;
|
|
||||||
use Friendica\Test\Util\Intercept;
|
use Friendica\Test\Util\Intercept;
|
||||||
use Friendica\Test\Util\VFSTrait;
|
use Friendica\Test\Util\VFSTrait;
|
||||||
use org\bovigo\vfs\vfsStream;
|
|
||||||
use org\bovigo\vfs\vfsStreamDirectory;
|
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
abstract class ConsoleTest extends TestCase
|
abstract class ConsoleTest extends TestCase
|
||||||
{
|
{
|
||||||
use VFSTrait;
|
use VFSTrait;
|
||||||
|
use AppMockTrait;
|
||||||
/**
|
|
||||||
* @var MultiUseConsole Extension of the basic Friendica Console for testing purpose
|
|
||||||
*/
|
|
||||||
private $console;
|
|
||||||
/**
|
|
||||||
* @var App The Friendica App
|
|
||||||
*/
|
|
||||||
protected $app;
|
|
||||||
|
|
||||||
protected $stdout;
|
protected $stdout;
|
||||||
|
|
||||||
|
@ -30,43 +19,37 @@ abstract class ConsoleTest extends TestCase
|
||||||
{
|
{
|
||||||
parent::setUp();
|
parent::setUp();
|
||||||
|
|
||||||
Intercept::setUp();
|
|
||||||
|
|
||||||
if (!getenv('MYSQL_DATABASE')) {
|
if (!getenv('MYSQL_DATABASE')) {
|
||||||
$this->markTestSkipped('Please set the MYSQL_* environment variables to your test database credentials.');
|
$this->markTestSkipped('Please set the MYSQL_* environment variables to your test database credentials.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Intercept::setUp();
|
||||||
|
|
||||||
$this->setUpVfsDir();
|
$this->setUpVfsDir();
|
||||||
|
$this->mockApp($this->root);
|
||||||
// fake console.php for setting an executable
|
|
||||||
vfsStream::newFile('console.php')
|
|
||||||
->at($this->root->getChild('bin'))
|
|
||||||
->setContent('<? php');
|
|
||||||
|
|
||||||
// Reusable App object
|
|
||||||
$this->app = new App($this->root->url());
|
|
||||||
BaseObject::setApp($this->app);
|
|
||||||
$this->console = new MultiUseConsole();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function execute($args) {
|
protected function tearDown()
|
||||||
$this->app->reload();
|
{
|
||||||
|
\Mockery::close();
|
||||||
|
|
||||||
array_unshift($args, $this->getExecutablePath());
|
parent::tearDown();
|
||||||
Intercept::reset();
|
|
||||||
$this->console->reset();
|
|
||||||
$this->console->parseTestArgv($args);
|
|
||||||
$this->console->execute();
|
|
||||||
|
|
||||||
$returnStr = Intercept::$cache;
|
|
||||||
Intercept::reset();
|
|
||||||
return $returnStr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return string returns the path to the console executable during tests
|
* Dumps the execution of an console output to a string and returns it
|
||||||
|
*
|
||||||
|
* @param Console $console The current console instance
|
||||||
|
*
|
||||||
|
* @return string the output of the execution
|
||||||
*/
|
*/
|
||||||
protected function getExecutablePath() {
|
protected function dumpExecute($console)
|
||||||
return $this->root->getChild('bin' . DIRECTORY_SEPARATOR . 'console.php')->url();
|
{
|
||||||
|
Intercept::reset();
|
||||||
|
$console->execute();
|
||||||
|
$returnStr = Intercept::$cache;
|
||||||
|
Intercept::reset();
|
||||||
|
|
||||||
|
return $returnStr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Friendica\Test\src\Core\Console;
|
|
||||||
|
|
||||||
use Friendica\Core\Console;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds two methods to the Friendica\Core\Console so we can reuse it during tests
|
|
||||||
*
|
|
||||||
* @package Friendica\Test\src\Core\Console
|
|
||||||
*/
|
|
||||||
class MultiUseConsole extends Console
|
|
||||||
{
|
|
||||||
public function reset() {
|
|
||||||
$this->args = [];
|
|
||||||
$this->options = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function parseTestArgv($argv)
|
|
||||||
{
|
|
||||||
$this->parseArgv($argv);
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in a new issue