list, add, delete, edit Signed-off-by: Johannes Leuker <j.leuker@hosting.de>pull/26600/head
parent
f031dd61c1
commit
d606799ee2
@ -0,0 +1,101 @@ |
||||
<?php |
||||
/** |
||||
* @copyright Copyright (c) 2021, hosting.de, Johannes Leuker <developers@hosting.de> |
||||
* |
||||
* @author Johannes Leuker <developers@hosting.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 OC\Core\Command\SystemTag; |
||||
|
||||
use OC\Core\Command\Base; |
||||
use OCP\SystemTag\ISystemTag; |
||||
use OCP\SystemTag\ISystemTagManager; |
||||
use OCP\SystemTag\TagAlreadyExistsException; |
||||
use Symfony\Component\Console\Input\InputArgument; |
||||
use Symfony\Component\Console\Input\InputInterface; |
||||
use Symfony\Component\Console\Output\OutputInterface; |
||||
|
||||
class Add extends Base { |
||||
|
||||
/** @var ISystemTagManager */ |
||||
protected $systemTagManager; |
||||
|
||||
public function __construct(ISystemTagManager $systemTagManager) { |
||||
$this->systemTagManager = $systemTagManager; |
||||
parent::__construct(); |
||||
} |
||||
|
||||
protected function configure() { |
||||
$this |
||||
->setName('tag:add') |
||||
->setDescription('Add new tag') |
||||
->addArgument( |
||||
'name', |
||||
InputArgument::REQUIRED, |
||||
'name of the tag', |
||||
) |
||||
->addArgument( |
||||
'access', |
||||
InputArgument::REQUIRED, |
||||
'access level of the tag (public, restricted or invisible)', |
||||
); |
||||
parent::configure(); |
||||
} |
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output): int { |
||||
$name = $input->getArgument('name'); |
||||
if ($name === '') { |
||||
$output->writeln('<error>`name` can\'t be empty</error>'); |
||||
return 3; |
||||
} |
||||
|
||||
switch ($input->getArgument('access')) { |
||||
case 'public': |
||||
$userVisible = true; |
||||
$userAssignable = true; |
||||
break; |
||||
case 'restricted': |
||||
$userVisible = true; |
||||
$userAssignable = false; |
||||
break; |
||||
case 'invisible': |
||||
$userVisible = false; |
||||
$userAssignable = false; |
||||
break; |
||||
default: |
||||
$output->writeln('<error>`access` property is invalid</error>'); |
||||
return 1; |
||||
} |
||||
|
||||
try { |
||||
$tag = $this->systemTagManager->createTag($name, $userVisible, $userAssignable); |
||||
|
||||
$this->writeArrayInOutputFormat($input, $output, |
||||
[ |
||||
'id' => $tag->getId(), |
||||
'name' => $tag->getName(), |
||||
'access' => ISystemTag::ACCESS_LEVEL_LOOKUP[$tag->getAccessLevel()], |
||||
]); |
||||
return 0; |
||||
} catch (TagAlreadyExistsException $e) { |
||||
$output->writeln('<error>'.$e->getMessage().'</error>'); |
||||
return 2; |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,64 @@ |
||||
<?php |
||||
/** |
||||
* @copyright Copyright (c) 2021, hosting.de, Johannes Leuker <developers@hosting.de> |
||||
* |
||||
* @author Johannes Leuker <developers@hosting.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 OC\Core\Command\SystemTag; |
||||
|
||||
use OC\Core\Command\Base; |
||||
use OCP\SystemTag\ISystemTagManager; |
||||
use OCP\SystemTag\TagNotFoundException; |
||||
use Symfony\Component\Console\Input\InputInterface; |
||||
use Symfony\Component\Console\Input\InputOption; |
||||
use Symfony\Component\Console\Output\OutputInterface; |
||||
|
||||
class Delete extends Base { |
||||
|
||||
/** @var ISystemTagManager */ |
||||
protected $systemTagManager; |
||||
|
||||
public function __construct(ISystemTagManager $systemTagManager) { |
||||
$this->systemTagManager = $systemTagManager; |
||||
parent::__construct(); |
||||
} |
||||
|
||||
protected function configure() { |
||||
$this |
||||
->setName('tag:delete') |
||||
->setDescription('delete a tag') |
||||
->addArgument( |
||||
'id', |
||||
InputOption::VALUE_REQUIRED, |
||||
'The ID of the tag that should be deleted', |
||||
); |
||||
} |
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output): int { |
||||
try { |
||||
$this->systemTagManager->deleteTags($input->getArgument('id')); |
||||
$output->writeln('<info>The specified tag was deleted</info>'); |
||||
return 0; |
||||
} catch (TagNotFoundException $e) { |
||||
$output->writeln('<error>Tag not found</error>'); |
||||
return 1; |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,119 @@ |
||||
<?php |
||||
/** |
||||
* @copyright Copyright (c) 2021, hosting.de, Johannes Leuker <developers@hosting.de> |
||||
* |
||||
* @author Johannes Leuker <developers@hosting.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 OC\Core\Command\SystemTag; |
||||
|
||||
use OC\Core\Command\Base; |
||||
use OCP\SystemTag\ISystemTagManager; |
||||
use OCP\SystemTag\TagAlreadyExistsException; |
||||
use OCP\SystemTag\TagNotFoundException; |
||||
use Symfony\Component\Console\Input\InputInterface; |
||||
use Symfony\Component\Console\Input\InputOption; |
||||
use Symfony\Component\Console\Output\OutputInterface; |
||||
|
||||
class Edit extends Base { |
||||
|
||||
/** @var ISystemTagManager */ |
||||
protected $systemTagManager; |
||||
|
||||
/** |
||||
* @param ISystemTagManager $systemTagManager |
||||
*/ |
||||
public function __construct(ISystemTagManager $systemTagManager) { |
||||
$this->systemTagManager = $systemTagManager; |
||||
parent::__construct(); |
||||
} |
||||
|
||||
protected function configure() { |
||||
$this |
||||
->setName('tag:edit') |
||||
->setDescription('edit tag attributes') |
||||
->addArgument( |
||||
'id', |
||||
InputOption::VALUE_REQUIRED, |
||||
'The ID of the tag that should be deleted', |
||||
) |
||||
->addOption( |
||||
'name', |
||||
null, |
||||
InputOption::VALUE_OPTIONAL, |
||||
'sets the \'name\' parameter', |
||||
) |
||||
->addOption( |
||||
'access', |
||||
null, |
||||
InputOption::VALUE_OPTIONAL, |
||||
'sets the access control level (public, restricted, invisible)', |
||||
); |
||||
} |
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output): int { |
||||
$tagArray = $this->systemTagManager->getTagsByIds($input->getArgument('id')); |
||||
// returns an array, but we always expect 0 or 1 results |
||||
|
||||
if (!$tagArray) { |
||||
$output->writeln('<error>Tag not found</error>'); |
||||
return 3; |
||||
} |
||||
|
||||
$tag = array_values($tagArray)[0]; |
||||
$name = $tag->getName(); |
||||
if (!empty($input->getOption('name'))) { |
||||
$name = $input->getOption('name'); |
||||
} |
||||
|
||||
$userVisible = $tag->isUserVisible(); |
||||
$userAssignable = $tag->isUserAssignable(); |
||||
if ($input->getOption('access')) { |
||||
switch ($input->getOption('access')) { |
||||
case 'public': |
||||
$userVisible = true; |
||||
$userAssignable = true; |
||||
break; |
||||
case 'restricted': |
||||
$userVisible = true; |
||||
$userAssignable = false; |
||||
break; |
||||
case 'invisible': |
||||
$userVisible = false; |
||||
$userAssignable = false; |
||||
break; |
||||
default: |
||||
$output->writeln('<error>`access` property is invalid</error>'); |
||||
return 1; |
||||
} |
||||
} |
||||
|
||||
try { |
||||
$this->systemTagManager->updateTag($input->getArgument('id'), $name, $userVisible, $userAssignable); |
||||
$output->writeln('<info>Tag updated ("' . $name . '", '. $userVisible . ', ' . $userAssignable . ')</info>'); |
||||
return 0; |
||||
} catch (TagNotFoundException $e) { |
||||
$output->writeln('<error>Tag not found</error>'); |
||||
return 1; |
||||
} catch (TagAlreadyExistsException $e) { |
||||
$output->writeln('<error>'.$e->getMessage().'</error>'); |
||||
return 2; |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,85 @@ |
||||
<?php |
||||
/** |
||||
* @copyright Copyright (c) 2021, hosting.de, Johannes Leuker <developers@hosting.de> |
||||
* |
||||
* @author Johannes Leuker <developers@hosting.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 OC\Core\Command\SystemTag; |
||||
|
||||
use OC\Core\Command\Base; |
||||
use OCP\SystemTag\ISystemTagManager; |
||||
use OCP\SystemTag\ISystemTag; |
||||
use Symfony\Component\Console\Input\InputInterface; |
||||
use Symfony\Component\Console\Input\InputOption; |
||||
use Symfony\Component\Console\Output\OutputInterface; |
||||
|
||||
class ListCommand extends Base { |
||||
|
||||
/** @var ISystemTagManager */ |
||||
protected $systemTagManager; |
||||
|
||||
public function __construct(ISystemTagManager $systemTagManager) { |
||||
$this->systemTagManager = $systemTagManager; |
||||
parent::__construct(); |
||||
} |
||||
|
||||
protected function configure() { |
||||
$this |
||||
->setName('tag:list') |
||||
->setDescription('list tags') |
||||
->addOption( |
||||
'visibilityFilter', |
||||
null, |
||||
InputOption::VALUE_OPTIONAL, |
||||
'filter by visibility (1,0)' |
||||
) |
||||
->addOption( |
||||
'nameSearchPattern', |
||||
null, |
||||
InputOption::VALUE_OPTIONAL, |
||||
'optional search pattern for the tag name (infix)' |
||||
); |
||||
parent::configure(); |
||||
} |
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output): int { |
||||
$tags = $this->systemTagManager->getAllTags( |
||||
$input->getOption('visibilityFilter'), |
||||
$input->getOption('nameSearchPattern') |
||||
); |
||||
|
||||
$this->writeArrayInOutputFormat($input, $output, $this->formatTags($tags)); |
||||
return 0; |
||||
} |
||||
|
||||
/** |
||||
* @param ISystemtag[] $tags |
||||
* @return array |
||||
*/ |
||||
private function formatTags(array $tags) { |
||||
foreach ($tags as $tag) { |
||||
$result[$tag->getId()] = [ |
||||
'name' => $tag->getName(), |
||||
'access' => ISystemTag::ACCESS_LEVEL_LOOKUP[$tag->getAccessLevel()], |
||||
]; |
||||
} |
||||
return $result; |
||||
} |
||||
} |
||||
@ -0,0 +1,138 @@ |
||||
<?php |
||||
/** |
||||
* @copyright Copyright (c) 2021, hosting.de, Johannes Leuker <developers@hosting.de> |
||||
* |
||||
* @author Johannes Leuker <developers@hosting.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 Test\Core\Command\SystemTag; |
||||
|
||||
use OC\Core\Command\SystemTag\Add; |
||||
use OCP\SystemTag\ISystemTag; |
||||
use OCP\SystemTag\ISystemTagManager; |
||||
use OCP\SystemTag\TagAlreadyExistsException; |
||||
use Symfony\Component\Console\Input\InputInterface; |
||||
use Symfony\Component\Console\Output\OutputInterface; |
||||
use Test\TestCase; |
||||
|
||||
class AddTest extends TestCase { |
||||
|
||||
/** @var ISystemTagManager|\PHPUnit\Framework\MockObject\MockObject */ |
||||
private $systemTagManager; |
||||
|
||||
/** @var ListCommand|\PHPUnit\Framework\MockObject\MockObject */ |
||||
private $command; |
||||
|
||||
/** @var InputInterface|\PHPUnit\Framework\MockObject\MockObject */ |
||||
private $input; |
||||
|
||||
/** @var OutputInterface|\PHPUnit\Framework\MockObject\MockObject */ |
||||
private $output; |
||||
|
||||
protected function setUp(): void { |
||||
parent::setUp(); |
||||
|
||||
$this->systemTagManager = $this->createMock(ISystemTagManager::class); |
||||
$this->command = $this->getMockBuilder(Add::class) |
||||
->setConstructorArgs([$this->systemTagManager]) |
||||
->setMethods(['writeArrayInOutputFormat']) |
||||
->getMock(); |
||||
|
||||
$this->input = $this->createMock(InputInterface::class); |
||||
$this->output = $this->createMock(OutputInterface::class); |
||||
} |
||||
|
||||
public function testExecute() { |
||||
$tagId = '42'; |
||||
$tagName = 'wichtig'; |
||||
$tagAccess = 'public'; |
||||
|
||||
$tag = $this->createMock(ISystemTag::class); |
||||
$tag->method('getId')->willReturn($tagId); |
||||
$tag->method('getName')->willReturn($tagName); |
||||
$tag->method('getAccessLevel')->willReturn(ISystemTag::ACCESS_LEVEL_PUBLIC); |
||||
|
||||
$this->systemTagManager->method('createTag') |
||||
->with( |
||||
$tagName, |
||||
true, |
||||
true |
||||
)->willReturn($tag); |
||||
|
||||
$this->input->method('getArgument') |
||||
->willReturnCallback(function ($arg) use ($tagName, $tagAccess) { |
||||
if ($arg === 'name') { |
||||
return $tagName; |
||||
} elseif ($arg === 'access') { |
||||
return $tagAccess; |
||||
} |
||||
throw new \Exception(); |
||||
}); |
||||
|
||||
$this->command->expects($this->once()) |
||||
->method('writeArrayInOutputFormat') |
||||
->with( |
||||
$this->equalTo($this->input), |
||||
$this->equalTo($this->output), |
||||
[ |
||||
'id' => $tagId, |
||||
'name' => $tagName, |
||||
'access' => $tagAccess, |
||||
] |
||||
); |
||||
|
||||
$this->invokePrivate($this->command, 'execute', [$this->input, $this->output]); |
||||
} |
||||
|
||||
public function testAlreadyExists() { |
||||
$tagId = '42'; |
||||
$tagName = 'wichtig'; |
||||
$tagAccess = 'public'; |
||||
|
||||
$tag = $this->createMock(ISystemTag::class); |
||||
$tag->method('getId')->willReturn($tagId); |
||||
$tag->method('getName')->willReturn($tagName); |
||||
$tag->method('getAccessLevel')->willReturn(ISystemTag::ACCESS_LEVEL_PUBLIC); |
||||
|
||||
$this->systemTagManager->method('createTag') |
||||
->willReturnCallback(function ($tagName, $userVisible, $userAssignable) { |
||||
throw new TagAlreadyExistsException( |
||||
'Tag ("' . $tagName . '", '. $userVisible . ', ' . $userAssignable . ') already exists' |
||||
); |
||||
}); |
||||
|
||||
$this->input->method('getArgument') |
||||
->willReturnCallback(function ($arg) use ($tagName, $tagAccess) { |
||||
if ($arg === 'name') { |
||||
return $tagName; |
||||
} elseif ($arg === 'access') { |
||||
return $tagAccess; |
||||
} |
||||
throw new \Exception(); |
||||
}); |
||||
|
||||
$this->output->expects($this->once()) |
||||
->method('writeln') |
||||
->with( |
||||
'<error>Tag ("wichtig", 1, 1) already exists</error>' |
||||
); |
||||
|
||||
$this->invokePrivate($this->command, 'execute', [$this->input, $this->output]); |
||||
} |
||||
} |
||||
@ -0,0 +1,100 @@ |
||||
<?php |
||||
/** |
||||
* @copyright Copyright (c) 2021, hosting.de, Johannes Leuker <developers@hosting.de> |
||||
* |
||||
* @author Johannes Leuker <developers@hosting.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 Test\Core\Command\SystemTag; |
||||
|
||||
use OC\Core\Command\SystemTag\Delete; |
||||
use OCP\SystemTag\ISystemTagManager; |
||||
use OCP\SystemTag\TagNotFoundException; |
||||
use Symfony\Component\Console\Input\InputInterface; |
||||
use Symfony\Component\Console\Output\OutputInterface; |
||||
use Test\TestCase; |
||||
|
||||
class DeleteTest extends TestCase { |
||||
|
||||
/** @var ISystemTagManager|\PHPUnit\Framework\MockObject\MockObject */ |
||||
private $systemTagManager; |
||||
|
||||
/** @var ListCommand|\PHPUnit\Framework\MockObject\MockObject */ |
||||
private $command; |
||||
|
||||
/** @var InputInterface|\PHPUnit\Framework\MockObject\MockObject */ |
||||
private $input; |
||||
|
||||
/** @var OutputInterface|\PHPUnit\Framework\MockObject\MockObject */ |
||||
private $output; |
||||
|
||||
protected function setUp(): void { |
||||
parent::setUp(); |
||||
|
||||
$this->systemTagManager = $this->createMock(ISystemTagManager::class); |
||||
$this->command = $this->getMockBuilder(Delete::class) |
||||
->setConstructorArgs([$this->systemTagManager]) |
||||
->setMethods(['writeArrayInOutputFormat']) |
||||
->getMock(); |
||||
|
||||
$this->input = $this->createMock(InputInterface::class); |
||||
$this->output = $this->createMock(OutputInterface::class); |
||||
} |
||||
|
||||
public function testExecute() { |
||||
$tagId = 69; |
||||
|
||||
$this->input->method('getArgument') |
||||
->willReturnCallback(function ($arg) use ($tagId) { |
||||
if ($arg === 'id') { |
||||
return $tagId; |
||||
} |
||||
throw new \Exception(); |
||||
}); |
||||
|
||||
$this->output->expects($this->once()) |
||||
->method('writeln') |
||||
->with('<info>The specified tag was deleted</info>'); |
||||
|
||||
$this->invokePrivate($this->command, 'execute', [$this->input, $this->output]); |
||||
} |
||||
|
||||
public function testNotFound() { |
||||
$tagId = 69; |
||||
|
||||
$this->input->method('getArgument') |
||||
->willReturnCallback(function ($arg) use ($tagId) { |
||||
if ($arg === 'id') { |
||||
return $tagId; |
||||
} |
||||
throw new \Exception(); |
||||
}); |
||||
|
||||
$this->systemTagManager->method('deleteTags') |
||||
->willReturnCallback(function ($tagId) { |
||||
throw new TagNotFoundException(); |
||||
}); |
||||
|
||||
$this->output->expects($this->once()) |
||||
->method('writeln') |
||||
->with('<error>Tag not found</error>'); |
||||
|
||||
$this->invokePrivate($this->command, 'execute', [$this->input, $this->output]); |
||||
} |
||||
} |
||||
@ -0,0 +1,201 @@ |
||||
<?php |
||||
/** |
||||
* @copyright Copyright (c) 2021, hosting.de, Johannes Leuker <developers@hosting.de> |
||||
* |
||||
* @author Johannes Leuker <developers@hosting.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 Test\Core\Command\SystemTag; |
||||
|
||||
use OC\Core\Command\SystemTag\Edit; |
||||
use OCP\SystemTag\ISystemTag; |
||||
use OCP\SystemTag\ISystemTagManager; |
||||
use OCP\SystemTag\TagAlreadyExistsException; |
||||
use Symfony\Component\Console\Input\InputInterface; |
||||
use Symfony\Component\Console\Output\OutputInterface; |
||||
use Test\TestCase; |
||||
|
||||
class EditTest extends TestCase { |
||||
|
||||
/** @var ISystemTagManager|\PHPUnit\Framework\MockObject\MockObject */ |
||||
private $systemTagManager; |
||||
|
||||
/** @var ListCommand|\PHPUnit\Framework\MockObject\MockObject */ |
||||
private $command; |
||||
|
||||
/** @var InputInterface|\PHPUnit\Framework\MockObject\MockObject */ |
||||
private $input; |
||||
|
||||
/** @var OutputInterface|\PHPUnit\Framework\MockObject\MockObject */ |
||||
private $output; |
||||
|
||||
protected function setUp(): void { |
||||
parent::setUp(); |
||||
|
||||
$this->systemTagManager = $this->createMock(ISystemTagManager::class); |
||||
$this->command = $this->getMockBuilder(Edit::class) |
||||
->setConstructorArgs([$this->systemTagManager]) |
||||
->setMethods(['writeArrayInOutputFormat']) |
||||
->getMock(); |
||||
|
||||
$this->input = $this->createMock(InputInterface::class); |
||||
$this->output = $this->createMock(OutputInterface::class); |
||||
} |
||||
|
||||
public function testExecute() { |
||||
$tagId = '5'; |
||||
$tagName = 'unwichtige Dateien'; |
||||
$newTagName = 'moderat wichtige Dateien'; |
||||
$newTagAccess = 'restricted'; |
||||
$newTagUserVisible = true; |
||||
$newTagUserAssignable = false; |
||||
|
||||
$tag = $this->createMock(ISystemTag::class); |
||||
$tag->method('getId')->willReturn($tagId); |
||||
$tag->method('getName')->willReturn($tagName); |
||||
$tag->method('getAccessLevel')->willReturn(ISystemTag::ACCESS_LEVEL_INVISIBLE); |
||||
|
||||
$this->systemTagManager->method('getTagsByIds') |
||||
->with($tagId) |
||||
->willReturn([$tag]); |
||||
|
||||
$this->input->method('getArgument') |
||||
->willReturnCallback(function ($arg) use ($tagId) { |
||||
if ($arg === 'id') { |
||||
return $tagId; |
||||
} |
||||
throw new \Exception(); |
||||
}); |
||||
|
||||
$this->input->method('getOption') |
||||
->willReturnCallback(function ($arg) use ($newTagName, $newTagAccess) { |
||||
if ($arg === 'name') { |
||||
return $newTagName; |
||||
} elseif ($arg === 'access') { |
||||
return $newTagAccess; |
||||
} |
||||
throw new \Exception(); |
||||
}); |
||||
|
||||
$this->systemTagManager->expects($this->once()) |
||||
->method('updateTag') |
||||
->with( |
||||
$tagId, |
||||
$newTagName, |
||||
$newTagUserVisible, |
||||
$newTagUserAssignable |
||||
); |
||||
|
||||
$this->output->expects($this->once()) |
||||
->method('writeln') |
||||
->with( |
||||
'<info>Tag updated ("'.$newTagName.'", '.$newTagUserVisible.', '.$newTagUserAssignable.')</info>' |
||||
); |
||||
|
||||
$this->invokePrivate($this->command, 'execute', [$this->input, $this->output]); |
||||
} |
||||
|
||||
public function testAlreadyExists() { |
||||
$tagId = '5'; |
||||
$tagName = 'unwichtige Dateien'; |
||||
$tagUserVisible = false; |
||||
$tagUserAssignable = false; |
||||
$newTagName = 'moderat wichtige Dateien'; |
||||
$newTagAccess = 'restricted'; |
||||
$newTagUserVisible = true; |
||||
$newTagUserAssignable = false; |
||||
|
||||
$tag = $this->createMock(ISystemTag::class); |
||||
$tag->method('getId')->willReturn($tagId); |
||||
$tag->method('getName')->willReturn($tagName); |
||||
$tag->method('isUserVisible')->willReturn($tagUserVisible); |
||||
$tag->method('isUserAssignable')->willReturn($tagUserAssignable); |
||||
$tag->method('getAccessLevel')->willReturn(ISystemTag::ACCESS_LEVEL_INVISIBLE); |
||||
|
||||
$this->systemTagManager->method('getTagsByIds') |
||||
->with($tagId) |
||||
->willReturn([$tag]); |
||||
|
||||
$this->input->method('getArgument') |
||||
->willReturnCallback(function ($arg) use ($tagId) { |
||||
if ($arg === 'id') { |
||||
return $tagId; |
||||
} |
||||
throw new \Exception(); |
||||
}); |
||||
|
||||
$this->input->method('getOption') |
||||
->willReturnCallback(function ($arg) use ($newTagName, $newTagAccess) { |
||||
if ($arg === 'name') { |
||||
return $newTagName; |
||||
} elseif ($arg === 'access') { |
||||
return $newTagAccess; |
||||
} |
||||
throw new \Exception(); |
||||
}); |
||||
|
||||
$this->systemTagManager->method('updateTag') |
||||
->willReturnCallback(function ($tagId, $tagName, $userVisible, $userAssignable) { |
||||
throw new TagAlreadyExistsException( |
||||
'Tag ("' . $tagName . '", '. $userVisible . ', ' . $userAssignable . ') already exists' |
||||
); |
||||
}); |
||||
|
||||
$this->systemTagManager->expects($this->once()) |
||||
->method('updateTag') |
||||
->with( |
||||
$tagId, |
||||
$newTagName, |
||||
$newTagUserVisible, |
||||
$newTagUserAssignable |
||||
); |
||||
|
||||
$this->output->expects($this->once()) |
||||
->method('writeln') |
||||
->with( |
||||
'<error>Tag ("' . $newTagName . '", '. $newTagUserVisible . ', ' . $newTagUserAssignable . ') already exists</error>' |
||||
); |
||||
|
||||
$this->invokePrivate($this->command, 'execute', [$this->input, $this->output]); |
||||
} |
||||
|
||||
public function testNotFound() { |
||||
$tagId = '404'; |
||||
|
||||
$this->input->method('getArgument') |
||||
->willReturnCallback(function ($arg) use ($tagId) { |
||||
if ($arg === 'id') { |
||||
return $tagId; |
||||
} |
||||
throw new \Exception(); |
||||
}); |
||||
|
||||
$this->systemTagManager->method('getTagsByIds') |
||||
->with($tagId) |
||||
->willReturn([]); |
||||
|
||||
$this->output->expects($this->once()) |
||||
->method('writeln') |
||||
->with( |
||||
'<error>Tag not found</error>' |
||||
); |
||||
|
||||
$this->invokePrivate($this->command, 'execute', [$this->input, $this->output]); |
||||
} |
||||
} |
||||
@ -0,0 +1,113 @@ |
||||
<?php |
||||
/** |
||||
* @copyright Copyright (c) 2021, hosting.de, Johannes Leuker <developers@hosting.de> |
||||
* |
||||
* @author Johannes Leuker <developers@hosting.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 Test\Core\Command\SystemTag; |
||||
|
||||
use OC\Core\Command\SystemTag\ListCommand; |
||||
use OCP\SystemTag\ISystemTag; |
||||
use OCP\SystemTag\ISystemTagManager; |
||||
use Symfony\Component\Console\Input\InputInterface; |
||||
use Symfony\Component\Console\Output\OutputInterface; |
||||
use Test\TestCase; |
||||
|
||||
class ListCommandTest extends TestCase { |
||||
|
||||
/** @var ISystemTagManager|\PHPUnit\Framework\MockObject\MockObject */ |
||||
private $systemTagManager; |
||||
|
||||
/** @var ListCommand|\PHPUnit\Framework\MockObject\MockObject */ |
||||
private $command; |
||||
|
||||
/** @var InputInterface|\PHPUnit\Framework\MockObject\MockObject */ |
||||
private $input; |
||||
|
||||
/** @var OutputInterface|\PHPUnit\Framework\MockObject\MockObject */ |
||||
private $output; |
||||
|
||||
protected function setUp(): void { |
||||
parent::setUp(); |
||||
|
||||
$this->systemTagManager = $this->createMock(ISystemTagManager::class); |
||||
$this->command = $this->getMockBuilder(ListCommand::class) |
||||
->setConstructorArgs([$this->systemTagManager]) |
||||
->setMethods(['writeArrayInOutputFormat']) |
||||
->getMock(); |
||||
|
||||
$this->input = $this->createMock(InputInterface::class); |
||||
$this->output = $this->createMock(OutputInterface::class); |
||||
} |
||||
|
||||
public function testExecute() { |
||||
$tag1 = $this->createMock(ISystemTag::class); |
||||
$tag1->method('getId')->willReturn('1'); |
||||
$tag1->method('getName')->willReturn('public_tag'); |
||||
$tag1->method('getAccessLevel')->willReturn(ISystemTag::ACCESS_LEVEL_PUBLIC); |
||||
$tag2 = $this->createMock(ISystemTag::class); |
||||
$tag2->method('getId')->willReturn('2'); |
||||
$tag2->method('getName')->willReturn('restricted_tag'); |
||||
$tag2->method('getAccessLevel')->willReturn(ISystemTag::ACCESS_LEVEL_RESTRICTED); |
||||
$tag3 = $this->createMock(ISystemTag::class); |
||||
$tag3->method('getId')->willReturn('3'); |
||||
$tag3->method('getName')->willReturn('invisible_tag'); |
||||
$tag3->method('getAccessLevel')->willReturn(ISystemTag::ACCESS_LEVEL_INVISIBLE); |
||||
|
||||
$this->systemTagManager->method('getAllTags') |
||||
->with( |
||||
null, |
||||
null |
||||
)->willReturn([$tag1, $tag2, $tag3]); |
||||
|
||||
$this->input->method('getOption') |
||||
->willReturnCallback(function ($arg) { |
||||
if ($arg === 'visibilityFilter') { |
||||
return null; |
||||
} elseif ($arg === 'nameSearchPattern') { |
||||
return null; |
||||
} |
||||
throw new \Exception(); |
||||
}); |
||||
|
||||
$this->command->expects($this->once()) |
||||
->method('writeArrayInOutputFormat') |
||||
->with( |
||||
$this->equalTo($this->input), |
||||
$this->equalTo($this->output), |
||||
[ |
||||
'1' => [ |
||||
'name' => 'public_tag', |
||||
'access' => 'public', |
||||
], |
||||
'2' => [ |
||||
'name' => 'restricted_tag', |
||||
'access' => 'restricted', |
||||
], |
||||
'3' => [ |
||||
'name' => 'invisible_tag', |
||||
'access' => 'invisible', |
||||
] |
||||
] |
||||
); |
||||
|
||||
$this->invokePrivate($this->command, 'execute', [$this->input, $this->output]); |
||||
} |
||||
} |
||||
Loading…
Reference in new issue