diff --git a/lib/Event/FTSEvent.php b/lib/Event/FTSEvent.php new file mode 100644 index 000000000..c00077d22 --- /dev/null +++ b/lib/Event/FTSEvent.php @@ -0,0 +1,55 @@ + + * + * @author Julius Härtl + * + * @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 . + * + */ + +namespace OCA\Deck\Event; + + +use OCP\EventDispatcher\Event; +use Symfony\Component\EventDispatcher\GenericEvent; + +/** + * This is a class to keep compatibility for currently used events in full text search integration + */ +class FTSEvent extends Event { + + /** + * @var array + */ + private $arguments; + + public function __construct($subject, $arguments = []) { + parent::__construct(); + + $this->arguments = $arguments; + } + + public function getArgument($key) + { + if ($this->hasArgument($key)) { + return $this->arguments[$key]; + } + + throw new \InvalidArgumentException(sprintf('Argument "%s" not found.', $key)); + } + +} diff --git a/tests/integration/database/AssignedUsersMapperTest.php b/tests/integration/database/AssignedUsersMapperTest.php index b5d86fee9..58ff07e6b 100644 --- a/tests/integration/database/AssignedUsersMapperTest.php +++ b/tests/integration/database/AssignedUsersMapperTest.php @@ -23,21 +23,22 @@ namespace OCA\Deck\Db; +use OCA\Deck\Service\AssignmentService; use OCA\Deck\Service\BoardService; use OCA\Deck\Service\StackService; use OCA\Deck\Service\CardService; -use OCP\IDBConnection; /** * @group DB * @coversDefaultClass OCA\Deck\Db\AssignedUsersMapper */ class AssignedUsersMapperTest extends \Test\TestCase { - const TEST_USER1 = "test-share-user1"; - const TEST_USER2 = "test-share-user2"; - const TEST_USER3 = "test-share-user3"; - const TEST_USER4 = "test-share-user4"; - const TEST_GROUP1 = "test-share-group1"; + + private const TEST_USER1 = 'test-share-user1'; + private const TEST_USER3 = 'test-share-user3'; + private const TEST_USER2 = 'test-share-user2'; + private const TEST_USER4 = 'test-share-user4'; + private const TEST_GROUP1 = 'test-share-group1'; /** @var BoardService */ protected $boardService; @@ -45,8 +46,10 @@ class AssignedUsersMapperTest extends \Test\TestCase { protected $cardService; /** @var StackService */ protected $stackService; - /** @var \OCA\Deck\Db\AssignedUsersMapper */ + /** @var AssignedUsersMapper */ protected $assignedUsersMapper; + /** @var AssignmentService */ + private $assignmentService; public static function setUpBeforeClass(): void { parent::setUpBeforeClass(); @@ -78,10 +81,11 @@ class AssignedUsersMapperTest extends \Test\TestCase { public function setUp(): void { parent::setUp(); \OC::$server->getUserSession()->login(self::TEST_USER1, self::TEST_USER1); - $this->boardService = \OC::$server->query("\OCA\Deck\Service\BoardService"); - $this->stackService = \OC::$server->query("\OCA\Deck\Service\StackService"); - $this->cardService = \OC::$server->query("\OCA\Deck\Service\CardService"); - $this->assignedUsersMapper = \OC::$server->query(\OCA\Deck\Db\AssignedUsersMapper::class); + $this->boardService = \OC::$server->query(BoardService::class); + $this->stackService = \OC::$server->query(StackService::class); + $this->cardService = \OC::$server->query(CardService::class); + $this->assignmentService = \OC::$server->query(AssignmentService::class); + $this->assignedUsersMapper = \OC::$server->query(AssignedUsersMapper::class); $this->createBoardWithExampleData(); } @@ -107,8 +111,8 @@ class AssignedUsersMapperTest extends \Test\TestCase { */ public function testFind() { $uids = []; - $this->cardService->assignUser($this->cards[0]->getId(), self::TEST_USER1); - $this->cardService->assignUser($this->cards[0]->getId(), self::TEST_USER2); + $this->assignmentService->assignUser($this->cards[0]->getId(), self::TEST_USER1); + $this->assignmentService->assignUser($this->cards[0]->getId(), self::TEST_USER2); $assignedUsers = $this->assignedUsersMapper->find($this->cards[0]->getId()); foreach ($assignedUsers as $user) { @@ -119,8 +123,8 @@ class AssignedUsersMapperTest extends \Test\TestCase { $this->assertArrayNotHasKey(self::TEST_USER3, $uids); $this->assertArrayNotHasKey(self::TEST_USER4, $uids); - $this->cardService->unassignUser($this->cards[0]->getId(), self::TEST_USER1); - $this->cardService->unassignUser($this->cards[0]->getId(), self::TEST_USER2); + $this->assignmentService->unassignUser($this->cards[0]->getId(), self::TEST_USER1); + $this->assignmentService->unassignUser($this->cards[0]->getId(), self::TEST_USER2); } /** @@ -145,6 +149,7 @@ class AssignedUsersMapperTest extends \Test\TestCase { $assignment = new AssignedUsers(); $assignment->setCardId($this->cards[1]->getId()); $assignment->setParticipant(self::TEST_USER4); + $assignment->setType(AssignedUsers::TYPE_USER); $this->assignedUsersMapper->insert($assignment); $actual = $this->assignedUsersMapper->find($this->cards[1]->getId()); @@ -160,6 +165,7 @@ class AssignedUsersMapperTest extends \Test\TestCase { $assignment = new AssignedUsers(); $assignment->setCardId($this->cards[1]->getId()); $assignment->setParticipant('invalid-username'); + $assignment->setType(AssignedUsers::TYPE_USER); $actual = $this->assignedUsersMapper->insert($assignment); $this->assertNull($actual); } @@ -171,12 +177,14 @@ class AssignedUsersMapperTest extends \Test\TestCase { $assignment = new AssignedUsers(); $assignment->setCardId($this->cards[1]->getId()); $assignment->setParticipant(self::TEST_USER4); + $assignment->setType(AssignedUsers::TYPE_USER); $this->assignedUsersMapper->mapParticipant($assignment); $this->assertInstanceOf(User::class, $assignment->resolveParticipant()); $assignment = new AssignedUsers(); $assignment->setCardId($this->cards[1]->getId()); $assignment->setParticipant('invalid-username'); + $assignment->setType(AssignedUsers::TYPE_USER); $this->assignedUsersMapper->mapParticipant($assignment); $this->assertEquals('invalid-username', $assignment->resolveParticipant()); } diff --git a/tests/unit/Service/AssignmentServiceTest.php b/tests/unit/Service/AssignmentServiceTest.php new file mode 100644 index 000000000..033b83b6a --- /dev/null +++ b/tests/unit/Service/AssignmentServiceTest.php @@ -0,0 +1,236 @@ + + * + * @author Julius Härtl + * + * @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 . + * + */ + +namespace OCA\Deck\Service; + + +use OCA\Deck\Activity\ActivityManager; +use OCA\Deck\BadRequestException; +use OCA\Deck\Db\AclMapper; +use OCA\Deck\Db\AssignedUsers; +use OCA\Deck\Db\AssignedUsersMapper; +use OCA\Deck\Db\Card; +use OCA\Deck\Db\CardMapper; +use OCA\Deck\Db\ChangeHelper; +use OCA\Deck\Db\StackMapper; +use OCA\Deck\Db\BoardMapper; +use OCA\Deck\Db\LabelMapper; +use OCA\Deck\NotFoundException; +use OCA\Deck\Notification\NotificationHelper; +use OCA\Deck\StatusException; +use OCP\Activity\IEvent; +use OCP\Comments\ICommentsManager; +use OCP\EventDispatcher\ABroadcastedEvent; +use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IEventDispatcher; +use OCP\IUser; +use OCP\IUserManager; +use PHPUnit\Framework\MockObject\MockObject; +use Symfony\Component\EventDispatcher\EventDispatcherInterface; +use Test\TestCase; + +class AssignmentServiceTest extends TestCase { + + + /** + * @var MockObject|PermissionService + */ + private $permissionService; + /** + * @var MockObject|CardMapper + */ + private $cardMapper; + /** + * @var MockObject|AssignedUsersMapper + */ + private $assignedUsersMapper; + /** + * @var MockObject|AclMapper + */ + private $aclMapper; + /** + * @var MockObject|NotificationHelper + */ + private $notificationHelper; + /** + * @var MockObject|ChangeHelper + */ + private $changeHelper; + /** + * @var MockObject|ActivityManager + */ + private $activityManager; + /** + * @var MockObject|IEventDispatcher + */ + private $eventDispatcher; + /** + * @var AssignmentService + */ + private $assignmentService; + + public function setUp(): void { + parent::setUp(); + $this->aclMapper = $this->createMock(AclMapper::class); + $this->permissionService = $this->createMock(PermissionService::class); + $this->cardMapper = $this->createMock(CardMapper::class); + $this->notificationHelper = $this->createMock(NotificationHelper::class); + $this->assignedUsersMapper = $this->createMock(AssignedUsersMapper::class); + $this->activityManager = $this->createMock(ActivityManager::class); + $this->eventDispatcher = $this->createMock(IEventDispatcher::class); + $this->changeHelper = $this->createMock(ChangeHelper::class); + $this->assignmentService = new AssignmentService( + $this->permissionService, + $this->cardMapper, + $this->assignedUsersMapper, + $this->aclMapper, + $this->notificationHelper, + $this->activityManager, + $this->changeHelper, + $this->eventDispatcher, + 'admin' + ); + } + + public function mockActivity($type, $object, $subject) { + // ActivityManager::DECK_OBJECT_BOARD, $newAcl, ActivityManager::SUBJECT_BOARD_SHARE + $event = $this->createMock(IEvent::class); + $this->activityManager->expects($this->once()) + ->method('createEvent') + ->with($type, $object, $subject) + ->willReturn($event); + $this->activityManager->expects($this->once()) + ->method('sendToUsers') + ->with($event); + } + + public function testAssignUser() { + $assignments = []; + $this->assignedUsersMapper->expects($this->once()) + ->method('find') + ->with(123) + ->willReturn($assignments); + $assignment = new AssignedUsers(); + $assignment->setCardId(123); + $assignment->setParticipant('admin'); + $assignment->setType(AssignedUsers::TYPE_USER); + $this->cardMapper->expects($this->once()) + ->method('findBoardId') + ->willReturn(1); + $this->permissionService->expects($this->once()) + ->method('findUsers') + ->with(1) + ->willReturn(['admin' => 'admin', 'user1' => 'user1']); + $this->aclMapper->expects($this->once()) + ->method('findAll') + ->willReturn([]); + $this->assignedUsersMapper->expects($this->once()) + ->method('insert') + ->with($assignment) + ->willReturn($assignment); + $actual = $this->assignmentService->assignUser(123, 'admin'); + $this->assertEquals($assignment, $actual); + } + + public function testAssignUserNoParticipant() { + $this->expectException(BadRequestException::class); + $this->expectExceptionMessage('The user is not part of the board'); + $assignments = []; + $this->assignedUsersMapper->expects($this->once()) + ->method('find') + ->with(123) + ->willReturn($assignments); + $assignment = new AssignedUsers(); + $assignment->setCardId(123); + $assignment->setParticipant('admin'); + $assignment->setType(AssignedUsers::TYPE_USER); + $this->cardMapper->expects($this->once()) + ->method('findBoardId') + ->willReturn(1); + $this->permissionService->expects($this->once()) + ->method('findUsers') + ->with(1) + ->willReturn(['user2' => 'user2', 'user1' => 'user1']); + $this->aclMapper->expects($this->once()) + ->method('findAll') + ->willReturn([]); + $actual = $this->assignmentService->assignUser(123, 'admin'); + } + + public function testAssignUserExisting() { + $this->expectException(BadRequestException::class); + $this->expectExceptionMessage('The user is already assigned to the card'); + $assignment = new AssignedUsers(); + $assignment->setCardId(123); + $assignment->setParticipant('admin'); + $assignment->setType(AssignedUsers::TYPE_USER); + $assignments = [ + $assignment + ]; + $this->assignedUsersMapper->expects($this->once()) + ->method('find') + ->with(123) + ->willReturn($assignments); + $actual = $this->assignmentService->assignUser(123, 'admin'); + $this->assertFalse($actual); + } + + public function testUnassignUserExisting() { + $assignment = new AssignedUsers(); + $assignment->setCardId(123); + $assignment->setParticipant('admin'); + $assignment->setType(AssignedUsers::TYPE_USER); + $assignments = [ + $assignment + ]; + $this->assignedUsersMapper->expects($this->once()) + ->method('find') + ->with(123) + ->willReturn($assignments); + $this->assignedUsersMapper->expects($this->once()) + ->method('delete') + ->with($assignment) + ->willReturn($assignment); + $actual = $this->assignmentService->unassignUser(123, 'admin'); + $this->assertEquals($assignment, $actual); + } + + public function testUnassignUserNotExisting() { + $this->expectException(NotFoundException::class); + $assignment = new AssignedUsers(); + $assignment->setCardId(123); + $assignment->setParticipant('admin'); + $assignment->setType(AssignedUsers::TYPE_USER); + $assignments = [ + $assignment + ]; + $this->assignedUsersMapper->expects($this->once()) + ->method('find') + ->with(123) + ->willReturn($assignments); + $this->expectException(NotFoundException::class); + $actual = $this->assignmentService->unassignUser(123, 'user'); + } + + +} diff --git a/tests/unit/controller/CardControllerTest.php b/tests/unit/controller/CardControllerTest.php index 5ecf23893..53f73ff25 100644 --- a/tests/unit/controller/CardControllerTest.php +++ b/tests/unit/controller/CardControllerTest.php @@ -23,34 +23,35 @@ namespace OCA\Deck\Controller; +use OCA\Deck\Service\AssignmentService; use OCA\Deck\Service\CardService; -use OCP\AppFramework\Controller; use OCP\IRequest; +use PHPUnit\Framework\MockObject\MockObject; +use Test\TestCase; -class CardControllerTest extends \Test\TestCase { +class CardControllerTest extends TestCase { - /** @var CardController|\PHPUnit\Framework\MockObject\MockObject */ + /** @var CardController|MockObject */ private $controller; - /** @var IRequest|\PHPUnit\Framework\MockObject\MockObject */ + /** @var IRequest|MockObject */ private $request; - /** @var CardService|\PHPUnit\Framework\MockObject\MockObject */ + /** @var CardService|MockObject */ private $cardService; + /** @var AssignmentService|MockObject */ + private $assignmentService; /** @var string */ private $userId = 'user'; + public function setUp(): void { - $this->request = $this->getMockBuilder( - '\OCP\IRequest') - ->disableOriginalConstructor() - ->getMock(); - $this->cardService = $this->getMockBuilder( - '\OCA\Deck\Service\CardService') - ->disableOriginalConstructor() - ->getMock(); + $this->request = $this->createMock(IRequest::class); + $this->cardService = $this->createMock(CardService::class); + $this->assignmentService = $this->createMock(AssignmentService::class); $this->controller = new CardController( 'deck', $this->request, $this->cardService, + $this->assignmentService, $this->userId ); } @@ -115,12 +116,12 @@ class CardControllerTest extends \Test\TestCase { } public function testAssignUser() { - $this->cardService->expects($this->once())->method('assignUser'); + $this->assignmentService->expects($this->once())->method('assignUser'); $this->controller->assignUser(1, 'admin'); } public function testUnssignUser() { - $this->cardService->expects($this->once())->method('unassignUser'); + $this->assignmentService->expects($this->once())->method('unassignUser'); $this->controller->unassignUser(1, 'admin'); }