]> source.dussan.org Git - nextcloud-server.git/commitdiff
Disable multiple apps at once
authorDaniel Kesselberg <mail@danielkesselberg.de>
Sun, 27 Jan 2019 13:34:39 +0000 (14:34 +0100)
committerDaniel Kesselberg <mail@danielkesselberg.de>
Tue, 19 Feb 2019 20:03:05 +0000 (21:03 +0100)
Signed-off-by: Daniel Kesselberg <mail@danielkesselberg.de>
core/Command/App/Disable.php
tests/Core/Command/Apps/AppsDisableTest.php [new file with mode: 0644]

index b64e309bd976c3f408bdc84b04b64beffd7a239c..a79c9c474db56103f25a5724d6930c60aa80405f 100644 (file)
@@ -36,39 +36,52 @@ use Symfony\Component\Console\Output\OutputInterface;
 class Disable extends Command implements CompletionAwareInterface {
 
        /** @var IAppManager */
-       protected $manager;
+       protected $appManager;
+
+       /** @var int */
+       protected $exitCode = 0;
 
        /**
-        * @param IAppManager $manager
+        * @param IAppManager $appManager
         */
-       public function __construct(IAppManager $manager) {
+       public function __construct(IAppManager $appManager) {
                parent::__construct();
-               $this->manager = $manager;
+               $this->appManager = $appManager;
        }
 
-       protected function configure() {
+       protected function configure(): void {
                $this
                        ->setName('app:disable')
                        ->setDescription('disable an app')
                        ->addArgument(
                                'app-id',
-                               InputArgument::REQUIRED,
+                               InputArgument::REQUIRED | InputArgument::IS_ARRAY,
                                'disable the specified app'
                        );
        }
 
        protected function execute(InputInterface $input, OutputInterface $output) {
-               $appId = $input->getArgument('app-id');
-               if ($this->manager->isInstalled($appId)) {
-                       try {
-                               $this->manager->disableApp($appId);
-                               $output->writeln($appId . ' disabled');
-                       } catch(\Exception $e) {
-                               $output->writeln($e->getMessage());
-                               return 2;
-                       }
-               } else {
+               $appIds = $input->getArgument('app-id');
+
+               foreach ($appIds as $appId) {
+                       $this->disableApp($appId, $output);
+               }
+
+               return $this->exitCode;
+       }
+
+       private function disableApp(string $appId, OutputInterface $output): void {
+               if ($this->appManager->isInstalled($appId) === false) {
                        $output->writeln('No such app enabled: ' . $appId);
+                       return;
+               }
+
+               try {
+                       $this->appManager->disableApp($appId);
+                       $output->writeln($appId . ' disabled');
+               } catch (\Exception $e) {
+                       $output->writeln($e->getMessage());
+                       $this->exitCode = 2;
                }
        }
 
@@ -88,7 +101,7 @@ class Disable extends Command implements CompletionAwareInterface {
         */
        public function completeArgumentValues($argumentName, CompletionContext $context) {
                if ($argumentName === 'app-id') {
-                       return array_diff(\OC_App::getEnabledApps(true, true), $this->manager->getAlwaysEnabledApps());
+                       return array_diff(\OC_App::getEnabledApps(true, true), $this->appManager->getAlwaysEnabledApps());
                }
                return [];
        }
diff --git a/tests/Core/Command/Apps/AppsDisableTest.php b/tests/Core/Command/Apps/AppsDisableTest.php
new file mode 100644 (file)
index 0000000..1e3c401
--- /dev/null
@@ -0,0 +1,84 @@
+<?php
+/**
+ * @copyright Copyright (c) 2019, Daniel Kesselberg (mail@danielkesselberg.de)
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * 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
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace Tests\Core\Command\Config;
+
+use OC\Core\Command\App\Disable;
+use Symfony\Component\Console\Tester\CommandTester;
+use Test\TestCase;
+
+/**
+ * Class AppsDisableTest
+ *
+ * @group DB
+ */
+class AppsDisableTest extends TestCase {
+
+       /** @var CommandTester */
+       private $commandTester;
+
+       public function setUp() {
+               parent::setUp();
+
+               $command = new Disable(
+                       \OC::$server->getAppManager()
+               );
+
+               $this->commandTester = new CommandTester($command);
+
+               \OC::$server->getAppManager()->enableApp('admin_audit');
+               \OC::$server->getAppManager()->enableApp('comments');
+       }
+
+       /**
+        * @dataProvider dataCommandInput
+        * @param $appId
+        * @param $groups
+        * @param $statusCode
+        * @param $output
+        */
+       public function testCommandInput($appId, $statusCode, $output) {
+               $input = ['app-id' => $appId];
+
+               $this->commandTester->execute($input);
+
+               $this->assertContains($output, $this->commandTester->getDisplay());
+               $this->assertSame($statusCode, $this->commandTester->getStatusCode());
+       }
+
+       public function dataCommandInput() {
+               return [
+                       [['admin_audit'], 0, 'admin_audit disabled'],
+                       [['comments'], 0, 'comments disabled'],
+                       [['invalid_app'], 0, 'No such app enabled: invalid_app'],
+
+                       [['admin_audit', 'comments'], 0, "admin_audit disabled\ncomments disabled"],
+                       [['admin_audit', 'comments', 'invalid_app'], 0, "admin_audit disabled\ncomments disabled\nNo such app enabled: invalid_app"],
+
+                       [['files'], 2, "files can't be disabled"],
+                       [['provisioning_api'], 2, "provisioning_api can't be disabled"],
+
+                       [['files', 'admin_audit'], 2, "files can't be disabled.\nadmin_audit disabled"],
+                       [['provisioning_api', 'comments'], 2, "provisioning_api can't be disabled.\ncomments disabled"],
+
+               ];
+       }
+}