From bc084c40a6745a947e3650196df17f55344ca72f Mon Sep 17 00:00:00 2001
From: Joas Schilling <nickvergessen@owncloud.com>
Date: Fri, 8 May 2015 17:32:20 +0200
Subject: [PATCH] Add a command to delete a system config

---
 core/command/config/system/deleteconfig.php   |  75 +++++++++++
 core/command/config/system/getconfig.php      |   1 -
 core/command/config/system/setconfig.php      |   1 -
 core/register_command.php                     |   1 +
 .../config/system/deleteconfigtest.php        | 120 ++++++++++++++++++
 .../command/config/system/getconfigtest.php   |   6 +-
 .../command/config/system/setconfigtest.php   |   2 +-
 7 files changed, 200 insertions(+), 6 deletions(-)
 create mode 100644 core/command/config/system/deleteconfig.php
 create mode 100644 tests/core/command/config/system/deleteconfigtest.php

diff --git a/core/command/config/system/deleteconfig.php b/core/command/config/system/deleteconfig.php
new file mode 100644
index 0000000000..c4930a8d3a
--- /dev/null
+++ b/core/command/config/system/deleteconfig.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @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 <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC\Core\Command\Config\System;
+
+use OC\Core\Command\Base;
+use OC\SystemConfig;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class DeleteConfig extends Base {
+	/** * @var SystemConfig */
+	protected $systemConfig;
+
+	/**
+	 * @param SystemConfig $systemConfig
+	 */
+	public function __construct(SystemConfig $systemConfig) {
+		parent::__construct();
+		$this->systemConfig = $systemConfig;
+	}
+
+	protected function configure() {
+		parent::configure();
+
+		$this
+			->setName('config:system:delete')
+			->setDescription('Delete a system config value')
+			->addArgument(
+				'name',
+				InputArgument::REQUIRED,
+				'Name of the config to set'
+			)
+			->addOption(
+				'error-if-not-exists',
+				null,
+				InputOption::VALUE_NONE,
+				'Checks whether the config exists before deleting it'
+			)
+		;
+	}
+
+	protected function execute(InputInterface $input, OutputInterface $output) {
+		$configName = $input->getArgument('name');
+
+		if ($input->hasParameterOption('--error-if-not-exists') && !in_array($configName, $this->systemConfig->getKeys())) {
+			$output->writeln('<error>Config ' . $configName . ' could not be deleted because it did not exist</error>');
+			return 1;
+		}
+
+		$this->systemConfig->deleteValue($configName);
+		$output->writeln('<info>System config value ' . $configName . ' deleted</info>');
+		return 0;
+	}
+}
diff --git a/core/command/config/system/getconfig.php b/core/command/config/system/getconfig.php
index a462b15433..1ed3b36da3 100644
--- a/core/command/config/system/getconfig.php
+++ b/core/command/config/system/getconfig.php
@@ -23,7 +23,6 @@ namespace OC\Core\Command\Config\System;
 
 use OC\Core\Command\Base;
 use OC\SystemConfig;
-use OCP\IAppConfig;
 use Symfony\Component\Console\Input\InputArgument;
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Input\InputOption;
diff --git a/core/command/config/system/setconfig.php b/core/command/config/system/setconfig.php
index e2c901cc78..6eda9db8f9 100644
--- a/core/command/config/system/setconfig.php
+++ b/core/command/config/system/setconfig.php
@@ -23,7 +23,6 @@ namespace OC\Core\Command\Config\System;
 
 use OC\Core\Command\Base;
 use OC\SystemConfig;
-use OCP\IAppConfig;
 use Symfony\Component\Console\Input\InputArgument;
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Input\InputOption;
diff --git a/core/register_command.php b/core/register_command.php
index 75bd5d8e53..9ef8ca5e58 100644
--- a/core/register_command.php
+++ b/core/register_command.php
@@ -41,6 +41,7 @@ if (\OC::$server->getConfig()->getSystemValue('installed', false)) {
 	$application->add(new OC\Core\Command\Background\Ajax(\OC::$server->getConfig()));
 
 	$application->add(new OC\Core\Command\Config\ListConfigs(\OC::$server->getSystemConfig(), \OC::$server->getAppConfig()));
+	$application->add(new OC\Core\Command\Config\System\DeleteConfig(\OC::$server->getSystemConfig()));
 	$application->add(new OC\Core\Command\Config\System\GetConfig(\OC::$server->getSystemConfig()));
 	$application->add(new OC\Core\Command\Config\System\SetConfig(\OC::$server->getSystemConfig()));
 
diff --git a/tests/core/command/config/system/deleteconfigtest.php b/tests/core/command/config/system/deleteconfigtest.php
new file mode 100644
index 0000000000..b10fa16ed6
--- /dev/null
+++ b/tests/core/command/config/system/deleteconfigtest.php
@@ -0,0 +1,120 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @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 <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace Tests\Core\Command\Config\System;
+
+
+use OC\Core\Command\Config\System\DeleteConfig;
+use Test\TestCase;
+
+class DeleteConfigTest extends TestCase {
+	/** @var \PHPUnit_Framework_MockObject_MockObject */
+	protected $systemConfig;
+
+	/** @var \PHPUnit_Framework_MockObject_MockObject */
+	protected $consoleInput;
+	/** @var \PHPUnit_Framework_MockObject_MockObject */
+	protected $consoleOutput;
+
+	/** @var \Symfony\Component\Console\Command\Command */
+	protected $command;
+
+	protected function setUp() {
+		parent::setUp();
+
+		$systemConfig = $this->systemConfig = $this->getMockBuilder('OC\SystemConfig')
+			->disableOriginalConstructor()
+			->getMock();
+		$this->consoleInput = $this->getMock('Symfony\Component\Console\Input\InputInterface');
+		$this->consoleOutput = $this->getMock('Symfony\Component\Console\Output\OutputInterface');
+
+		/** @var \OC\SystemConfig $systemConfig */
+		$this->command = new DeleteConfig($systemConfig);
+	}
+
+
+	public function deleteData() {
+		return [
+			[
+				'name',
+				true,
+				true,
+				0,
+				'info',
+			],
+			[
+				'name',
+				true,
+				false,
+				0,
+				'info',
+			],
+			[
+				'name',
+				false,
+				false,
+				0,
+				'info',
+			],
+			[
+				'name',
+				false,
+				true,
+				1,
+				'error',
+			],
+		];
+	}
+
+	/**
+	 * @dataProvider deleteData
+	 *
+	 * @param string $configName
+	 * @param bool $configExists
+	 * @param bool $checkIfExists
+	 * @param int $expectedReturn
+	 * @param string $expectedMessage
+	 */
+	public function testDelete($configName, $configExists, $checkIfExists, $expectedReturn, $expectedMessage) {
+		$this->systemConfig->expects(($checkIfExists) ? $this->once() : $this->never())
+			->method('getKeys')
+			->willReturn($configExists ? [$configName] : []);
+
+		$this->systemConfig->expects(($expectedReturn === 0) ? $this->once() : $this->never())
+			->method('deleteValue')
+			->with($configName);
+
+		$this->consoleInput->expects($this->once())
+			->method('getArgument')
+			->with('name')
+			->willReturn($configName);
+		$this->consoleInput->expects($this->any())
+			->method('hasParameterOption')
+			->with('--error-if-not-exists')
+			->willReturn($checkIfExists);
+
+		$this->consoleOutput->expects($this->any())
+			->method('writeln')
+			->with($this->stringContains($expectedMessage));
+
+		$this->assertSame($expectedReturn, \Test_Helper::invokePrivate($this->command, 'execute', [$this->consoleInput, $this->consoleOutput]));
+	}
+}
diff --git a/tests/core/command/config/system/getconfigtest.php b/tests/core/command/config/system/getconfigtest.php
index 3aa21611a8..1c74bcd67c 100644
--- a/tests/core/command/config/system/getconfigtest.php
+++ b/tests/core/command/config/system/getconfigtest.php
@@ -51,7 +51,7 @@ class GetConfigTest extends TestCase {
 	}
 
 
-	public function setData() {
+	public function getData() {
 		return [
 			// String output as json
 			['name', 'newvalue', true, null, false, 'json', 0, json_encode('newvalue')],
@@ -94,7 +94,7 @@ class GetConfigTest extends TestCase {
 	}
 
 	/**
-	 * @dataProvider setData
+	 * @dataProvider getData
 	 *
 	 * @param string $configName
 	 * @param mixed $value
@@ -105,7 +105,7 @@ class GetConfigTest extends TestCase {
 	 * @param int $expectedReturn
 	 * @param string $expectedMessage
 	 */
-	public function testList($configName, $value, $configExists, $defaultValue, $hasDefault, $outputFormat, $expectedReturn, $expectedMessage) {
+	public function testGet($configName, $value, $configExists, $defaultValue, $hasDefault, $outputFormat, $expectedReturn, $expectedMessage) {
 		$this->systemConfig->expects($this->atLeastOnce())
 			->method('getKeys')
 			->willReturn($configExists ? [$configName] : []);
diff --git a/tests/core/command/config/system/setconfigtest.php b/tests/core/command/config/system/setconfigtest.php
index 53f9565155..53bb9e59e1 100644
--- a/tests/core/command/config/system/setconfigtest.php
+++ b/tests/core/command/config/system/setconfigtest.php
@@ -82,7 +82,7 @@ class SetConfigTest extends TestCase {
 	 * @param bool $updated
 	 * @param string $expectedMessage
 	 */
-	public function testList($configName, $newValue, $configExists, $updateOnly, $updated, $expectedMessage) {
+	public function testSet($configName, $newValue, $configExists, $updateOnly, $updated, $expectedMessage) {
 		$this->systemConfig->expects($this->once())
 			->method('getKeys')
 			->willReturn($configExists ? [$configName] : []);
-- 
GitLab