diff --git a/lib/SP/Domain/Account/Services/AccountAcl.php b/lib/SP/Domain/Account/Services/AccountAcl.php index b24df945..0bf17e16 100644 --- a/lib/SP/Domain/Account/Services/AccountAcl.php +++ b/lib/SP/Domain/Account/Services/AccountAcl.php @@ -38,7 +38,7 @@ use SP\Domain\Core\Exceptions\ConstraintException; use SP\Domain\Core\Exceptions\QueryException; use SP\Domain\Storage\Ports\FileCacheService; use SP\Domain\User\Dtos\UserDataDto; -use SP\Domain\User\Ports\UserToUserGroupServiceInterface; +use SP\Domain\User\Ports\UserToUserGroupService; use SP\Infrastructure\File\FileException; use function SP\processException; @@ -60,10 +60,10 @@ final class AccountAcl extends Service implements AccountAclService private UserDataDto $userData; public function __construct( - Application $application, - private readonly AclInterface $acl, - private readonly UserToUserGroupServiceInterface $userToUserGroupService, - private readonly ?FileCacheService $fileCache = null + Application $application, + private readonly AclInterface $acl, + private readonly UserToUserGroupService $userToUserGroupService, + private readonly ?FileCacheService $fileCache = null ) { parent::__construct($application); diff --git a/lib/SP/Domain/Tag/Ports/TagService.php b/lib/SP/Domain/Tag/Ports/TagService.php index 2ad892e2..5f5cb443 100644 --- a/lib/SP/Domain/Tag/Ports/TagService.php +++ b/lib/SP/Domain/Tag/Ports/TagService.php @@ -28,7 +28,7 @@ use SP\DataModel\ItemSearchData; use SP\Domain\Core\Exceptions\ConstraintException; use SP\Domain\Core\Exceptions\QueryException; use SP\Domain\Core\Exceptions\SPException; -use SP\Domain\Tag\Models\Tag; +use SP\Domain\Tag\Models\Tag as TagModel; use SP\Infrastructure\Common\Repositories\DuplicatedItemException; use SP\Infrastructure\Common\Repositories\NoSuchItemException; use SP\Infrastructure\Database\QueryResult; @@ -41,6 +41,7 @@ use SP\Infrastructure\Database\QueryResult; interface TagService { /** + * @return QueryResult * @throws ConstraintException * @throws QueryException */ @@ -51,14 +52,14 @@ interface TagService * @throws QueryException * @throws NoSuchItemException */ - public function getById(int $id): Tag; + public function getById(int $id): TagModel; /** * @throws NoSuchItemException * @throws ConstraintException * @throws QueryException */ - public function getByName(string $name): ?Tag; + public function getByName(string $name): ?TagModel; /** * @throws ConstraintException @@ -68,30 +69,30 @@ interface TagService public function delete(int $id): TagService; /** - * @param int[] $ids + * @param int[] $ids * * @throws SPException */ - public function deleteByIdBatch(array $ids): TagService; + public function deleteByIdBatch(array $ids): void; /** * @throws ConstraintException * @throws QueryException * @throws DuplicatedItemException */ - public function create(Tag $itemData): int; + public function create(TagModel $tag): int; /** * @throws SPException * @throws ConstraintException * @throws QueryException */ - public function update(Tag $itemData): int; + public function update(TagModel $tag): int; /** * Get all items from the service's repository * - * @return Tag[] + * @return array * @throws ConstraintException * @throws QueryException */ diff --git a/lib/SP/Domain/Tag/Services/Tag.php b/lib/SP/Domain/Tag/Services/Tag.php index e3bbc330..4722ee8c 100644 --- a/lib/SP/Domain/Tag/Services/Tag.php +++ b/lib/SP/Domain/Tag/Services/Tag.php @@ -42,8 +42,6 @@ use function SP\__u; /** * Class Tag - * - * @template T of TagModel */ final class Tag extends Service implements TagService { @@ -55,7 +53,7 @@ final class Tag extends Service implements TagService /** * @param ItemSearchData $itemSearchData - * @return QueryResult + * @return QueryResult */ public function search(ItemSearchData $itemSearchData): QueryResult { @@ -113,13 +111,11 @@ final class Tag extends Service implements TagService * * @throws SPException */ - public function deleteByIdBatch(array $ids): TagService + public function deleteByIdBatch(array $ids): void { - if ($this->tagRepository->deleteByIdBatch($ids) !== count($ids)) { + if ($this->tagRepository->deleteByIdBatch($ids)->getAffectedNumRows() !== count($ids)) { throw ServiceException::warning(__u('Error while removing the tags')); } - - return $this; } /** @@ -127,9 +123,9 @@ final class Tag extends Service implements TagService * @throws QueryException * @throws DuplicatedItemException */ - public function create(TagModel $itemData): int + public function create(TagModel $tag): int { - return $this->tagRepository->create($itemData)->getLastId(); + return $this->tagRepository->create($tag)->getLastId(); } /** @@ -137,15 +133,15 @@ final class Tag extends Service implements TagService * @throws ConstraintException * @throws QueryException */ - public function update(TagModel $itemData): int + public function update(TagModel $tag): int { - return $this->tagRepository->update($itemData); + return $this->tagRepository->update($tag); } /** * Get all items from the service's repository * - * @return array + * @return array */ public function getAll(): array { diff --git a/lib/SP/Domain/User/Ports/UserToUserGroupServiceInterface.php b/lib/SP/Domain/User/Ports/UserToUserGroupService.php similarity index 74% rename from lib/SP/Domain/User/Ports/UserToUserGroupServiceInterface.php rename to lib/SP/Domain/User/Ports/UserToUserGroupService.php index 876ad5e4..ab2484a3 100644 --- a/lib/SP/Domain/User/Ports/UserToUserGroupServiceInterface.php +++ b/lib/SP/Domain/User/Ports/UserToUserGroupService.php @@ -4,7 +4,7 @@ * * @author nuxsmin * @link https://syspass.org - * @copyright 2012-2022, Rubén Domínguez nuxsmin@$syspass.org + * @copyright 2012-2024, Rubén Domínguez nuxsmin@$syspass.org * * This file is part of sysPass. * @@ -26,14 +26,13 @@ namespace SP\Domain\User\Ports; use SP\Domain\Core\Exceptions\ConstraintException; use SP\Domain\Core\Exceptions\QueryException; -use SP\Infrastructure\Common\Repositories\NoSuchItemException; /** * Class UserToUserGroupService * * @package SP\Domain\Common\Services\UserGroup */ -interface UserToUserGroupServiceInterface +interface UserToUserGroupService { /** * @throws ConstraintException @@ -53,21 +52,6 @@ interface UserToUserGroupServiceInterface */ public function getUsersByGroupId(int $id): array; - /** - * @throws ConstraintException - * @throws QueryException - * @throws NoSuchItemException - */ - public function getById(int $id): array; - - /** - * Checks whether the user is included in the group - * - * @throws ConstraintException - * @throws QueryException - */ - public function checkUserInGroup(int $groupId, int $userId): bool; - /** * Returns the groups which the user belongs to * diff --git a/lib/SP/Domain/User/Services/UserGroup.php b/lib/SP/Domain/User/Services/UserGroup.php index 575edc64..c7f6853b 100644 --- a/lib/SP/Domain/User/Services/UserGroup.php +++ b/lib/SP/Domain/User/Services/UserGroup.php @@ -33,7 +33,7 @@ use SP\Domain\Core\Exceptions\QueryException; use SP\Domain\User\Models\UserGroup as UserGroupModel; use SP\Domain\User\Ports\UserGroupRepository; use SP\Domain\User\Ports\UserGroupService; -use SP\Domain\User\Ports\UserToUserGroupServiceInterface; +use SP\Domain\User\Ports\UserToUserGroupService; use SP\Infrastructure\Common\Repositories\NoSuchItemException; use SP\Infrastructure\Database\QueryResult; @@ -47,9 +47,9 @@ use function SP\__u; final class UserGroup extends Service implements UserGroupService { public function __construct( - Application $application, - private readonly UserGroupRepository $userGroupRepository, - private readonly UserToUserGroupServiceInterface $userToUserGroupService, + Application $application, + private readonly UserGroupRepository $userGroupRepository, + private readonly UserToUserGroupService $userToUserGroupService, ) { parent::__construct($application); } diff --git a/lib/SP/Domain/User/Services/UserToUserGroup.php b/lib/SP/Domain/User/Services/UserToUserGroup.php new file mode 100644 index 00000000..14cb8e1e --- /dev/null +++ b/lib/SP/Domain/User/Services/UserToUserGroup.php @@ -0,0 +1,96 @@ +. + */ + +namespace SP\Domain\User\Services; + +use SP\Core\Application; +use SP\Domain\Common\Services\Service; +use SP\Domain\Core\Exceptions\ConstraintException; +use SP\Domain\Core\Exceptions\QueryException; +use SP\Domain\User\Models\UserToUserGroup as UserToUserGroupModel; +use SP\Domain\User\Ports\UserToUserGroupRepository; +use SP\Domain\User\Ports\UserToUserGroupService; + +/** + * Class UserToUserGroup + */ +final class UserToUserGroup extends Service implements UserToUserGroupService +{ + + public function __construct( + Application $application, + private readonly UserToUserGroupRepository $userToUserGroupRepository + ) { + parent::__construct($application); + } + + /** + * @throws ConstraintException + * @throws QueryException + */ + public function add(int $id, array $users): int + { + return $this->userToUserGroupRepository->add($id, $users)->getLastId(); + } + + /** + * @throws ConstraintException + * @throws QueryException + */ + public function update(int $id, array $users): int + { + if (count($users) === 0) { + return $this->userToUserGroupRepository->delete($id)->getAffectedNumRows(); + } + + return $this->userToUserGroupRepository->update($id, $users)->getAffectedNumRows(); + } + + /** + * @param int $id + * @return array + */ + public function getUsersByGroupId(int $id): array + { + return array_map( + static fn(UserToUserGroupModel $userToUserGroup) => $userToUserGroup->getUserId(), + $this->userToUserGroupRepository + ->getById($id) + ->getDataAsArray(UserToUserGroupModel::class) + ); + } + + /** + * Returns the groups which the user belongs to + * + * @param int $userId + * @return array + */ + public function getGroupsForUser(int $userId): array + { + return $this->userToUserGroupRepository + ->getGroupsForUser($userId) + ->getDataAsArray(UserToUserGroupModel::class); + } +} diff --git a/lib/SP/Domain/User/Services/UserToUserGroupService.php b/lib/SP/Domain/User/Services/UserToUserGroupService.php deleted file mode 100644 index 118252b6..00000000 --- a/lib/SP/Domain/User/Services/UserToUserGroupService.php +++ /dev/null @@ -1,130 +0,0 @@ -. - */ - -namespace SP\Domain\User\Services; - -use SP\Core\Application; -use SP\Domain\Common\Services\Service; -use SP\Domain\Core\Exceptions\ConstraintException; -use SP\Domain\Core\Exceptions\QueryException; -use SP\Domain\Core\Exceptions\SPException; -use SP\Domain\User\Models\UserToUserGroup; -use SP\Domain\User\Ports\UserToUserGroupRepository; -use SP\Domain\User\Ports\UserToUserGroupServiceInterface; -use SP\Infrastructure\Common\Repositories\NoSuchItemException; - -/** - * Class UserToUserGroupService - * - * @package SP\Domain\Common\Services\UserGroup - */ -final class UserToUserGroupService extends Service implements UserToUserGroupServiceInterface -{ - protected UserToUserGroupRepository $userToUserGroupRepository; - - public function __construct(Application $application, UserToUserGroupRepository $userToUserGroupRepository) - { - parent::__construct($application); - - $this->userToUserGroupRepository = $userToUserGroupRepository; - } - - /** - * @throws ConstraintException - * @throws QueryException - */ - public function add(int $id, array $users): int - { - return $this->userToUserGroupRepository->add($id, $users); - } - - /** - * @throws ConstraintException - * @throws QueryException - */ - public function update(int $id, array $users): int - { - if (count($users) === 0) { - return $this->userToUserGroupRepository->delete($id); - } - - return $this->userToUserGroupRepository->update($id, $users); - } - - /** - * @throws ConstraintException - * @throws QueryException - */ - public function getUsersByGroupId(int $id): array - { - $usersId = []; - - /** @var \SP\Domain\User\Models\UserToUserGroup $userToUserGroupData */ - $userByGroup = $this->userToUserGroupRepository->getById($id)->getDataAsArray(); - - foreach ($userByGroup as $userToUserGroupData) { - $usersId[] = $userToUserGroupData->getUserId(); - } - - return $usersId; - } - - /** - * @throws ConstraintException - * @throws QueryException - * @throws NoSuchItemException - */ - public function getById(int $id): array - { - $result = $this->userToUserGroupRepository->getById($id); - - if ($result->getNumRows() === 0) { - throw new NoSuchItemException(__u('Group not found'), SPException::INFO); - } - - return $result->getDataAsArray(); - } - - /** - * Checks whether the user is included in the group - * - * @throws ConstraintException - * @throws QueryException - */ - public function checkUserInGroup(int $groupId, int $userId): bool - { - return $this->userToUserGroupRepository->checkUserInGroup($groupId, $userId); - } - - /** - * Returns the groups which the user belongs to - * - * @throws ConstraintException - * @throws QueryException - */ - public function getGroupsForUser(int $userId): array - { - return $this->userToUserGroupRepository->getGroupsForUser($userId)->getDataAsArray(); - } -} diff --git a/lib/SP/Infrastructure/User/Repositories/UserToUserGroup.php b/lib/SP/Infrastructure/User/Repositories/UserToUserGroup.php index 34cfae92..974f2768 100644 --- a/lib/SP/Infrastructure/User/Repositories/UserToUserGroup.php +++ b/lib/SP/Infrastructure/User/Repositories/UserToUserGroup.php @@ -69,6 +69,8 @@ final class UserToUserGroup extends BaseRepository implements UserToUserGroupRep * @param int $userId * * @return QueryResult + * @throws ConstraintException + * @throws QueryException */ public function getGroupsForUser(int $userId): QueryResult { @@ -158,6 +160,8 @@ final class UserToUserGroup extends BaseRepository implements UserToUserGroupRep * @param $id int * * @return QueryResult + * @throws ConstraintException + * @throws QueryException */ public function getById(int $id): QueryResult { diff --git a/tests/SPT/Domain/Account/Services/AccountAclTest.php b/tests/SPT/Domain/Account/Services/AccountAclTest.php index 381babd6..c7816deb 100644 --- a/tests/SPT/Domain/Account/Services/AccountAclTest.php +++ b/tests/SPT/Domain/Account/Services/AccountAclTest.php @@ -41,7 +41,7 @@ use SP\Domain\Core\Exceptions\QueryException; use SP\Domain\Storage\Ports\FileCacheService; use SP\Domain\User\Dtos\UserDataDto; use SP\Domain\User\Models\User; -use SP\Domain\User\Ports\UserToUserGroupServiceInterface; +use SP\Domain\User\Ports\UserToUserGroupService; use SP\Infrastructure\File\FileException; use SPT\Generators\UserDataGenerator; use SPT\UnitaryTestCase; @@ -67,8 +67,8 @@ class AccountAclTest extends UnitaryTestCase AclActionsInterface::ACCOUNT_DELETE, ]; private static array $accounts; - private Acl $acl; - private UserToUserGroupServiceInterface|MockObject $userToUserGroupService; + private Acl $acl; + private UserToUserGroupService|MockObject $userToUserGroupService; public static function setUpBeforeClass(): void { @@ -684,7 +684,7 @@ class AccountAclTest extends UnitaryTestCase self::$faker->unixTime ); - $userToUserGroupService = $this->createMock(UserToUserGroupServiceInterface::class); + $userToUserGroupService = $this->createMock(UserToUserGroupService::class); $userToUserGroupService->method('getGroupsForUser')->willReturn([]); $fileCache = $this->createMock(FileCacheService::class); $actions = $this->createMock(ActionsInterface::class); @@ -729,7 +729,7 @@ class AccountAclTest extends UnitaryTestCase self::$faker->unixTime ); - $userToUserGroupService = $this->createMock(UserToUserGroupServiceInterface::class); + $userToUserGroupService = $this->createMock(UserToUserGroupService::class); $userToUserGroupService->method('getGroupsForUser')->willReturn([]); $fileCache = $this->createMock(FileCacheService::class); $actions = $this->createMock(ActionsInterface::class); @@ -776,7 +776,7 @@ class AccountAclTest extends UnitaryTestCase self::$faker->unixTime ); - $userToUserGroupService = $this->createMock(UserToUserGroupServiceInterface::class); + $userToUserGroupService = $this->createMock(UserToUserGroupService::class); $userToUserGroupService->method('getGroupsForUser')->willReturn([]); $fileCache = $this->createMock(FileCacheService::class); $actions = $this->createMock(ActionsInterface::class); @@ -812,7 +812,7 @@ class AccountAclTest extends UnitaryTestCase self::$faker->unixTime ); - $userToUserGroupService = $this->createMock(UserToUserGroupServiceInterface::class); + $userToUserGroupService = $this->createMock(UserToUserGroupService::class); $userToUserGroupService->method('getGroupsForUser')->willReturn([]); $fileCache = $this->createMock(FileCacheService::class); $actions = $this->createMock(ActionsInterface::class); @@ -844,7 +844,7 @@ class AccountAclTest extends UnitaryTestCase $actions = $this->createMock(ActionsInterface::class); $this->acl = new Acl($this->context, $this->application->getEventDispatcher(), $actions); - $this->userToUserGroupService = $this->createMock(UserToUserGroupServiceInterface::class); + $this->userToUserGroupService = $this->createMock(UserToUserGroupService::class); $this->userToUserGroupService->method('getGroupsForUser') ->willReturnMap([ [1, [new Simple(['userGroupId' => 2])]], diff --git a/tests/SPT/Domain/Client/Services/ClientTest.php b/tests/SPT/Domain/Client/Services/ClientTest.php index c03ede56..593fdd78 100644 --- a/tests/SPT/Domain/Client/Services/ClientTest.php +++ b/tests/SPT/Domain/Client/Services/ClientTest.php @@ -145,7 +145,7 @@ class ClientTest extends UnitaryTestCase ->expects(self::once()) ->method('delete') ->with($id) - ->willReturn(new QueryResult([])); + ->willReturn(new QueryResult()); $this->expectException(NoSuchItemException::class); $this->expectExceptionMessage('Client not found'); @@ -275,11 +275,6 @@ class ClientTest extends UnitaryTestCase $this->client->deleteByIdBatch($ids); } - /** - * @throws ConstraintException - * @throws SPException - * @throws QueryException - */ public function testGetAll() { $client = ClientGenerator::factory()->buildClient(); diff --git a/tests/SPT/Domain/Tag/Services/TagTest.php b/tests/SPT/Domain/Tag/Services/TagTest.php new file mode 100644 index 00000000..29c63ebc --- /dev/null +++ b/tests/SPT/Domain/Tag/Services/TagTest.php @@ -0,0 +1,280 @@ +. + */ + +namespace SPT\Domain\Tag\Services; + +use PHPUnit\Framework\Attributes\Group; +use PHPUnit\Framework\MockObject\MockObject; +use SP\Domain\Common\Services\ServiceException; +use SP\Domain\Core\Exceptions\ConstraintException; +use SP\Domain\Core\Exceptions\QueryException; +use SP\Domain\Core\Exceptions\SPException; +use SP\Domain\Tag\Ports\TagRepository; +use SP\Domain\Tag\Services\Tag; +use SP\Infrastructure\Common\Repositories\DuplicatedItemException; +use SP\Infrastructure\Common\Repositories\NoSuchItemException; +use SP\Infrastructure\Database\QueryResult; +use SPT\Generators\ItemSearchDataGenerator; +use SPT\Generators\TagGenerator; +use SPT\UnitaryTestCase; + +/** + * Class TagTest + */ +#[Group('unitary')] +class TagTest extends UnitaryTestCase +{ + + private Tag $tag; + private MockObject|TagRepository $tagRepository; + + /** + * @throws ConstraintException + * @throws NoSuchItemException + * @throws QueryException + */ + public function testDelete() + { + $id = self::$faker->randomNumber(); + + $this->tagRepository + ->expects(self::once()) + ->method('delete') + ->with($id) + ->willReturn(new QueryResult(null, 1)); + + $this->tag->delete($id); + } + + /** + * @throws ConstraintException + * @throws QueryException + */ + public function testDeleteWithNotFound() + { + $id = self::$faker->randomNumber(); + + $this->tagRepository + ->expects(self::once()) + ->method('delete') + ->with($id) + ->willReturn(new QueryResult()); + + $this->expectException(NoSuchItemException::class); + $this->expectExceptionMessage('Tag not found'); + + $this->tag->delete($id); + } + + /** + * @throws NoSuchItemException + */ + public function testGetById() + { + $id = self::$faker->randomNumber(); + + $tag = TagGenerator::factory()->buildTag(); + + $this->tagRepository + ->expects(self::once()) + ->method('getById') + ->with($id) + ->willReturn(new QueryResult([$tag])); + + $out = $this->tag->getById($id); + + $this->assertEquals($tag, $out); + } + + /** + * @throws NoSuchItemException + */ + public function testGetByIdWithUnknownId() + { + $id = self::$faker->randomNumber(); + + $this->tagRepository + ->expects(self::once()) + ->method('getById') + ->with($id) + ->willReturn(new QueryResult([])); + + $this->expectException(NoSuchItemException::class); + $this->expectExceptionMessage('Tag not found'); + + $this->tag->getById($id); + } + + /** + * @throws NoSuchItemException + */ + public function testGetByName() + { + $name = self::$faker->colorName(); + + $tag = TagGenerator::factory()->buildTag(); + + $this->tagRepository + ->expects(self::once()) + ->method('getByName') + ->with($name) + ->willReturn(new QueryResult([$tag])); + + $out = $this->tag->getByName($name); + + $this->assertEquals($tag, $out); + } + + /** + * @throws NoSuchItemException + */ + public function testGetByNameWithUnknownName() + { + $name = self::$faker->colorName(); + + $this->tagRepository + ->expects(self::once()) + ->method('getByName') + ->with($name) + ->willReturn(new QueryResult([])); + + $this->expectException(NoSuchItemException::class); + $this->expectExceptionMessage('Tag not found'); + + $this->tag->getByName($name); + } + + public function testGetAll() + { + $tag = TagGenerator::factory()->buildTag(); + + $this->tagRepository + ->expects(self::once()) + ->method('getAll') + ->willReturn(new QueryResult([$tag])); + + $out = $this->tag->getAll(); + + $this->assertEquals([$tag], $out); + } + + /** + * @throws ConstraintException + * @throws DuplicatedItemException + * @throws QueryException + */ + public function testCreate() + { + $tag = TagGenerator::factory()->buildTag(); + + $queryResult = new QueryResult(null, 0, self::$faker->randomNumber()); + + $this->tagRepository + ->expects(self::once()) + ->method('create') + ->with($tag) + ->willReturn($queryResult); + + $out = $this->tag->create($tag); + + $this->assertEquals($queryResult->getLastId(), $out); + } + + /** + * @throws SPException + */ + public function testDeleteByIdBatch() + { + $ids = array_map(fn() => self::$faker->randomNumber(), range(0, 4)); + + $this->tagRepository + ->expects(self::once()) + ->method('deleteByIdBatch') + ->with($ids) + ->willReturn(new QueryResult(null, 5)); + + $this->tag->deleteByIdBatch($ids); + } + + /** + * @throws ServiceException + * @throws SPException + */ + public function testDeleteByIdBatchError() + { + $ids = array_map(fn() => self::$faker->randomNumber(), range(0, 4)); + + $this->tagRepository + ->expects(self::once()) + ->method('deleteByIdBatch') + ->with($ids) + ->willReturn(new QueryResult(null, 0)); + + $this->expectException(ServiceException::class); + $this->expectExceptionMessage('Error while removing the tags'); + + $this->tag->deleteByIdBatch($ids); + } + + /** + * @throws ConstraintException + * @throws SPException + * @throws QueryException + */ + public function testUpdate() + { + $tag = TagGenerator::factory()->buildTag(); + + $this->tagRepository + ->expects(self::once()) + ->method('update') + ->with($tag) + ->willReturn(1); + + $this->tag->update($tag); + } + + public function testSearch() + { + $itemSearch = ItemSearchDataGenerator::factory()->buildItemSearchData(); + + $this->tagRepository + ->expects(self::once()) + ->method('search') + ->with($itemSearch); + + $this->tag->search($itemSearch); + } + + protected function setUp(): void + { + parent::setUp(); + + $this->tagRepository = $this->createMock(TagRepository::class); + + $this->tag = new Tag($this->application, $this->tagRepository); + } + + +} diff --git a/tests/SPT/Domain/User/Services/UserGroupTest.php b/tests/SPT/Domain/User/Services/UserGroupTest.php index 6e6442db..81385497 100644 --- a/tests/SPT/Domain/User/Services/UserGroupTest.php +++ b/tests/SPT/Domain/User/Services/UserGroupTest.php @@ -32,7 +32,7 @@ use SP\Domain\Core\Exceptions\ConstraintException; use SP\Domain\Core\Exceptions\QueryException; use SP\Domain\User\Models\UserGroup as UserGroupModel; use SP\Domain\User\Ports\UserGroupRepository; -use SP\Domain\User\Ports\UserToUserGroupServiceInterface; +use SP\Domain\User\Ports\UserToUserGroupService; use SP\Domain\User\Services\UserGroup; use SP\Infrastructure\Common\Repositories\NoSuchItemException; use SP\Infrastructure\Database\QueryResult; @@ -47,9 +47,9 @@ use SPT\UnitaryTestCase; class UserGroupTest extends UnitaryTestCase { - private MockObject|UserGroupRepository $userGroupRepository; - private UserToUserGroupServiceInterface|MockObject $userToUserGroupService; - private UserGroup $userGroup; + private MockObject|UserGroupRepository $userGroupRepository; + private UserToUserGroupService|MockObject $userToUserGroupService; + private UserGroup $userGroup; /** * @throws ConstraintException @@ -372,7 +372,7 @@ class UserGroupTest extends UnitaryTestCase UserGroupRepositoryStub::class, $userGroupRepositoryMethods ); - $this->userToUserGroupService = $this->createMock(UserToUserGroupServiceInterface::class); + $this->userToUserGroupService = $this->createMock(UserToUserGroupService::class); $this->userGroup = new UserGroup($this->application, $this->userGroupRepository, $this->userToUserGroupService); } diff --git a/tests/SPT/Domain/User/Services/UserToUserGroupTest.php b/tests/SPT/Domain/User/Services/UserToUserGroupTest.php new file mode 100644 index 00000000..d847672d --- /dev/null +++ b/tests/SPT/Domain/User/Services/UserToUserGroupTest.php @@ -0,0 +1,140 @@ +. + */ + +namespace SPT\Domain\User\Services; + +use PHPUnit\Framework\Attributes\Group; +use PHPUnit\Framework\MockObject\MockObject; +use SP\Domain\Core\Exceptions\ConstraintException; +use SP\Domain\Core\Exceptions\QueryException; +use SP\Domain\User\Models\UserToUserGroup as UserToUserGroupModel; +use SP\Domain\User\Ports\UserToUserGroupRepository; +use SP\Domain\User\Services\UserToUserGroup; +use SP\Infrastructure\Database\QueryResult; +use SPT\UnitaryTestCase; + +/** + * Class UserToUserGroupTest + */ +#[Group('unitary')] +class UserToUserGroupTest extends UnitaryTestCase +{ + + private UserToUserGroup $userToUserGroup; + private UserToUserGroupRepository|MockObject $userToUserGroupRepository; + + /** + * @throws ConstraintException + * @throws QueryException + */ + public function testUpdate() + { + $this->userToUserGroupRepository + ->expects($this->once()) + ->method('update') + ->with(100, [1, 2, 3]) + ->willReturn(new QueryResult(null, 10)); + + $this->assertEquals(10, $this->userToUserGroup->update(100, [1, 2, 3])); + } + + /** + * @throws ConstraintException + * @throws QueryException + */ + public function testUpdateWithNoUsers() + { + $this->userToUserGroupRepository + ->expects($this->once()) + ->method('delete') + ->with(100) + ->willReturn(new QueryResult(null, 10)); + + $this->assertEquals(10, $this->userToUserGroup->update(100, [])); + } + + public function testGetUsersByGroupId() + { + $userToUserGroup = new UserToUserGroupModel( + [ + 'userGroupId' => self::$faker->randomNumber(3), + 'userId' => self::$faker->randomNumber(3), + 'users' => [100, 200, 300] + ] + ); + + $this->userToUserGroupRepository + ->expects($this->once()) + ->method('getById') + ->with(100) + ->willReturn(new QueryResult([$userToUserGroup])); + + $out = $this->userToUserGroup->getUsersByGroupId(100); + $this->assertEquals([$userToUserGroup->getUserId()], $out); + } + + public function testGetGroupsForUser() + { + $userToUserGroup = new UserToUserGroupModel( + [ + 'userGroupId' => self::$faker->randomNumber(3), + 'userId' => self::$faker->randomNumber(3), + 'users' => [100, 200, 300] + ] + ); + + $this->userToUserGroupRepository + ->expects($this->once()) + ->method('getGroupsForUser') + ->with(100) + ->willReturn(new QueryResult([$userToUserGroup])); + + $out = $this->userToUserGroup->getGroupsForUser(100); + $this->assertEquals([$userToUserGroup], $out); + } + + /** + * @throws ConstraintException + * @throws QueryException + */ + public function testAdd() + { + $this->userToUserGroupRepository + ->expects($this->once()) + ->method('add') + ->with(100, [1, 2, 3]) + ->willReturn(new QueryResult(null, 0, 10)); + + $this->assertEquals(10, $this->userToUserGroup->add(100, [1, 2, 3])); + } + + protected function setUp(): void + { + parent::setUp(); + + $this->userToUserGroupRepository = $this->createMock(UserToUserGroupRepository::class); + + $this->userToUserGroup = new UserToUserGroup($this->application, $this->userToUserGroupRepository); + } +}