From 9ac836dc3eff39b77d9dfcc03622378b8dd9d116 Mon Sep 17 00:00:00 2001 From: Yurii Date: Thu, 29 Jan 2026 09:55:53 +0200 Subject: [PATCH] additional binding for tests --- .../Core/Application/ApplicationParams.php | 7 ++++++ .../Espo/Core/Binding/EspoBindingLoader.php | 8 +++++-- .../Espo/Core/Container/ContainerBuilder.php | 9 +++++--- tests/integration/Core/BaseTestCase.php | 16 ++++++++++--- tests/integration/Core/Tester.php | 23 +++++++++++++++---- 5 files changed, 50 insertions(+), 13 deletions(-) diff --git a/application/Espo/Core/Application/ApplicationParams.php b/application/Espo/Core/Application/ApplicationParams.php index 024869f2c5..486c80eee4 100644 --- a/application/Espo/Core/Application/ApplicationParams.php +++ b/application/Espo/Core/Application/ApplicationParams.php @@ -29,12 +29,19 @@ namespace Espo\Core\Application; +use Espo\Core\Binding\BindingProcessor; + /** * @since 9.2.0 */ readonly class ApplicationParams { + /** + * @param bool $noErrorHandler Disable error handling for tests. + * @param ?BindingProcessor $binding Additional DI binding for integration tests. Since v9.3. + */ public function __construct( public bool $noErrorHandler = false, + public ?BindingProcessor $binding = null, ) {} } diff --git a/application/Espo/Core/Binding/EspoBindingLoader.php b/application/Espo/Core/Binding/EspoBindingLoader.php index 32c9a3c793..049fd9168e 100644 --- a/application/Espo/Core/Binding/EspoBindingLoader.php +++ b/application/Espo/Core/Binding/EspoBindingLoader.php @@ -37,8 +37,10 @@ class EspoBindingLoader implements BindingLoader /** @var string[] */ private array $moduleNameList; - public function __construct(Module $module) - { + public function __construct( + Module $module, + private ?BindingProcessor $binding = null, + ) { $this->moduleNameList = $module->getOrderedList(); } @@ -55,6 +57,8 @@ class EspoBindingLoader implements BindingLoader $this->loadCustom($binder); + $this->binding?->process($binder); + return $data; } diff --git a/application/Espo/Core/Container/ContainerBuilder.php b/application/Espo/Core/Container/ContainerBuilder.php index 116a0e1a02..7d623c7cc1 100644 --- a/application/Espo/Core/Container/ContainerBuilder.php +++ b/application/Espo/Core/Container/ContainerBuilder.php @@ -53,7 +53,7 @@ use Espo\Core\Loaders\Metadata as MetadataLoader; */ class ContainerBuilder { - /** @var class-string */ + /** @var class-string */ private string $containerClassName = Container::class; /** @var class-string */ private string $containerConfigurationClassName = ContainerConfiguration::class; @@ -117,7 +117,7 @@ class ContainerBuilder } /** - * @param class-string $containerClassName + * @param class-string $containerClassName */ public function withContainerClassName(string $containerClassName): self { @@ -207,7 +207,10 @@ class ContainerBuilder $this->services['systemConfig'] = $systemConfig; $bindingLoader = $this->bindingLoader ?? ( - new EspoBindingLoader($module) + new EspoBindingLoader( + module: $module, + binding: $this->params?->binding, + ) ); $bindingContainer = new BindingContainer($bindingLoader->load()); diff --git a/tests/integration/Core/BaseTestCase.php b/tests/integration/Core/BaseTestCase.php index b44ee2db3f..e55448b5d8 100644 --- a/tests/integration/Core/BaseTestCase.php +++ b/tests/integration/Core/BaseTestCase.php @@ -32,6 +32,7 @@ namespace tests\integration\Core; use Espo\Core\Api\RequestWrapper; use Espo\Core\Api\ResponseWrapper; use Espo\Core\Application; +use Espo\Core\Binding\BindingProcessor; use Espo\Core\Container; use Espo\Core\DataManager; use Espo\Core\InjectableFactory; @@ -75,9 +76,18 @@ abstract class BaseTestCase extends TestCase */ protected $initData = null; - protected function createApplication(bool $clearCache = true, ?string $portalId = null): Application - { - return $this->espoTester->getApplication(true, $clearCache, $portalId); + protected function createApplication( + bool $clearCache = true, + ?string $portalId = null, + ?BindingProcessor $binding = null, + ): Application { + + return $this->espoTester->getApplication( + reload: true, + clearCache: $clearCache, + portalId: $portalId, + binding: $binding, + ); } protected function setApplication(Application $application): void diff --git a/tests/integration/Core/Tester.php b/tests/integration/Core/Tester.php index 69811807cc..9a6a2598d2 100644 --- a/tests/integration/Core/Tester.php +++ b/tests/integration/Core/Tester.php @@ -34,6 +34,9 @@ use Espo\Core\Authentication\Authentication; use Espo\Core\Authentication\AuthenticationData; use Espo\Core\Application; +use Espo\Core\Binding\BindingProcessor; +use Espo\Core\Exceptions\Forbidden; +use Espo\Core\Exceptions\NotFound; use Espo\Core\InjectableFactory; use Espo\Core\ORM\DatabaseParamsFactory; use Espo\Core\Portal\Application as PortalApplication; @@ -190,7 +193,8 @@ class Tester public function getApplication( bool $reload = false, bool $clearCache = true, - ?string $portalId = null + ?string $portalId = null, + ?BindingProcessor $binding = null, ): Application { $portalId = $portalId ?? $this->portalId ?? null; @@ -200,11 +204,20 @@ class Tester $this->clearCache(); } - $applicationParams = new Application\ApplicationParams(noErrorHandler: true); + $applicationParams = new Application\ApplicationParams( + noErrorHandler: true, + binding: $binding, + ); - $this->application = !$portalId ? - new Application($applicationParams) : - new PortalApplication($portalId, $applicationParams); + if ($portalId) { + try { + $this->application = new PortalApplication($portalId, $applicationParams); + } catch (Forbidden|NotFound $e) { + throw new RuntimeException(previous: $e); + } + } else { + $this->application = new Application($applicationParams); + } $auth = $this->application ->getContainer()