diff --git a/app/modules/web/Controllers/Account/SaveRequestController.php b/app/modules/web/Controllers/Account/SaveRequestController.php index c9ff9c05..eb6f017c 100644 --- a/app/modules/web/Controllers/Account/SaveRequestController.php +++ b/app/modules/web/Controllers/Account/SaveRequestController.php @@ -24,15 +24,14 @@ namespace SP\Modules\Web\Controllers\Account; - use Exception; use JsonException; -use SP\Core\Acl\Acl; use SP\Core\Application; use SP\Core\Events\Event; use SP\Core\Events\EventMessage; use SP\Domain\Account\Ports\AccountService; use SP\Domain\Core\Acl\AclActionsInterface; +use SP\Domain\Core\Exceptions\SPException; use SP\Domain\Core\Exceptions\ValidationException; use SP\Domain\Http\Dtos\JsonMessage; use SP\Domain\Http\Providers\Uri; @@ -41,6 +40,9 @@ use SP\Modules\Web\Controllers\Traits\JsonTrait; use SP\Mvc\Controller\ItemTrait; use SP\Mvc\Controller\WebControllerHelper; +use function SP\__u; +use function SP\processException; + /** * Class SaveRequestController */ @@ -49,22 +51,13 @@ final class SaveRequestController extends AccountControllerBase use ItemTrait; use JsonTrait; - private AccountService $accountService; - private UserService $userService; - public function __construct( - Application $application, - WebControllerHelper $webControllerHelper, - AccountService $accountService, - UserService $userService + Application $application, + WebControllerHelper $webControllerHelper, + private readonly AccountService $accountService, + private readonly UserService $userService ) { - parent::__construct( - $application, - $webControllerHelper - ); - - $this->accountService = $accountService; - $this->userService = $userService; + parent::__construct($application, $webControllerHelper); } /** @@ -74,6 +67,7 @@ final class SaveRequestController extends AccountControllerBase * * @return bool * @throws JsonException + * @throws SPException */ public function saveRequestAction(int $id): bool { @@ -84,7 +78,7 @@ final class SaveRequestController extends AccountControllerBase throw new ValidationException(__u('A description is needed')); } - $accountDetails = $this->accountService->getByIdEnriched($id); + $accountView = $this->accountService->getByIdEnriched($id); $baseUrl = ($this->configData->getApplicationUrl() ?: $this->uriContext->getWebUri()) . $this->uriContext->getSubUri(); @@ -92,41 +86,42 @@ final class SaveRequestController extends AccountControllerBase $deepLink = new Uri($baseUrl); $deepLink->addParam('r', $this->acl->getRouteFor(AclActionsInterface::ACCOUNT_VIEW) . '/' . $id); - $usersId = [$accountDetails->userId, $accountDetails->userEditId]; + $usersId = [$accountView->getUserId(), $accountView->getUserEditId()]; $this->eventDispatcher->notify( 'request.account', new Event( - $this, EventMessage::factory() - ->addDescription(__u('Request')) - ->addDetail( - __u('Requester'), - sprintf('%s (%s)', $this->userData->getName(), $this->userData->getLogin()) - ) - ->addDetail(__u('Account'), $accountDetails->getName()) - ->addDetail(__u('Client'), $accountDetails->getClientName()) - ->addDetail(__u('Description'), $description) - ->addDetail( - __u('Link'), - $deepLink->getUriSigned($this->configData->getPasswordSalt()) - ) - ->addExtra('accountId', $id) - ->addExtra('whoId', $this->userData->getId()) - ->setExtra('userId', $usersId) - ->setExtra( - 'email', - array_map( - static fn($value) => $value->email, - $this->userService->getUserEmailById($usersId) - ) - ) + $this, + EventMessage::factory() + ->addDescription(__u('Request')) + ->addDetail( + __u('Requester'), + sprintf('%s (%s)', $this->userData->getName(), $this->userData->getLogin()) + ) + ->addDetail(__u('Account'), $accountView->getName()) + ->addDetail(__u('Client'), $accountView->getClientName()) + ->addDetail(__u('Description'), $description) + ->addDetail( + __u('Link'), + $deepLink->getUriSigned($this->configData->getPasswordSalt()) + ) + ->addExtra('accountId', $id) + ->addExtra('whoId', $this->userData->getId()) + ->setExtra('userId', $usersId) + ->setExtra( + 'email', + array_map( + static fn($value) => $value->email, + $this->userService->getUserEmailById($usersId) + ) + ) ) ); return $this->returnJsonResponseData( [ 'itemId' => $id, - 'nextAction' => Acl::getActionRoute(AclActionsInterface::ACCOUNT), + 'nextAction' => $this->acl->getRouteFor(AclActionsInterface::ACCOUNT), ], JsonMessage::JSON_SUCCESS, __u('Request done') diff --git a/tests/SP/Modules/Web/Controllers/Account/SaveRequestControllerTest.php b/tests/SP/Modules/Web/Controllers/Account/SaveRequestControllerTest.php new file mode 100644 index 00000000..4d741ee0 --- /dev/null +++ b/tests/SP/Modules/Web/Controllers/Account/SaveRequestControllerTest.php @@ -0,0 +1,86 @@ +. + */ + +declare(strict_types=1); + +namespace SP\Tests\Modules\Web\Controllers\Account; + +use PHPUnit\Framework\Attributes\Group; +use PHPUnit\Framework\MockObject\Exception; +use Psr\Container\ContainerExceptionInterface; +use Psr\Container\NotFoundExceptionInterface; +use SP\Domain\Account\Models\AccountView; +use SP\Domain\Config\Ports\ConfigService; +use SP\Domain\Core\Exceptions\InvalidClassException; +use SP\Infrastructure\Database\QueryResult; +use SP\Infrastructure\File\FileException; +use SP\Tests\Generators\AccountDataGenerator; +use SP\Tests\IntegrationTestCase; + +/** + * Class SaveRequestControllerTest + */ +#[Group('integration')] +class SaveRequestControllerTest extends IntegrationTestCase +{ + + /** + * @throws NotFoundExceptionInterface + * @throws Exception + * @throws InvalidClassException + * @throws FileException + * @throws ContainerExceptionInterface + */ + public function testSaveRequestAction() + { + $accountDataGenerator = AccountDataGenerator::factory(); + + $this->addDatabaseResolver( + AccountView::class, + new QueryResult([$accountDataGenerator->buildAccountDataView()]) + ); + + $configService = self::createStub(ConfigService::class); + $configService->method('getByParam')->willReturnArgument(0); + + $definitions = $this->getModuleDefinitions(); + $definitions[ConfigService::class] = $configService; + + $container = $this->buildContainer( + $definitions, + $this->buildRequest( + 'post', + 'index.php', + ['r' => 'account/saveRequest/100'], + ['description' => self::$faker->text()] + ) + ); + + $this->runApp($container); + + $this->expectOutputString( + '{"status":0,"description":"Request done","data":{"itemId":100,"nextAction":"1"},"messages":[]}' + ); + } +}