. * */ namespace Friendica\Test\src\Console; use Friendica\App; use Friendica\App\Mode; use Friendica\Console\Config; use Friendica\Core\Config\IConfig; use Mockery; use Mockery\LegacyMockInterface; use Mockery\MockInterface; class ConfigConsoleTest extends ConsoleTest { /** * @var App\Mode|MockInterface $appMode */ private $appMode; /** @var IConfig|LegacyMockInterface|MockInterface */ private $configMock; protected function setUp() : void { parent::setUp(); Mockery::getConfiguration()->setConstantsMap([ Mode::class => [ 'DBCONFIGAVAILABLE' => 0, ], ]); $this->appMode = Mockery::mock(App\Mode::class); $this->appMode->shouldReceive('has') ->andReturn(true); $this->configMock = Mockery::mock(IConfig::class); } public function testSetGetKeyValue() { $this->configMock ->shouldReceive('set') ->with('config', 'test', 'now') ->andReturn(true) ->once(); $this->configMock ->shouldReceive('get') ->with('config', 'test') ->andReturn('old') ->twice(); $this->configMock ->shouldReceive('get') ->with('config', 'test') ->andReturn('now') ->once(); $console = new Config($this->appMode, $this->configMock, $this->consoleArgv); $console->setArgument(0, 'config'); $console->setArgument(1, 'test'); $console->setArgument(2, 'now'); $txt = $this->dumpExecute($console); self::assertEquals("config.test <= now\n", $txt); $this->configMock ->shouldReceive('get') ->with('config', 'test') ->andReturn('now') ->once(); $console = new Config($this->appMode, $this->configMock, [$this->consoleArgv]); $console->setArgument(0, 'config'); $console->setArgument(1, 'test'); $txt = $this->dumpExecute($console); self::assertEquals("config.test => now\n", $txt); $this->configMock ->shouldReceive('get') ->with('config', 'test') ->andReturn(null) ->once(); $console = new Config($this->appMode, $this->configMock, $this->consoleArgv); $console->setArgument(0, 'config'); $console->setArgument(1, 'test'); $txt = $this->dumpExecute($console); self::assertEquals("config.test => \n", $txt); } public function testSetArrayValue() { $testArray = [1, 2, 3]; $this->configMock ->shouldReceive('get') ->with('config', 'test') ->andReturn($testArray) ->once(); $console = new Config($this->appMode, $this->configMock, $this->consoleArgv); $console->setArgument(0, 'config'); $console->setArgument(1, 'test'); $console->setArgument(2, 'now'); $txt = $this->dumpExecute($console); self::assertEquals("[Error] config.test is an array and can't be set using this command.\n", $txt); } public function testSetExistingValue() { $this->configMock ->shouldReceive('get') ->with('config', 'test') ->andReturn('now') ->twice(); $console = new Config($this->appMode, $this->configMock, $this->consoleArgv); $console->setArgument(0, 'config'); $console->setArgument(1, 'test'); $console->setArgument(2, 'now'); $txt = $this->dumpExecute($console); self::assertEquals("[Error] config.test already set to now.\n", $txt); } public function testTooManyArguments() { $console = new Config($this->appMode, $this->configMock, $this->consoleArgv); $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'; $firstline = substr($txt, 0, strlen($assertion)); self::assertEquals($assertion, $firstline); } public function testVerbose() { $this->configMock ->shouldReceive('get') ->with('test', 'it') ->andReturn('now') ->once(); $console = new Config($this->appMode, $this->configMock, $this->consoleArgv); $console->setArgument(0, 'test'); $console->setArgument(1, 'it'); $console->setOption('v', 1); $executable = $this->consoleArgv[0]; $assertion = << 'test', 1 => 'it', ) Options: array ( 'v' => 1, ) test.it => now CONF; $txt = $this->dumpExecute($console); self::assertEquals($assertion, $txt); } public function testUnableToSet() { $this->configMock ->shouldReceive('set') ->with('test', 'it', 'now') ->andReturn(false) ->once(); $this->configMock ->shouldReceive('get') ->with('test', 'it') ->andReturn(null) ->twice(); $console = new Config($this->appMode, $this->configMock, [$this->consoleArgv]); $console->setArgument(0, 'test'); $console->setArgument(1, 'it'); $console->setArgument(2, 'now'); $txt = $this->dumpExecute($console); self::assertSame("Unable to set test.it\n", $txt); } public function testGetHelp() { // Usable to purposely fail if new commands are added without taking tests into account $theHelp = << [-h|--help|-?] [-v] bin/console config [-h|--help|-?] [-v] bin/console config [-h|--help|-?] [-v] Description bin/console config Lists all config values bin/console config Lists all config values in the provided category bin/console config Shows the value of the provided key in the category bin/console config Sets the value of the provided key in the category Notes: Setting config entries which are manually set in config/local.config.php may result in conflict between database settings and the manual startup settings. Options -h|--help|-? Show help information -v Show more debug information. HELP; $console = new Config($this->appMode, $this->configMock, [$this->consoleArgv]); $console->setOption('help', true); $txt = $this->dumpExecute($console); self::assertEquals($txt, $theHelp); } }