config = $this->getMockBuilder(IConfig::class) ->disableOriginalConstructor() ->getMock(); $manager = $this->manager = $this->getMockBuilder(IManager::class) ->disableOriginalConstructor() ->getMock(); $this->consoleInput = $this->getMockBuilder(InputInterface::class)->getMock(); $this->consoleOutput = $this->getMockBuilder(OutputInterface::class)->getMock(); /** @var \OCP\IConfig $config */ /** @var \OCP\Encryption\IManager $manager */ $this->command = new Enable($config, $manager); } public static function dataEnable(): array { return [ ['no', null, [], true, 'Encryption enabled', 'No encryption module is loaded'], ['yes', null, [], false, 'Encryption is already enabled', 'No encryption module is loaded'], ['no', null, ['OC_TEST_MODULE' => []], true, 'Encryption enabled', 'No default module is set'], ['no', 'OC_NO_MODULE', ['OC_TEST_MODULE' => []], true, 'Encryption enabled', 'The current default module does not exist: OC_NO_MODULE'], ['no', 'OC_TEST_MODULE', ['OC_TEST_MODULE' => []], true, 'Encryption enabled', 'Default module: OC_TEST_MODULE'], ]; } /** * @dataProvider dataEnable */ public function testEnable(string $oldStatus, ?string $defaultModule, array $availableModules, bool $isUpdating, string $expectedString, string $expectedDefaultModuleString): void { if ($isUpdating) { $this->config->expects($this->once()) ->method('setAppValue') ->with('core', 'encryption_enabled', 'yes'); } $this->manager->expects($this->atLeastOnce()) ->method('getEncryptionModules') ->willReturn($availableModules); if (empty($availableModules)) { $this->config->expects($this->once()) ->method('getAppValue') ->willReturnMap([ ['core', 'encryption_enabled', 'no', $oldStatus], ]); } else { $this->config->expects($this->exactly(2)) ->method('getAppValue') ->willReturnMap([ ['core', 'encryption_enabled', 'no', $oldStatus], ['core', 'default_encryption_module', null, $defaultModule], ]); } $calls = [ [$expectedString, 0], ['', 0], [$expectedDefaultModuleString, 0], ]; $this->consoleOutput->expects($this->exactly(3)) ->method('writeln') ->willReturnCallback(function (string $message, int $level) use (&$calls): void { $call = array_shift($calls); $this->assertStringContainsString($call[0], $message); $this->assertSame($call[1], $level); }); self::invokePrivate($this->command, 'execute', [$this->consoleInput, $this->consoleOutput]); } }