* * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 * * This code is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License, version 3, * along with this program. If not, see * */ namespace Tests\Core\Command\Config\App; use OC\Core\Command\Config\App\GetConfig; use OCP\Exceptions\AppConfigUnknownKeyException; use OCP\IAppConfig; use PHPUnit\Framework\MockObject\MockObject; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Test\TestCase; class GetConfigTest extends TestCase { /** @var IAppConfig|MockObject */ protected $appConfig; /** @var InputInterface|MockObject */ protected $consoleInput; /** @var OutputInterface|MockObject */ protected $consoleOutput; protected Command $command; protected function setUp(): void { parent::setUp(); $this->appConfig = $this->createMock(IAppConfig::class); $this->consoleInput = $this->createMock(InputInterface::class); $this->consoleOutput = $this->createMock(OutputInterface::class); $this->command = new GetConfig($this->appConfig); } public static function dataGet(): array { return [ // String output as json ['name', 'newvalue', true, null, false, 'json', 0, json_encode('newvalue')], // String output as plain text ['name', 'newvalue', true, null, false, 'plain', 0, 'newvalue'], // String falling back to default output as json ['name', null, false, 'newvalue', true, 'json', 0, json_encode('newvalue')], // String falling back without default: error ['name', null, false, null, false, 'json', 1, null], // Int "0" output as json/plain ['name', 0, true, null, false, 'json', 0, json_encode(0)], ['name', 0, true, null, false, 'plain', 0, '0'], // Int "1" output as json/plain ['name', 1, true, null, false, 'json', 0, json_encode(1)], ['name', 1, true, null, false, 'plain', 0, '1'], // Bool "true" output as json/plain ['name', true, true, null, false, 'json', 0, json_encode(true)], ['name', true, true, null, false, 'plain', 0, 'true'], // Bool "false" output as json/plain ['name', false, true, null, false, 'json', 0, json_encode(false)], ['name', false, true, null, false, 'plain', 0, 'false'], // Null output as json/plain ['name', null, true, null, false, 'json', 0, json_encode(null)], ['name', null, true, null, false, 'plain', 0, 'null'], // Array output as json/plain ['name', ['a', 'b'], true, null, false, 'json', 0, json_encode(['a', 'b'])], ['name', ['a', 'b'], true, null, false, 'plain', 0, "a\nb"], // Key array output as json/plain ['name', [0 => 'a', 1 => 'b'], true, null, false, 'json', 0, json_encode(['a', 'b'])], ['name', [0 => 'a', 1 => 'b'], true, null, false, 'plain', 0, "a\nb"], // Associative array output as json/plain ['name', ['a' => 1, 'b' => 2], true, null, false, 'json', 0, json_encode(['a' => 1, 'b' => 2])], ['name', ['a' => 1, 'b' => 2], true, null, false, 'plain', 0, "a: 1\nb: 2"], ]; } /** * @dataProvider dataGet */ public function testGet(string $configName, mixed $value, bool $configExists, mixed $defaultValue, bool $hasDefault, string $outputFormat, int $expectedReturn, ?string $expectedMessage): void { if (!$expectedReturn) { if ($configExists) { $this->appConfig->expects($this->once()) ->method('getDetails') ->with('app-name', $configName) ->willReturn(['value' => $value]); } } if (!$configExists) { $this->appConfig->expects($this->once()) ->method('getDetails') ->with('app-name', $configName) ->willThrowException(new AppConfigUnknownKeyException()); } $this->consoleInput->expects($this->exactly(2)) ->method('getArgument') ->willReturnMap([ ['app', 'app-name'], ['name', $configName], ]); $this->consoleInput->method('getOption') ->willReturnMap([ ['default-value', $defaultValue], ['output', $outputFormat], ]); $this->consoleInput->method('hasParameterOption') ->willReturnMap([ ['--output', false, true], ['--default-value', false, $hasDefault], ]); if ($expectedMessage !== null) { global $output; $output = ''; $this->consoleOutput->method('writeln') ->willReturnCallback(function ($value) { global $output; $output .= $value . "\n"; return $output; }); } $this->assertSame($expectedReturn, self::invokePrivate($this->command, 'execute', [$this->consoleInput, $this->consoleOutput])); if ($expectedMessage !== null) { global $output; // Remove the trailing newline $this->assertSame($expectedMessage, substr($output, 0, -1)); } } }