From 5e968200bb7cfde39693e77ff7e579b454c7b5a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20D?= Date: Mon, 29 Apr 2024 07:55:38 +0200 Subject: [PATCH] chore(tests): UT for adapters MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rubén D --- lib/SP/Core/Definitions/CoreDefinitions.php | 10 +- lib/SP/Domain/Category/Adapters/Category.php | 6 +- .../Domain/Category/Ports/CategoryAdapter.php | 2 - lib/SP/Domain/Client/Adapters/Client.php | 23 ++- lib/SP/Domain/Client/Ports/ClientAdapter.php | 5 +- ...AccountAdapterTest.php => AccountTest.php} | 4 +- .../Domain/Category/Adapters/CategoryTest.php | 139 +++++++++++++++++ .../SPT/Domain/Client/Adapters/ClientTest.php | 142 ++++++++++++++++++ tests/SPT/Generators/CustomFieldGenerator.php | 32 ++-- 9 files changed, 329 insertions(+), 34 deletions(-) rename tests/SPT/Domain/Account/Adapters/{AccountAdapterTest.php => AccountTest.php} (99%) create mode 100644 tests/SPT/Domain/Category/Adapters/CategoryTest.php create mode 100644 tests/SPT/Domain/Client/Adapters/ClientTest.php diff --git a/lib/SP/Core/Definitions/CoreDefinitions.php b/lib/SP/Core/Definitions/CoreDefinitions.php index 307520fc..e698e5fa 100644 --- a/lib/SP/Core/Definitions/CoreDefinitions.php +++ b/lib/SP/Core/Definitions/CoreDefinitions.php @@ -91,7 +91,7 @@ use SP\Domain\Install\Adapters\InstallDataFactory; use SP\Domain\Install\Services\DatabaseSetupInterface; use SP\Domain\Install\Services\MysqlSetupBuilder; use SP\Domain\Log\Providers\DatabaseHandler; -use SP\Domain\Log\Providers\FileHandler; +use SP\Domain\Log\Providers\FileHandler as LogFileHandler; use SP\Domain\Log\Providers\RemoteSyslogHandler; use SP\Domain\Log\Providers\SyslogHandler; use SP\Domain\Notification\Ports\MailerInterface; @@ -134,7 +134,7 @@ final class CoreDefinitions ConfigFileService::class => create(ConfigFile::class) ->constructor( create(XmlFileStorage::class) - ->constructor(create(FileHandler::class)->constructor(CONFIG_FILE)), + ->constructor(create(LogFileHandler::class)->constructor(CONFIG_FILE)), create(FileCache::class)->constructor(ConfigFile::CONFIG_CACHE_FILE), get(Context::class), autowire(ConfigBackup::class) @@ -218,17 +218,17 @@ final class CoreDefinitions return MysqlSetupBuilder::build($installData); } - throw new SPException(__u('Unimplemented'), SPException::ERROR, __u('Wrong backend type')); + throw SPException::error(__u('Unimplemented'), __u('Wrong backend type')); }, ProvidersHelper::class => factory(static function (ContainerInterface $c) { $configData = $c->get(ConfigDataInterface::class); if (!$configData->isInstalled()) { - return new ProvidersHelper($c->get(FileHandler::class)); + return new ProvidersHelper($c->get(LogFileHandler::class)); } return new ProvidersHelper( - $c->get(FileHandler::class), + $c->get(LogFileHandler::class), $c->get(DatabaseHandler::class), $c->get(MailHandler::class), $c->get(SyslogHandler::class), diff --git a/lib/SP/Domain/Category/Adapters/Category.php b/lib/SP/Domain/Category/Adapters/Category.php index 45c4008d..b82a22b4 100644 --- a/lib/SP/Domain/Category/Adapters/Category.php +++ b/lib/SP/Domain/Category/Adapters/Category.php @@ -53,8 +53,8 @@ final class Category extends Adapter implements CategoryAdapter public function __construct( ConfigDataInterface $configData, - string $baseUrl, - private readonly CustomFieldDataService $customFieldService, + string $baseUrl, + private readonly CustomFieldDataService $customFieldDataService, private readonly ActionsInterface $actions ) { parent::__construct($configData, $baseUrl); @@ -69,7 +69,7 @@ final class Category extends Adapter implements CategoryAdapter public function includeCustomFields(CategoryModel $data): Collection { return $this->collection( - $this->getCustomFieldsForItem(AclActionsInterface::CATEGORY, $data->id, $this->customFieldService), + $this->getCustomFieldsForItem(AclActionsInterface::CATEGORY, $data->getId(), $this->customFieldDataService), new CustomField($this->configData, $this->baseUrl) ); } diff --git a/lib/SP/Domain/Category/Ports/CategoryAdapter.php b/lib/SP/Domain/Category/Ports/CategoryAdapter.php index ed05c25f..bb02aab4 100644 --- a/lib/SP/Domain/Category/Ports/CategoryAdapter.php +++ b/lib/SP/Domain/Category/Ports/CategoryAdapter.php @@ -33,8 +33,6 @@ use SP\Domain\Core\Exceptions\SPException; /** * Class CategoryAdapter - * - * @package SP\Adapters */ interface CategoryAdapter { diff --git a/lib/SP/Domain/Client/Adapters/Client.php b/lib/SP/Domain/Client/Adapters/Client.php index 6e28367c..8523ec9b 100644 --- a/lib/SP/Domain/Client/Adapters/Client.php +++ b/lib/SP/Domain/Client/Adapters/Client.php @@ -31,7 +31,10 @@ use SP\Domain\Common\Adapters\Adapter; use SP\Domain\Common\Models\Model; use SP\Domain\Common\Providers\Link; use SP\Domain\Common\Services\ServiceException; +use SP\Domain\Config\Ports\ConfigDataInterface; use SP\Domain\Core\Acl\AclActionsInterface; +use SP\Domain\Core\Acl\ActionNotFoundException; +use SP\Domain\Core\Acl\ActionsInterface; use SP\Domain\Core\Exceptions\ConstraintException; use SP\Domain\Core\Exceptions\QueryException; use SP\Domain\Core\Exceptions\SPException; @@ -48,22 +51,36 @@ final class Client extends Adapter implements ClientAdapter protected array $availableIncludes = ['customFields']; + public function __construct( + ConfigDataInterface $configData, + string $baseUrl, + private readonly CustomFieldDataService $customFieldDataService, + private readonly ActionsInterface $actions + ) { + parent::__construct($configData, $baseUrl); + } + /** * @throws ConstraintException * @throws QueryException * @throws SPException * @throws ServiceException */ - public function includeCustomFields(ClientModel $client, CustomFieldDataService $customFieldService): Collection + public function includeCustomFields(ClientModel $client): Collection { return $this->collection( - $this->getCustomFieldsForItem(AclActionsInterface::CLIENT, $client->getId(), $customFieldService), + $this->getCustomFieldsForItem(AclActionsInterface::CLIENT, $client->getId(), $this->customFieldDataService), new CustomField($this->configData, $this->baseUrl) ); } + /** + * @throws ActionNotFoundException + */ public function transform(Model|ClientModel $data): array { + $actionRoute = $this->actions->getActionById(AclActionsInterface::CLIENT_VIEW)->getRoute(); + return [ 'id' => $data->getId(), 'name' => $data->getName(), @@ -75,7 +92,7 @@ final class Client extends Adapter implements ClientAdapter 'rel' => 'self', 'uri' => Link::getDeepLink( $data->getId(), - AclActionsInterface::CLIENT_VIEW, + $actionRoute, $this->configData, $this->baseUrl ), diff --git a/lib/SP/Domain/Client/Ports/ClientAdapter.php b/lib/SP/Domain/Client/Ports/ClientAdapter.php index 6dcb5a58..a56fafab 100644 --- a/lib/SP/Domain/Client/Ports/ClientAdapter.php +++ b/lib/SP/Domain/Client/Ports/ClientAdapter.php @@ -30,12 +30,9 @@ 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\CustomField\Ports\CustomFieldDataService; /** * Class ClientAdapter - * - * @package SP\Adapters */ interface ClientAdapter { @@ -45,7 +42,7 @@ interface ClientAdapter * @throws SPException * @throws ServiceException */ - public function includeCustomFields(Client $client, CustomFieldDataService $customFieldService): Collection; + public function includeCustomFields(Client $client): Collection; public function transform(Client $data): array; } diff --git a/tests/SPT/Domain/Account/Adapters/AccountAdapterTest.php b/tests/SPT/Domain/Account/Adapters/AccountTest.php similarity index 99% rename from tests/SPT/Domain/Account/Adapters/AccountAdapterTest.php rename to tests/SPT/Domain/Account/Adapters/AccountTest.php index 75e3fd8d..1a70ad81 100644 --- a/tests/SPT/Domain/Account/Adapters/AccountAdapterTest.php +++ b/tests/SPT/Domain/Account/Adapters/AccountTest.php @@ -40,11 +40,11 @@ use SPT\Generators\CustomFieldGenerator; use SPT\UnitaryTestCase; /** - * Class AccountAdapterTest + * Class AccountTest * */ #[Group('unitary')] -class AccountAdapterTest extends UnitaryTestCase +class AccountTest extends UnitaryTestCase { /** * @throws Exception diff --git a/tests/SPT/Domain/Category/Adapters/CategoryTest.php b/tests/SPT/Domain/Category/Adapters/CategoryTest.php new file mode 100644 index 00000000..1c6acad7 --- /dev/null +++ b/tests/SPT/Domain/Category/Adapters/CategoryTest.php @@ -0,0 +1,139 @@ +. + */ + +namespace SPT\Domain\Category\Adapters; + +use League\Fractal\Manager; +use League\Fractal\Resource\Item; +use PHPUnit\Framework\Attributes\Group; +use PHPUnit\Framework\MockObject\Exception; +use PHPUnit\Framework\MockObject\MockObject; +use SP\Domain\Category\Adapters\Category; +use SP\Domain\Core\Acl\AclActionsInterface; +use SP\Domain\Core\Acl\ActionNotFoundException; +use SP\Domain\Core\Acl\ActionsInterface; +use SP\Domain\Core\Models\Action; +use SP\Domain\CustomField\Ports\CustomFieldDataService; +use SPT\Generators\CategoryGenerator; +use SPT\Generators\CustomFieldGenerator; +use SPT\UnitaryTestCase; + +/** + * Class CategoryTest + */ +#[Group('unitary')] +class CategoryTest extends UnitaryTestCase +{ + private MockObject|ActionsInterface $actions; + private MockObject|CustomFieldDataService $customFieldDataService; + + /** + * @throws ActionNotFoundException + */ + public function testAdapt(): void + { + $category = CategoryGenerator::factory()->buildCategory(); + + $adapter = new Category( + $this->config->getConfigData(), + 'testUrl', + $this->customFieldDataService, + $this->actions + ); + + $out = $adapter->transform($category); + + $this->assertEquals($category->getId(), $out['id']); + $this->assertEquals($category->getName(), $out['name']); + $this->assertEquals($category->getDescription(), $out['description']); + $this->assertNull($out['customFields']); + + $this->assertEquals('self', $out['links'][0]['rel']); + $this->assertNotEmpty($out['links'][0]['uri']); + } + + /** + * @throws Exception + */ + public function testIncludeCustomFields(): void + { + $category = CategoryGenerator::factory()->buildCategory(); + $customFieldData = CustomFieldGenerator::factory()->buildSimpleModel(); + + $this->customFieldDataService + ->expects(self::once()) + ->method('getBy') + ->with(AclActionsInterface::CATEGORY, $category->getId()) + ->willReturn([$customFieldData]); + + $adapter = new Category( + $this->config->getConfigData(), + 'testUrl', + $this->customFieldDataService, + $this->actions + ); + + $fractal = new Manager(); + $fractal->parseIncludes('customFields'); + $out = $fractal->createData(new Item($category, $adapter))->toArray(); + + $data = $out['data']; + + $this->assertEquals($category->getId(), $data['id']); + $this->assertEquals($category->getName(), $data['name']); + $this->assertEquals($category->getDescription(), $data['description']); + $this->assertArrayHasKey('customFields', $data); + $this->assertEquals($customFieldData['typeName'], $data['customFields']['data'][0]['type']); + $this->assertEquals($customFieldData['typeText'], $data['customFields']['data'][0]['typeText']); + $this->assertEquals($customFieldData['definitionId'], $data['customFields']['data'][0]['definitionId']); + $this->assertEquals( + $customFieldData['definitionName'], + $data['customFields']['data'][0]['definitionName'] + ); + $this->assertEquals($customFieldData['help'], $data['customFields']['data'][0]['help']); + $this->assertEquals($customFieldData['value'], $data['customFields']['data'][0]['value']); + $this->assertEquals($customFieldData['encrypted'], $data['customFields']['data'][0]['isEncrypted']); + $this->assertEquals($customFieldData['required'], $data['customFields']['data'][0]['required']); + } + + protected function setUp(): void + { + parent::setUp(); + + $this->actions = $this->createMock(ActionsInterface::class); + $this->actions->expects(self::once()) + ->method('getActionById') + ->with(AclActionsInterface::CATEGORY_VIEW) + ->willReturn( + new Action( + self::$faker->randomNumber(), + self::$faker->colorName, + self::$faker->sentence, + self::$faker->colorName + ) + ); + + $this->customFieldDataService = $this->createMock(CustomFieldDataService::class); + } +} diff --git a/tests/SPT/Domain/Client/Adapters/ClientTest.php b/tests/SPT/Domain/Client/Adapters/ClientTest.php new file mode 100644 index 00000000..59da229b --- /dev/null +++ b/tests/SPT/Domain/Client/Adapters/ClientTest.php @@ -0,0 +1,142 @@ +. + */ + +namespace SPT\Domain\Client\Adapters; + +use League\Fractal\Manager; +use League\Fractal\Resource\Item; +use PHPUnit\Framework\Attributes\Group; +use PHPUnit\Framework\MockObject\Exception; +use PHPUnit\Framework\MockObject\MockObject; +use SP\Domain\Client\Adapters\Client; +use SP\Domain\Core\Acl\AclActionsInterface; +use SP\Domain\Core\Acl\ActionNotFoundException; +use SP\Domain\Core\Acl\ActionsInterface; +use SP\Domain\Core\Models\Action; +use SP\Domain\CustomField\Ports\CustomFieldDataService; +use SPT\Generators\ClientGenerator; +use SPT\Generators\CustomFieldGenerator; +use SPT\UnitaryTestCase; + +/** + * Class ClientTest + */ +#[Group('unitary')] +class ClientTest extends UnitaryTestCase +{ + private MockObject|ActionsInterface $actions; + private MockObject|CustomFieldDataService $customFieldDataService; + + /** + * @throws ActionNotFoundException + */ + public function testAdapt(): void + { + $client = ClientGenerator::factory()->buildClient(); + + $adapter = new Client( + $this->config->getConfigData(), + 'testUrl', + $this->customFieldDataService, + $this->actions + ); + + $out = $adapter->transform($client); + + $this->assertEquals($client->getId(), $out['id']); + $this->assertEquals($client->getName(), $out['name']); + $this->assertEquals($client->getDescription(), $out['description']); + $this->assertEquals($client->getIsGlobal(), $out['isGlobal']); + $this->assertNull($out['customFields']); + + $this->assertEquals('self', $out['links'][0]['rel']); + $this->assertNotEmpty($out['links'][0]['uri']); + } + + /** + * @throws Exception + */ + public function testIncludeCustomFields(): void + { + $client = ClientGenerator::factory()->buildClient(); + $customFieldData = CustomFieldGenerator::factory()->buildSimpleModel(); + + $this->customFieldDataService + ->expects(self::once()) + ->method('getBy') + ->with(AclActionsInterface::CLIENT, $client->getId()) + ->willReturn([$customFieldData]); + + $adapter = new Client( + $this->config->getConfigData(), + 'testUrl', + $this->customFieldDataService, + $this->actions + ); + + $fractal = new Manager(); + $fractal->parseIncludes('customFields'); + $out = $fractal->createData(new Item($client, $adapter))->toArray(); + + $data = $out['data']; + + $this->assertEquals($client->getId(), $data['id']); + $this->assertEquals($client->getName(), $data['name']); + $this->assertEquals($client->getDescription(), $data['description']); + $this->assertEquals($client->getIsGlobal(), $data['isGlobal']); + + $this->assertArrayHasKey('customFields', $data); + $this->assertEquals($customFieldData['typeName'], $data['customFields']['data'][0]['type']); + $this->assertEquals($customFieldData['typeText'], $data['customFields']['data'][0]['typeText']); + $this->assertEquals($customFieldData['definitionId'], $data['customFields']['data'][0]['definitionId']); + $this->assertEquals( + $customFieldData['definitionName'], + $data['customFields']['data'][0]['definitionName'] + ); + $this->assertEquals($customFieldData['help'], $data['customFields']['data'][0]['help']); + $this->assertEquals($customFieldData['value'], $data['customFields']['data'][0]['value']); + $this->assertEquals($customFieldData['encrypted'], $data['customFields']['data'][0]['isEncrypted']); + $this->assertEquals($customFieldData['required'], $data['customFields']['data'][0]['required']); + } + + protected function setUp(): void + { + parent::setUp(); + + $this->actions = $this->createMock(ActionsInterface::class); + $this->actions->expects(self::once()) + ->method('getActionById') + ->with(AclActionsInterface::CLIENT_VIEW) + ->willReturn( + new Action( + self::$faker->randomNumber(), + self::$faker->colorName, + self::$faker->sentence, + self::$faker->colorName + ) + ); + + $this->customFieldDataService = $this->createMock(CustomFieldDataService::class); + } +} diff --git a/tests/SPT/Generators/CustomFieldGenerator.php b/tests/SPT/Generators/CustomFieldGenerator.php index 350ec755..ab8d67a6 100644 --- a/tests/SPT/Generators/CustomFieldGenerator.php +++ b/tests/SPT/Generators/CustomFieldGenerator.php @@ -41,20 +41,22 @@ final class CustomFieldGenerator extends DataGenerator $key = $this->faker->sha1(); } - return new Simple([ - 'required' => $this->faker->boolean(), - 'showInList' => $this->faker->boolean(), - 'help' => $this->faker->text(), - 'definitionId' => $this->faker->randomNumber(3), - 'definitionName' => $this->faker->name(), - 'typeId' => $this->faker->randomNumber(3), - 'typeName' => $this->faker->name(), - 'typeText' => $this->faker->text(), - 'moduleId' => $this->faker->randomNumber(3), - 'formId' => $this->faker->randomNumber(3), - 'isEncrypted' => $this->faker->boolean(), - 'data' => $data, - 'key' => $key, - ]); + return new Simple( + [ + 'required' => $this->faker->boolean(), + 'showInList' => $this->faker->boolean(), + 'help' => $this->faker->text(), + 'definitionId' => $this->faker->randomNumber(3), + 'definitionName' => $this->faker->name(), + 'typeId' => $this->faker->randomNumber(3), + 'typeName' => $this->faker->name(), + 'typeText' => $this->faker->text(), + 'moduleId' => $this->faker->randomNumber(3), + 'formId' => $this->faker->randomNumber(3), + 'isEncrypted' => $this->faker->boolean(), + 'data' => $data, + 'key' => $key, + ] + ); } }