Add occ command 'dav:delete-calendar' to delete a user's calendar. Signed-off-by: Mattia Narducci <mattianarducci1@gmail.com>pull/26421/head
parent
4fc002a3a5
commit
4850dae1df
@ -0,0 +1,137 @@ |
||||
<?php |
||||
|
||||
declare(strict_types=1); |
||||
/** |
||||
* |
||||
* @copyright Copyright (c) 2021, Mattia Narducci (mattianarducci1@gmail.com) |
||||
* |
||||
* @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 <https://www.gnu.org/licenses/>. |
||||
* |
||||
*/ |
||||
|
||||
namespace OCA\DAV\Command; |
||||
|
||||
use OCA\DAV\CalDAV\BirthdayService; |
||||
use OCA\DAV\CalDAV\CalDavBackend; |
||||
use OCA\DAV\CalDAV\Calendar; |
||||
use OCP\IConfig; |
||||
use OCP\IL10N; |
||||
use OCP\IUserManager; |
||||
use Symfony\Component\Console\Command\Command; |
||||
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 DeleteCalendar extends Command { |
||||
/** @var CalDavBackend */ |
||||
private $calDav; |
||||
|
||||
/** @var IConfig */ |
||||
private $config; |
||||
|
||||
/** @var IL10N */ |
||||
private $l10n; |
||||
|
||||
/** @var IUserManager */ |
||||
private $userManager; |
||||
|
||||
/** |
||||
* @param CalDavBackend $calDav |
||||
* @param IConfig $config |
||||
* @param IL10N $l10n |
||||
* @param IUserManager $userManager |
||||
*/ |
||||
public function __construct( |
||||
CalDavBackend $calDav, |
||||
IConfig $config, |
||||
IL10N $l10n, |
||||
IUserManager $userManager |
||||
) { |
||||
parent::__construct(); |
||||
$this->calDav = $calDav; |
||||
$this->config = $config; |
||||
$this->l10n = $l10n; |
||||
$this->userManager = $userManager; |
||||
} |
||||
|
||||
protected function configure(): void { |
||||
$this |
||||
->setName('dav:delete-calendar') |
||||
->setDescription('Delete a dav calendar') |
||||
->addArgument('uid', |
||||
InputArgument::REQUIRED, |
||||
'User who owns the calendar') |
||||
->addArgument('name', |
||||
InputArgument::OPTIONAL, |
||||
'Name of the calendar to delete') |
||||
->addOption('birthday', |
||||
null, |
||||
InputOption::VALUE_NONE, |
||||
'Delete the birthday calendar') |
||||
->addOption('force', |
||||
'f', |
||||
InputOption::VALUE_NONE, |
||||
'Force delete skipping trashbin'); |
||||
} |
||||
|
||||
protected function execute( |
||||
InputInterface $input, |
||||
OutputInterface $output |
||||
): int { |
||||
/** @var string $user **/ |
||||
$user = $input->getArgument('uid'); |
||||
if (!$this->userManager->userExists($user)) { |
||||
throw new \InvalidArgumentException( |
||||
'User <' . $user . '> is unknown.'); |
||||
} |
||||
|
||||
$birthday = $input->getOption('birthday'); |
||||
if ($birthday !== false) { |
||||
$name = BirthdayService::BIRTHDAY_CALENDAR_URI; |
||||
} else { |
||||
/** @var string $name **/ |
||||
$name = $input->getArgument('name'); |
||||
if (!$name) { |
||||
throw new \InvalidArgumentException( |
||||
'Please specify a calendar name or --birthday'); |
||||
} |
||||
} |
||||
|
||||
$calendarInfo = $this->calDav->getCalendarByUri( |
||||
'principals/users/' . $user, |
||||
$name); |
||||
if ($calendarInfo === null) { |
||||
throw new \InvalidArgumentException( |
||||
'User <' . $user . '> has no calendar named <' . $name . '>. You can run occ dav:list-calendars to list calendars URIs for this user.'); |
||||
} |
||||
|
||||
$calendar = new Calendar( |
||||
$this->calDav, |
||||
$calendarInfo, |
||||
$this->l10n, |
||||
$this->config); |
||||
|
||||
$force = $input->getOption('force'); |
||||
if ($force) { |
||||
$calendar->disableTrashbin(); |
||||
} |
||||
|
||||
$calendar->delete(); |
||||
|
||||
return 0; |
||||
} |
||||
} |
||||
@ -0,0 +1,250 @@ |
||||
<?php |
||||
|
||||
declare(strict_types=1); |
||||
/** |
||||
* |
||||
* @copyright Copyright (c) 2021, Mattia Narducci (mattianarducci1@gmail.com) |
||||
* |
||||
* @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 <https://www.gnu.org/licenses/>. |
||||
* |
||||
*/ |
||||
|
||||
namespace OCA\DAV\Tests\Command; |
||||
|
||||
use OCA\DAV\CalDAV\BirthdayService; |
||||
use OCA\DAV\CalDav\CalDavBackend; |
||||
use OCA\DAV\Command\DeleteCalendar; |
||||
use OCP\IConfig; |
||||
use OCP\IL10N; |
||||
use OCP\IUserManager; |
||||
use PHPUnit\Framework\MockObject\MockObject; |
||||
use Symfony\Component\Console\Tester\CommandTester; |
||||
use Test\TestCase; |
||||
|
||||
/** |
||||
* Class DeleteCalendarTest |
||||
* |
||||
* @package OCA\DAV\Tests\Command |
||||
*/ |
||||
class DeleteCalendarTest extends TestCase { |
||||
public const USER = 'user'; |
||||
public const NAME = 'calendar'; |
||||
|
||||
/** @var CalDavBackend|MockObject */ |
||||
private $calDav; |
||||
|
||||
/** @var IConfig|MockObject */ |
||||
private $config; |
||||
|
||||
/** @var IL10N|MockObject */ |
||||
private $l10n; |
||||
|
||||
/** @var IUserManager|MockObject */ |
||||
private $userManager; |
||||
|
||||
/** @var DeleteCalendar */ |
||||
private $command; |
||||
|
||||
protected function setUp(): void { |
||||
parent::setUp(); |
||||
|
||||
$this->calDav = $this->createMock(CalDavBackend::class); |
||||
$this->config = $this->createMock(IConfig::class); |
||||
$this->l10n = $this->createMock(IL10N::class); |
||||
$this->userManager = $this->createMock(IUserManager::class); |
||||
|
||||
$this->command = new DeleteCalendar( |
||||
$this->calDav, |
||||
$this->config, |
||||
$this->l10n, |
||||
$this->userManager, |
||||
); |
||||
} |
||||
|
||||
public function testInvalidUser() { |
||||
$this->expectException(\InvalidArgumentException::class); |
||||
$this->expectExceptionMessage( |
||||
'User <' . self::USER . '> is unknown.'); |
||||
|
||||
$this->userManager->expects($this->once()) |
||||
->method('userExists') |
||||
->with(self::USER) |
||||
->willReturn(false); |
||||
|
||||
$commandTester = new CommandTester($this->command); |
||||
$commandTester->execute([ |
||||
'uid' => self::USER, |
||||
'name' => self::NAME, |
||||
]); |
||||
} |
||||
|
||||
public function testNoCalendarName() { |
||||
$this->expectException(\InvalidArgumentException::class); |
||||
$this->expectExceptionMessage( |
||||
'Please specify a calendar name or --birthday'); |
||||
|
||||
$this->userManager->expects($this->once()) |
||||
->method('userExists') |
||||
->with(self::USER) |
||||
->willReturn(true); |
||||
|
||||
$commandTester = new CommandTester($this->command); |
||||
$commandTester->execute([ |
||||
'uid' => self::USER, |
||||
]); |
||||
} |
||||
|
||||
public function testInvalidCalendar() { |
||||
$this->expectException(\InvalidArgumentException::class); |
||||
$this->expectExceptionMessage( |
||||
'User <' . self::USER . '> has no calendar named <' . self::NAME . '>.'); |
||||
|
||||
$this->userManager->expects($this->once()) |
||||
->method('userExists') |
||||
->with(self::USER) |
||||
->willReturn(true); |
||||
$this->calDav->expects($this->once()) |
||||
->method('getCalendarByUri') |
||||
->with( |
||||
'principals/users/' . self::USER, |
||||
self::NAME |
||||
) |
||||
->willReturn(null); |
||||
|
||||
$commandTester = new CommandTester($this->command); |
||||
$commandTester->execute([ |
||||
'uid' => self::USER, |
||||
'name' => self::NAME, |
||||
]); |
||||
} |
||||
|
||||
public function testDelete() { |
||||
$id = 1234; |
||||
$calendar = [ |
||||
'id' => $id, |
||||
'principaluri' => 'principals/users/' . self::USER, |
||||
'uri' => self::NAME |
||||
]; |
||||
|
||||
$this->userManager->expects($this->once()) |
||||
->method('userExists') |
||||
->with(self::USER) |
||||
->willReturn(true); |
||||
$this->calDav->expects($this->once()) |
||||
->method('getCalendarByUri') |
||||
->with( |
||||
'principals/users/' . self::USER, |
||||
self::NAME |
||||
) |
||||
->willReturn($calendar); |
||||
$this->calDav->expects($this->once()) |
||||
->method('deleteCalendar') |
||||
->with($id, false); |
||||
|
||||
$commandTester = new CommandTester($this->command); |
||||
$commandTester->execute([ |
||||
'uid' => self::USER, |
||||
'name' => self::NAME, |
||||
]); |
||||
} |
||||
|
||||
public function testForceDelete() { |
||||
$id = 1234; |
||||
$calendar = [ |
||||
'id' => $id, |
||||
'principaluri' => 'principals/users/' . self::USER, |
||||
'uri' => self::NAME |
||||
]; |
||||
|
||||
$this->userManager->expects($this->once()) |
||||
->method('userExists') |
||||
->with(self::USER) |
||||
->willReturn(true); |
||||
$this->calDav->expects($this->once()) |
||||
->method('getCalendarByUri') |
||||
->with( |
||||
'principals/users/' . self::USER, |
||||
self::NAME |
||||
) |
||||
->willReturn($calendar); |
||||
$this->calDav->expects($this->once()) |
||||
->method('deleteCalendar') |
||||
->with($id, true); |
||||
|
||||
$commandTester = new CommandTester($this->command); |
||||
$commandTester->execute([ |
||||
'uid' => self::USER, |
||||
'name' => self::NAME, |
||||
'-f' => true |
||||
]); |
||||
} |
||||
|
||||
public function testDeleteBirthday() { |
||||
$id = 1234; |
||||
$calendar = [ |
||||
'id' => $id, |
||||
'principaluri' => 'principals/users/' . self::USER, |
||||
'uri' => BirthdayService::BIRTHDAY_CALENDAR_URI |
||||
]; |
||||
|
||||
$this->userManager->expects($this->once()) |
||||
->method('userExists') |
||||
->with(self::USER) |
||||
->willReturn(true); |
||||
$this->calDav->expects($this->once()) |
||||
->method('getCalendarByUri') |
||||
->with( |
||||
'principals/users/' . self::USER, |
||||
BirthdayService::BIRTHDAY_CALENDAR_URI |
||||
) |
||||
->willReturn($calendar); |
||||
$this->calDav->expects($this->once()) |
||||
->method('deleteCalendar') |
||||
->with($id); |
||||
|
||||
$commandTester = new CommandTester($this->command); |
||||
$commandTester->execute([ |
||||
'uid' => self::USER, |
||||
'--birthday' => true, |
||||
]); |
||||
} |
||||
|
||||
public function testBirthdayHasPrecedence() { |
||||
$calendar = [ |
||||
'id' => 1234, |
||||
'principaluri' => 'principals/users/' . self::USER, |
||||
'uri' => BirthdayService::BIRTHDAY_CALENDAR_URI |
||||
]; |
||||
$this->userManager->expects($this->once()) |
||||
->method('userExists') |
||||
->with(self::USER) |
||||
->willReturn(true); |
||||
$this->calDav->expects($this->once()) |
||||
->method('getCalendarByUri') |
||||
->with( |
||||
'principals/users/' . self::USER, |
||||
BirthdayService::BIRTHDAY_CALENDAR_URI |
||||
) |
||||
->willReturn($calendar); |
||||
|
||||
$commandTester = new CommandTester($this->command); |
||||
$commandTester->execute([ |
||||
'uid' => self::USER, |
||||
'name' => self::NAME, |
||||
'--birthday' => true, |
||||
]); |
||||
} |
||||
} |
||||
Loading…
Reference in new issue