userManager = $this->getMockBuilder(IUserManager::class) ->disableOriginalConstructor() ->getMock(); $this->config = $this->getMockBuilder(IConfig::class) ->disableOriginalConstructor() ->getMock(); $this->connection = $this->getMockBuilder(IDBConnection::class) ->disableOriginalConstructor() ->getMock(); $this->consoleInput = $this->getMockBuilder(InputInterface::class) ->disableOriginalConstructor() ->getMock(); $this->consoleOutput = $this->getMockBuilder(OutputInterface::class) ->disableOriginalConstructor() ->getMock(); } public function getCommand(array $methods = []) { if (empty($methods)) { return new Setting($this->userManager, $this->config); } else { $mock = $this->getMockBuilder(Setting::class) ->setConstructorArgs([ $this->userManager, $this->config, ]) ->onlyMethods($methods) ->getMock(); return $mock; } } public function dataCheckInput() { return [ [ [['uid', 'username']], [['ignore-missing-user', true]], [], false, false, ], [ [['uid', 'username']], [['ignore-missing-user', false]], [], null, 'The user "username" does not exist.', ], [ [['uid', 'username'], ['key', 'configkey']], [['ignore-missing-user', true]], [['--default-value', false, true]], false, false, ], [ [['uid', 'username'], ['key', '']], [['ignore-missing-user', true]], [['--default-value', false, true]], false, 'The "default-value" option can only be used when specifying a key.', ], [ [['uid', 'username'], ['key', 'configkey'], ['value', '']], [['ignore-missing-user', true]], [], false, false, ], [ [['uid', 'username'], ['key', ''], ['value', '']], [['ignore-missing-user', true]], [], false, 'The value argument can only be used when specifying a key.', ], [ [['uid', 'username'], ['key', 'configkey'], ['value', '']], [['ignore-missing-user', true]], [['--default-value', false, true]], false, 'The value argument can not be used together with "default-value".', ], [ [['uid', 'username'], ['key', 'configkey'], ['value', '']], [['ignore-missing-user', true], ['update-only', true]], [], false, false, ], [ [['uid', 'username'], ['key', 'configkey'], ['value', null]], [['ignore-missing-user', true], ['update-only', true]], [], false, 'The "update-only" option can only be used together with "value".', ], [ [['uid', 'username'], ['key', 'configkey']], [['ignore-missing-user', true], ['delete', true]], [], false, false, ], [ [['uid', 'username'], ['key', '']], [['ignore-missing-user', true], ['delete', true]], [], false, 'The "delete" option can only be used when specifying a key.', ], [ [['uid', 'username'], ['key', 'configkey']], [['ignore-missing-user', true], ['delete', true]], [['--default-value', false, true]], false, 'The "delete" option can not be used together with "default-value".', ], [ [['uid', 'username'], ['key', 'configkey'], ['value', '']], [['ignore-missing-user', true], ['delete', true]], [], false, 'The "delete" option can not be used together with "value".', ], [ [['uid', 'username'], ['key', 'configkey']], [['ignore-missing-user', true], ['delete', true], ['error-if-not-exists', true]], [], false, false, ], [ [['uid', 'username'], ['key', 'configkey']], [['ignore-missing-user', true], ['delete', false], ['error-if-not-exists', true]], [], false, 'The "error-if-not-exists" option can only be used together with "delete".', ], ]; } /** * @dataProvider dataCheckInput * * @param array $arguments * @param array $options * @param array $parameterOptions * @param mixed $user * @param string $expectedException */ public function testCheckInput($arguments, $options, $parameterOptions, $user, $expectedException): void { $this->consoleInput->expects($this->any()) ->method('getArgument') ->willReturnMap($arguments); $this->consoleInput->expects($this->any()) ->method('getOption') ->willReturnMap($options); $this->consoleInput->expects($this->any()) ->method('hasParameterOption') ->willReturnCallback(function (string|array $config, bool $default = false) use ($parameterOptions): bool { foreach ($parameterOptions as $parameterOption) { if ($config === $parameterOption[0] // Check the default value if the maps has 3 entries && (!isset($parameterOption[2]) || $default === $parameterOption[1])) { return end($parameterOption); } } return false; }); if ($user !== false) { $this->userManager->expects($this->once()) ->method('get') ->willReturn($user); } else { $this->userManager->expects($this->never()) ->method('get'); } $command = $this->getCommand(); try { $this->invokePrivate($command, 'checkInput', [$this->consoleInput]); $this->assertFalse($expectedException); } catch (\InvalidArgumentException $e) { $this->assertEquals($expectedException, $e->getMessage()); } } public function testCheckInputExceptionCatch(): void { $command = $this->getCommand(['checkInput']); $command->expects($this->once()) ->method('checkInput') ->willThrowException(new \InvalidArgumentException('test')); $this->consoleOutput->expects($this->once()) ->method('writeln') ->with('test'); $this->assertEquals(1, $this->invokePrivate($command, 'execute', [$this->consoleInput, $this->consoleOutput])); } public function dataExecuteDelete() { return [ ['config', false, null, 0], ['config', true, null, 0], [null, false, null, 0], [null, true, 'The setting does not exist for user "username".', 1], ]; } /** * @dataProvider dataExecuteDelete * * @param string|null $value * @param bool $errorIfNotExists * @param string $expectedLine * @param int $expectedReturn */ public function testExecuteDelete($value, $errorIfNotExists, $expectedLine, $expectedReturn): void { $command = $this->getCommand([ 'writeArrayInOutputFormat', 'checkInput', 'getUserSettings', ]); $this->consoleInput->expects($this->any()) ->method('getArgument') ->willReturnMap([ ['uid', 'username'], ['app', 'appname'], ['key', 'configkey'], ]); $command->expects($this->once()) ->method('checkInput'); $this->config->expects($this->once()) ->method('getUserValue') ->with('username', 'appname', 'configkey', null) ->willReturn($value); $this->consoleInput->expects($this->atLeastOnce()) ->method('hasParameterOption') ->willReturnMap([ ['--delete', false, true], ['--error-if-not-exists', false, $errorIfNotExists], ]); if ($expectedLine === null) { $this->consoleOutput->expects($this->never()) ->method('writeln'); $this->config->expects($this->once()) ->method('deleteUserValue') ->with('username', 'appname', 'configkey'); } else { $this->consoleOutput->expects($this->once()) ->method('writeln') ->with($expectedLine); $this->config->expects($this->never()) ->method('deleteUserValue'); } $this->assertEquals($expectedReturn, $this->invokePrivate($command, 'execute', [$this->consoleInput, $this->consoleOutput])); } public function dataExecuteSet() { return [ ['config', false, null, 0], ['config', true, null, 0], [null, false, null, 0], [null, true, 'The setting does not exist for user "username".', 1], ]; } /** * @dataProvider dataExecuteSet * * @param string|null $value * @param bool $updateOnly * @param string $expectedLine * @param int $expectedReturn */ public function testExecuteSet($value, $updateOnly, $expectedLine, $expectedReturn): void { $command = $this->getCommand([ 'writeArrayInOutputFormat', 'checkInput', 'getUserSettings', ]); $this->consoleInput->expects($this->atLeast(4)) ->method('getArgument') ->willReturnMap([ ['uid', 'username'], ['app', 'appname'], ['key', 'configkey'], ['value', 'setValue'], ]); $command->expects($this->once()) ->method('checkInput'); $this->config->expects($this->once()) ->method('getUserValue') ->with('username', 'appname', 'configkey', null) ->willReturn($value); $this->consoleInput->expects($this->atLeastOnce()) ->method('hasParameterOption') ->willReturnMap([ ['--update-only', false, $updateOnly], ]); if ($expectedLine === null) { $this->consoleOutput->expects($this->never()) ->method('writeln'); $this->consoleInput->expects($this->never()) ->method('getOption'); $this->config->expects($this->once()) ->method('setUserValue') ->with('username', 'appname', 'configkey', 'setValue'); } else { $this->consoleOutput->expects($this->once()) ->method('writeln') ->with($expectedLine); $this->config->expects($this->never()) ->method('setUserValue'); } $this->assertEquals($expectedReturn, $this->invokePrivate($command, 'execute', [$this->consoleInput, $this->consoleOutput])); } public function dataExecuteGet() { return [ ['config', null, 'config', 0], [null, 'config', 'config', 0], [null, null, 'The setting does not exist for user "username".', 1], ]; } /** * @dataProvider dataExecuteGet * * @param string|null $value * @param string|null $defaultValue * @param string $expectedLine * @param int $expectedReturn */ public function testExecuteGet($value, $defaultValue, $expectedLine, $expectedReturn): void { $command = $this->getCommand([ 'writeArrayInOutputFormat', 'checkInput', 'getUserSettings', ]); $this->consoleInput->expects($this->any()) ->method('getArgument') ->willReturnMap([ ['uid', 'username'], ['app', 'appname'], ['key', 'configkey'], ]); $command->expects($this->once()) ->method('checkInput'); $this->config->expects($this->once()) ->method('getUserValue') ->with('username', 'appname', 'configkey', null) ->willReturn($value); if ($value === null) { if ($defaultValue === null) { $this->consoleInput->expects($this->atLeastOnce()) ->method('hasParameterOption') ->willReturn(false); } else { $this->consoleInput->expects($this->atLeastOnce()) ->method('hasParameterOption') ->willReturnCallback(function (string|array $config, bool $default = false): bool { if ($config === '--default-value' && $default === false) { return true; } return false; }); $this->consoleInput->expects($this->once()) ->method('getOption') ->with('default-value') ->willReturn($defaultValue); } } $this->consoleOutput->expects($this->once()) ->method('writeln') ->with($expectedLine); $this->assertEquals($expectedReturn, $this->invokePrivate($command, 'execute', [$this->consoleInput, $this->consoleOutput])); } public function testExecuteList(): void { $command = $this->getCommand([ 'writeArrayInOutputFormat', 'checkInput', 'getUserSettings', ]); $this->consoleInput->expects($this->any()) ->method('getArgument') ->willReturnMap([ ['uid', 'username'], ['app', 'appname'], ['key', ''], ]); $command->expects($this->once()) ->method('checkInput'); $command->expects($this->once()) ->method('getUserSettings') ->willReturn(['settings']); $command->expects($this->once()) ->method('writeArrayInOutputFormat') ->with($this->consoleInput, $this->consoleOutput, ['settings']); $this->assertEquals(0, $this->invokePrivate($command, 'execute', [$this->consoleInput, $this->consoleOutput])); } }