From 49f13c6bf4a879eeec8371c2c7f2de34d5a513c7 Mon Sep 17 00:00:00 2001 From: Joey Smith Date: Sun, 23 Nov 2025 10:29:08 -0600 Subject: [PATCH 1/3] Removes all usage of adapter manager and removes unused use statements. Signed-off-by: Joey Smith Signed-off-by: Joey Smith --- src/ConfigProvider.php | 27 ++++-------------- src/Container/AdapterFactory.php | 20 ++++++------- src/Container/AdapterManagerDelegator.php | 28 ------------------- .../ConnectionInterfaceFactoryFactory.php | 3 +- .../DriverInterfaceFactoryFactory.php | 3 +- src/Container/PdoDriverFactory.php | 18 +++++------- src/Container/PlatformInterfaceFactory.php | 6 +--- 7 files changed, 23 insertions(+), 82 deletions(-) delete mode 100644 src/Container/AdapterManagerDelegator.php diff --git a/src/ConfigProvider.php b/src/ConfigProvider.php index c9daf30..ba5c085 100644 --- a/src/ConfigProvider.php +++ b/src/ConfigProvider.php @@ -18,7 +18,6 @@ use PhpDb\Adapter\Profiler\Profiler; use PhpDb\Adapter\Profiler\ProfilerInterface; use PhpDb\Container\AdapterAbstractServiceFactory; -use PhpDb\Container\AdapterManager; use PhpDb\Container\ConnectionInterfaceFactoryFactoryInterface; use PhpDb\Container\DriverInterfaceFactoryFactoryInterface; use PhpDb\Container\PlatformInterfaceFactoryFactoryInterface; @@ -30,8 +29,7 @@ final class ConfigProvider public function __invoke(): array { return [ - 'dependencies' => $this->getDependencies(), - AdapterManager::class => $this->getAdapterManagerConfig(), + 'dependencies' => $this->getDependencies(), ]; } @@ -42,23 +40,6 @@ public function getDependencies(): array AdapterAbstractServiceFactory::class, ], 'aliases' => [ - MetadataInterface::class => Metadata\Source\SqliteMetadata::class, - ], - 'factories' => [ - Metadata\Source\SqliteMetadata::class => Container\MetadataInterfaceFactory::class, - ], - 'delegators' => [ - AdapterManager::class => [ - Container\AdapterManagerDelegator::class, - ], - ], - ]; - } - - public function getAdapterManagerConfig(): array - { - return [ - 'aliases' => [ 'SQLite' => Driver\Pdo\Pdo::class, 'Sqlite' => Driver\Pdo\Pdo::class, 'sqlite' => Driver\Pdo\Pdo::class, @@ -78,8 +59,9 @@ public function getAdapterManagerConfig(): array ConnectionInterfaceFactoryFactoryInterface::class => Container\ConnectionInterfaceFactoryFactory::class, DriverInterfaceFactoryFactoryInterface::class => Container\DriverInterfaceFactoryFactory::class, PlatformInterfaceFactoryFactoryInterface::class => Container\PlatformInterfaceFactoryFactory::class, + MetadataInterface::class => Metadata\Source\SqliteMetadata::class, ], - 'factories' => [ + 'factories' => [ AdapterInterface::class => Container\AdapterFactory::class, Driver\Pdo\Connection::class => Container\PdoConnectionFactory::class, Driver\Pdo\Pdo::class => Container\PdoDriverFactory::class, @@ -88,8 +70,9 @@ public function getAdapterManagerConfig(): array Platform\Sqlite::class => Container\PlatformInterfaceFactory::class, Profiler::class => InvokableFactory::class, ResultSet\ResultSet::class => InvokableFactory::class, + Metadata\Source\SqliteMetadata::class => Container\MetadataInterfaceFactory::class, ], - 'invokables' => [ + 'invokables' => [ Container\ConnectionInterfaceFactoryFactory::class => Container\ConnectionInterfaceFactoryFactory::class, Container\DriverInterfaceFactoryFactory::class diff --git a/src/Container/AdapterFactory.php b/src/Container/AdapterFactory.php index b396be9..42b022a 100644 --- a/src/Container/AdapterFactory.php +++ b/src/Container/AdapterFactory.php @@ -12,7 +12,6 @@ use PhpDb\Adapter\Exception\RuntimeException; use PhpDb\Adapter\Platform\PlatformInterface; use PhpDb\Adapter\Profiler\ProfilerInterface; -use PhpDb\Container\AdapterManager; use PhpDb\ResultSet\ResultSetInterface; use Psr\Container\ContainerInterface; @@ -22,9 +21,6 @@ final class AdapterFactory { public function __invoke(ContainerInterface $container): AdapterInterface { - /** @var AdapterManager $adapterManager */ - $adapterManager = $container->get(AdapterManager::class); - /** @var array $config */ $config = $container->get('config'); @@ -38,7 +34,7 @@ public function __invoke(ContainerInterface $container): AdapterInterface /** @var string $driver */ $driver = $dbConfig['driver']; - if (! $adapterManager->has($driver)) { + if (! $container->has($driver)) { throw new ServiceNotFoundException(sprintf( 'Database driver "%s" is not registered in the adapter manager.', $driver @@ -46,9 +42,9 @@ public function __invoke(ContainerInterface $container): AdapterInterface } /** @var DriverInterface|PdoDriverInterface $driverInstance */ - $driverInstance = $adapterManager->get($driver); + $driverInstance = $container->get($driver); - if (! $adapterManager->has(PlatformInterface::class)) { + if (! $container->has(PlatformInterface::class)) { throw new ServiceNotFoundException(sprintf( 'Database platform "%s" is not registered in the adapter manager.', PlatformInterface::class @@ -56,9 +52,9 @@ public function __invoke(ContainerInterface $container): AdapterInterface } /** @var PlatformInterface $platformInstance */ - $platformInstance = $adapterManager->get(PlatformInterface::class); + $platformInstance = $container->get(PlatformInterface::class); - if (! $adapterManager->has(ResultSetInterface::class)) { + if (! $container->has(ResultSetInterface::class)) { throw new ServiceNotFoundException(sprintf( 'ResultSet "%s" is not registered in the adapter manager.', ResultSetInterface::class @@ -66,11 +62,11 @@ public function __invoke(ContainerInterface $container): AdapterInterface } /** @var ResultSetInterface $resultSetInstance */ - $resultSetInstance = $adapterManager->get(ResultSetInterface::class); + $resultSetInstance = $container->get(ResultSetInterface::class); /** @var ProfilerInterface|null $profilerInstanceOrNull */ - $profilerInstanceOrNull = $adapterManager->has(ProfilerInterface::class) - ? $adapterManager->get(ProfilerInterface::class) + $profilerInstanceOrNull = $container->has(ProfilerInterface::class) + ? $container->get(ProfilerInterface::class) : null; return new Adapter( diff --git a/src/Container/AdapterManagerDelegator.php b/src/Container/AdapterManagerDelegator.php deleted file mode 100644 index 553aa4a..0000000 --- a/src/Container/AdapterManagerDelegator.php +++ /dev/null @@ -1,28 +0,0 @@ -configure( - (new ConfigProvider())->getAdapterManagerConfig() - ); - - return $adapterManager; - } -} diff --git a/src/Container/ConnectionInterfaceFactoryFactory.php b/src/Container/ConnectionInterfaceFactoryFactory.php index 25907e4..814ba51 100644 --- a/src/Container/ConnectionInterfaceFactoryFactory.php +++ b/src/Container/ConnectionInterfaceFactoryFactory.php @@ -5,7 +5,6 @@ namespace PhpDb\Adapter\Sqlite\Container; use PhpDb\Adapter\Sqlite\Driver\Pdo\Pdo; -use PhpDb\Container\AdapterManager; use PhpDb\Container\ConnectionInterfaceFactoryFactoryInterface as FactoryFactoryInterface; use Psr\Container\ContainerInterface; use RuntimeException; @@ -26,7 +25,7 @@ public function __invoke( $requestedName )); } - $adapterServices = $container->get('config')[AdapterManager::class]; + $adapterServices = $container->get('config')['dependencies']; $configuredDriver = $adapterConfig[$requestedName]['driver']; if (array_key_exists($configuredDriver, $adapterServices['aliases'])) { $aliasTo = $adapterServices['aliases'][$configuredDriver]; diff --git a/src/Container/DriverInterfaceFactoryFactory.php b/src/Container/DriverInterfaceFactoryFactory.php index 60280e3..e7219dc 100644 --- a/src/Container/DriverInterfaceFactoryFactory.php +++ b/src/Container/DriverInterfaceFactoryFactory.php @@ -4,7 +4,6 @@ namespace PhpDb\Adapter\Sqlite\Container; -use PhpDb\Container\AdapterManager; use PhpDb\Container\DriverInterfaceFactoryFactoryInterface as FactoryFactoryInterface; use Psr\Container\ContainerInterface; use RuntimeException; @@ -24,7 +23,7 @@ public function __invoke( $requestedName )); } - $adapterServices = $container->get('config')[AdapterManager::class]; + $adapterServices = $container->get('config')['dependencies']; $configuredDriver = $adapterConfig[$requestedName]['driver']; $aliasTo ??= $adapterServices['aliases'][$configuredDriver] ?? $configuredDriver; diff --git a/src/Container/PdoDriverFactory.php b/src/Container/PdoDriverFactory.php index f51e23e..31d9bda 100644 --- a/src/Container/PdoDriverFactory.php +++ b/src/Container/PdoDriverFactory.php @@ -13,24 +13,21 @@ use PhpDb\Adapter\Sqlite\Driver\Pdo\Connection; use PhpDb\Adapter\Sqlite\Driver\Pdo\Feature\SqliteRowCounter; use PhpDb\Adapter\Sqlite\Driver\Pdo\Pdo as PdoDriver; -use PhpDb\Container\AdapterManager; use Psr\Container\ContainerInterface; final class PdoDriverFactory { public function __invoke(ContainerInterface $container): PdoDriverInterface&PdoDriver { - /** @var AdapterManager $adapterManager */ - $adapterManager = $container->get(AdapterManager::class); /** @var ConnectionInterface&Connection $connectionInstance */ - $connectionInstance = $adapterManager->get(Connection::class); + $connectionInstance = $container->get(Connection::class); /** @var StatementInterface&Statement $statementInstance */ - $statementInstance = $adapterManager->get(Statement::class); + $statementInstance = $container->get(Statement::class); /** @var ResultInterface&Result $resultInstance */ - $resultInstance = $adapterManager->get(Result::class); + $resultInstance = $container->get(Result::class); return new PdoDriver( $connectionInstance, @@ -44,20 +41,19 @@ public static function createFromConfig( ContainerInterface $container, string $requestedName, ): PdoDriverInterface&PdoDriver { - /** @var AdapterManager $adapterManager */ - $adapterManager = $container->get(AdapterManager::class); + $connectionFactory = ( - $adapterManager->get(ConnectionInterfaceFactoryFactory::class) + $container->get(ConnectionInterfaceFactoryFactory::class) )($container, $requestedName); /** @var ConnectionInterface&Connection $connectionInstance */ $connectionInstance = $connectionFactory::createFromConfig($container, $requestedName); /** @var StatementInterface&Statement $statementInstance */ - $statementInstance = $adapterManager->get(Statement::class); + $statementInstance = $container->get(Statement::class); /** @var ResultInterface&Result $resultInstance */ - $resultInstance = $adapterManager->get(Result::class); + $resultInstance = $container->get(Result::class); return new PdoDriver( $connectionInstance, diff --git a/src/Container/PlatformInterfaceFactory.php b/src/Container/PlatformInterfaceFactory.php index c42b83c..4282633 100644 --- a/src/Container/PlatformInterfaceFactory.php +++ b/src/Container/PlatformInterfaceFactory.php @@ -8,16 +8,12 @@ use PhpDb\Adapter\Driver\PdoDriverInterface; use PhpDb\Adapter\Platform\PlatformInterface; use PhpDb\Adapter\Sqlite\Platform\Sqlite; -use PhpDb\Container\AdapterManager; use Psr\Container\ContainerInterface; final class PlatformInterfaceFactory { public function __invoke(ContainerInterface $container): PlatformInterface&Sqlite { - /** @var AdapterManager $adapterManager */ - $adapterManager = $container->get(AdapterManager::class); - /** @var array $config */ $config = $container->get('config'); @@ -28,7 +24,7 @@ public function __invoke(ContainerInterface $container): PlatformInterface&Sqlit $driver = $dbConfig['driver']; /** @var PdoDriverInterface|PDO $driverInstance */ - $driverInstance = $adapterManager->get($driver); + $driverInstance = $container->get($driver); return new Sqlite($driverInstance); } From 378f49549c15f455da55331906587dc787f05a2d Mon Sep 17 00:00:00 2001 From: Joey Smith Date: Wed, 26 Nov 2025 01:52:03 -0600 Subject: [PATCH 2/3] updates unit test Signed-off-by: Joey Smith Signed-off-by: Joey Smith --- composer.lock | 76 ++-- .../Container/TestAsset/SetupTrait.php | 206 +++++---- test/unit/ConfigProviderTest.php | 413 +++++++++--------- .../ConnectionInterfaceFactoryFactoryTest.php | 259 +++++------ .../DriverInterfaceFactoryFactoryTest.php | 273 ++++++------ 5 files changed, 606 insertions(+), 621 deletions(-) diff --git a/composer.lock b/composer.lock index 4b5224b..f59efaf 100644 --- a/composer.lock +++ b/composer.lock @@ -259,20 +259,20 @@ }, { "name": "php-db/phpdb", - "version": "0.3.x-dev", + "version": "0.3.0", "source": { "type": "git", "url": "https://github.com/php-db/phpdb.git", - "reference": "82ccbd942248e55b02d2467939bf6ce6f065a156" + "reference": "c780605bf858ce43185f25869169df3f0fedc92c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-db/phpdb/zipball/82ccbd942248e55b02d2467939bf6ce6f065a156", - "reference": "82ccbd942248e55b02d2467939bf6ce6f065a156", + "url": "https://api.github.com/repos/php-db/phpdb/zipball/c780605bf858ce43185f25869169df3f0fedc92c", + "reference": "c780605bf858ce43185f25869169df3f0fedc92c", "shasum": "" }, "require": { - "laminas/laminas-servicemanager": "^4.0.0", + "laminas/laminas-servicemanager": "^3.0.0 || ^4.0.0", "laminas/laminas-stdlib": "^3.20.0", "php": "~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" }, @@ -283,6 +283,7 @@ "require-dev": { "laminas/laminas-coding-standard": "^3.0.1", "laminas/laminas-eventmanager": "^3.14.0", + "laminas/laminas-hydrator": "^4.6.0", "phpstan/phpstan": "^2.1", "phpstan/phpstan-phpunit": "^2.0", "phpunit/phpunit": "^11.5.15", @@ -292,7 +293,6 @@ "laminas/laminas-eventmanager": "Laminas\\EventManager component", "laminas/laminas-hydrator": "(^5.0.0) Laminas\\Hydrator component for using HydratingResultSets" }, - "default-branch": true, "type": "library", "extra": { "laminas": { @@ -322,7 +322,7 @@ "issues": "https://github.com/php-db/phpdb/issues", "source": "https://github.com/php-db/phpdb" }, - "time": "2025-11-09T08:06:35+00:00" + "time": "2025-11-26T04:22:01+00:00" }, { "name": "psr/container", @@ -439,29 +439,29 @@ "packages-dev": [ { "name": "dealerdirect/phpcodesniffer-composer-installer", - "version": "v1.1.2", + "version": "v1.2.0", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/composer-installer.git", - "reference": "e9cf5e4bbf7eeaf9ef5db34938942602838fc2b1" + "reference": "845eb62303d2ca9b289ef216356568ccc075ffd1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/e9cf5e4bbf7eeaf9ef5db34938942602838fc2b1", - "reference": "e9cf5e4bbf7eeaf9ef5db34938942602838fc2b1", + "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/845eb62303d2ca9b289ef216356568ccc075ffd1", + "reference": "845eb62303d2ca9b289ef216356568ccc075ffd1", "shasum": "" }, "require": { "composer-plugin-api": "^2.2", "php": ">=5.4", - "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0" + "squizlabs/php_codesniffer": "^3.1.0 || ^4.0" }, "require-dev": { "composer/composer": "^2.2", "ext-json": "*", "ext-zip": "*", "php-parallel-lint/php-parallel-lint": "^1.4.0", - "phpcompatibility/php-compatibility": "^9.0", + "phpcompatibility/php-compatibility": "^9.0 || ^10.0.0@dev", "yoast/phpunit-polyfills": "^1.0" }, "type": "composer-plugin", @@ -531,7 +531,7 @@ "type": "thanks_dev" } ], - "time": "2025-07-17T20:45:56+00:00" + "time": "2025-11-11T04:32:07+00:00" }, { "name": "laminas/laminas-coding-standard", @@ -813,11 +813,11 @@ }, { "name": "phpstan/phpstan", - "version": "2.1.31", + "version": "2.1.32", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/ead89849d879fe203ce9292c6ef5e7e76f867b96", - "reference": "ead89849d879fe203ce9292c6ef5e7e76f867b96", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e126cad1e30a99b137b8ed75a85a676450ebb227", + "reference": "e126cad1e30a99b137b8ed75a85a676450ebb227", "shasum": "" }, "require": { @@ -862,25 +862,25 @@ "type": "github" } ], - "time": "2025-10-10T14:14:11+00:00" + "time": "2025-11-11T15:18:17+00:00" }, { "name": "phpstan/phpstan-phpunit", - "version": "2.0.7", + "version": "2.0.8", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-phpunit.git", - "reference": "9a9b161baee88a5f5c58d816943cff354ff233dc" + "reference": "2fe9fbeceaf76dd1ebaa7bbbb25e2fb5e59db2fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/9a9b161baee88a5f5c58d816943cff354ff233dc", - "reference": "9a9b161baee88a5f5c58d816943cff354ff233dc", + "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/2fe9fbeceaf76dd1ebaa7bbbb25e2fb5e59db2fe", + "reference": "2fe9fbeceaf76dd1ebaa7bbbb25e2fb5e59db2fe", "shasum": "" }, "require": { "php": "^7.4 || ^8.0", - "phpstan/phpstan": "^2.1.18" + "phpstan/phpstan": "^2.1.32" }, "conflict": { "phpunit/phpunit": "<7.0" @@ -913,9 +913,9 @@ "description": "PHPUnit extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-phpunit/issues", - "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.7" + "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.8" }, - "time": "2025-07-13T11:31:46+00:00" + "time": "2025-11-11T07:55:22+00:00" }, { "name": "phpunit/php-code-coverage", @@ -1254,16 +1254,16 @@ }, { "name": "phpunit/phpunit", - "version": "11.5.43", + "version": "11.5.44", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "c6b89b6cf4324a8b4cb86e1f5dfdd6c9e0371924" + "reference": "c346885c95423eda3f65d85a194aaa24873cda82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c6b89b6cf4324a8b4cb86e1f5dfdd6c9e0371924", - "reference": "c6b89b6cf4324a8b4cb86e1f5dfdd6c9e0371924", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c346885c95423eda3f65d85a194aaa24873cda82", + "reference": "c346885c95423eda3f65d85a194aaa24873cda82", "shasum": "" }, "require": { @@ -1335,7 +1335,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.43" + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.44" }, "funding": [ { @@ -1359,7 +1359,7 @@ "type": "tidelift" } ], - "time": "2025-10-30T08:39:39+00:00" + "time": "2025-11-13T07:17:35+00:00" }, { "name": "sebastian/cli-parser", @@ -2545,16 +2545,16 @@ }, { "name": "theseer/tokenizer", - "version": "1.2.3", + "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", "shasum": "" }, "require": { @@ -2583,7 +2583,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + "source": "https://github.com/theseer/tokenizer/tree/1.3.1" }, "funding": [ { @@ -2591,7 +2591,7 @@ "type": "github" } ], - "time": "2024-03-03T12:36:25+00:00" + "time": "2025-11-17T20:03:58+00:00" }, { "name": "webimpress/coding-standard", @@ -2664,5 +2664,5 @@ "platform-overrides": { "php": "8.2.99" }, - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.9.0" } diff --git a/test/integration/Container/TestAsset/SetupTrait.php b/test/integration/Container/TestAsset/SetupTrait.php index dfcd9c2..ab0aad9 100644 --- a/test/integration/Container/TestAsset/SetupTrait.php +++ b/test/integration/Container/TestAsset/SetupTrait.php @@ -1,105 +1,101 @@ - []]; - - protected ?AdapterInterface $adapter; - - protected AdapterManager $adapterManager; - - protected ContainerInterface $container; - - protected DriverInterface|string|null $driver; - - #[Override] - protected function setUp(): void - { - $this->getAdapter(); - parent::setUp(); - } - - protected function getAdapter(array $config = []): AdapterInterface - { - $connectionConfig = [ - 'db' => [ - 'driver' => $this->driver ?? Pdo::class, - 'connection' => [ - 'dsn' => 'sqlite::memory:', - 'charset' => 'utf8', - 'driver_options' => [], - ], - 'options' => [ - //'buffer_results' => false, - ], - ], - ]; - - // merge service config from both PhpDb and PhpDb\Adapter\Mysql - $serviceManagerConfig = ArrayUtils::merge( - (new LaminasDbConfigProvider())()['dependencies'], - (new ConfigProvider())()['dependencies'] - ); - - $serviceManagerConfig = ArrayUtils::merge( - $serviceManagerConfig, - $connectionConfig - ); - - // prefer passed config over environment variables - if ($config !== []) { - $serviceManagerConfig = ArrayUtils::merge($serviceManagerConfig, $config); - } - - $serviceManagerConfig = ArrayUtils::merge( - $serviceManagerConfig, - [ - 'services' => [ - 'config' => $serviceManagerConfig, - ], - ] - ); - - $this->config = $serviceManagerConfig; - $this->container = new ServiceManager($this->config); - $this->adapterManager = $this->container->get(AdapterManager::class); - $this->adapter = $this->adapterManager->get(AdapterInterface::class); - - return $this->adapter; - } - - protected function getConfig(): array - { - return $this->config; - } - - protected function getHostname(): string - { - return $this->getConfig()['db']['connection']['hostname']; - } -} + []]; + + protected ?AdapterInterface $adapter; + + protected ContainerInterface $container; + + protected DriverInterface|string|null $driver; + + #[Override] + protected function setUp(): void + { + $this->getAdapter(); + parent::setUp(); + } + + protected function getAdapter(array $config = []): AdapterInterface + { + $connectionConfig = [ + 'db' => [ + 'driver' => $this->driver ?? Pdo::class, + 'connection' => [ + 'dsn' => 'sqlite::memory:', + 'charset' => 'utf8', + 'driver_options' => [], + ], + 'options' => [ + //'buffer_results' => false, + ], + ], + ]; + + // merge service config from both PhpDb and PhpDb\Adapter\Mysql + $serviceManagerConfig = ArrayUtils::merge( + (new LaminasDbConfigProvider())()['dependencies'], + (new ConfigProvider())()['dependencies'] + ); + + $serviceManagerConfig = ArrayUtils::merge( + $serviceManagerConfig, + $connectionConfig + ); + + // prefer passed config over environment variables + if ($config !== []) { + $serviceManagerConfig = ArrayUtils::merge($serviceManagerConfig, $config); + } + + $serviceManagerConfig = ArrayUtils::merge( + $serviceManagerConfig, + [ + 'services' => [ + 'config' => $serviceManagerConfig, + ], + ] + ); + + $this->config = $serviceManagerConfig; + $this->container = new ServiceManager($this->config); + $this->adapter = $this->container->get(AdapterInterface::class); + + return $this->adapter; + } + + protected function getConfig(): array + { + return $this->config; + } + + protected function getHostname(): string + { + return $this->getConfig()['db']['connection']['hostname']; + } +} diff --git a/test/unit/ConfigProviderTest.php b/test/unit/ConfigProviderTest.php index 0af2103..c078f22 100644 --- a/test/unit/ConfigProviderTest.php +++ b/test/unit/ConfigProviderTest.php @@ -1,213 +1,200 @@ -configProvider = new ConfigProvider(); - } - - public function testInvokeReturnsExpectedStructure(): void - { - $config = ($this->configProvider)(); - - self::assertIsArray($config); - self::assertArrayHasKey('dependencies', $config); - self::assertArrayHasKey(AdapterManager::class, $config); - } - - public function testGetDependenciesReturnsCorrectStructure(): void - { - $dependencies = $this->configProvider->getDependencies(); - - self::assertIsArray($dependencies); - self::assertArrayHasKey('abstract_factories', $dependencies); - self::assertArrayHasKey('aliases', $dependencies); - self::assertArrayHasKey('factories', $dependencies); - self::assertArrayHasKey('delegators', $dependencies); - } - - public function testGetDependenciesContainsAbstractFactories(): void - { - $dependencies = $this->configProvider->getDependencies(); - - self::assertContains( - AdapterAbstractServiceFactory::class, - $dependencies['abstract_factories'] - ); - } - - public function testGetDependenciesContainsMetadataAlias(): void - { - $dependencies = $this->configProvider->getDependencies(); - - self::assertArrayHasKey(MetadataInterface::class, $dependencies['aliases']); - self::assertSame( - SqliteMetadata::class, - $dependencies['aliases'][MetadataInterface::class] - ); - } - - public function testGetDependenciesContainsMetadataFactory(): void - { - $dependencies = $this->configProvider->getDependencies(); - - self::assertArrayHasKey(SqliteMetadata::class, $dependencies['factories']); - self::assertSame( - Container\MetadataInterfaceFactory::class, - $dependencies['factories'][SqliteMetadata::class] - ); - } - - public function testGetDependenciesContainsDelegators(): void - { - $dependencies = $this->configProvider->getDependencies(); - - self::assertArrayHasKey(AdapterManager::class, $dependencies['delegators']); - self::assertContains( - Container\AdapterManagerDelegator::class, - $dependencies['delegators'][AdapterManager::class] - ); - } - - public function testGetAdapterManagerConfigReturnsCorrectStructure(): void - { - $config = $this->configProvider->getAdapterManagerConfig(); - - self::assertIsArray($config); - self::assertArrayHasKey('aliases', $config); - self::assertArrayHasKey('factories', $config); - self::assertArrayHasKey('invokables', $config); - } - - public function testGetAdapterManagerConfigContainsDriverAliases(): void - { - $config = $this->configProvider->getAdapterManagerConfig(); - - $expectedAliases = [ - 'SQLite' => Pdo::class, - 'Sqlite' => Pdo::class, - 'sqlite' => Pdo::class, - 'pdo' => Pdo::class, - 'pdo_sqlite' => Pdo::class, - 'pdosqlite' => Pdo::class, - 'pdodriver' => Pdo::class, - ]; - - foreach ($expectedAliases as $alias => $target) { - self::assertArrayHasKey($alias, $config['aliases']); - self::assertSame($target, $config['aliases'][$alias]); - } - } - - public function testGetAdapterManagerConfigContainsInterfaceAliases(): void - { - $config = $this->configProvider->getAdapterManagerConfig(); - - $expectedAliases = [ - ConnectionInterface::class => Connection::class, - PdoConnectionInterface::class => Connection::class, - DriverInterface::class => Pdo::class, - PdoDriverInterface::class => Pdo::class, - PlatformInterface::class => Sqlite::class, - ProfilerInterface::class => Profiler::class, - ResultInterface::class => Result::class, - ResultSet\ResultSetInterface::class => ResultSet\ResultSet::class, - StatementInterface::class => Statement::class, - ]; - - foreach ($expectedAliases as $interface => $implementation) { - self::assertArrayHasKey($interface, $config['aliases']); - self::assertSame($implementation, $config['aliases'][$interface]); - } - } - - public function testGetAdapterManagerConfigContainsFactoryFactoryAliases(): void - { - $config = $this->configProvider->getAdapterManagerConfig(); - - $expectedAliases = [ - ConnectionInterfaceFactoryFactoryInterface::class => Container\ConnectionInterfaceFactoryFactory::class, - DriverInterfaceFactoryFactoryInterface::class => Container\DriverInterfaceFactoryFactory::class, - PlatformInterfaceFactoryFactoryInterface::class => Container\PlatformInterfaceFactoryFactory::class, - ]; - - foreach ($expectedAliases as $interface => $implementation) { - self::assertArrayHasKey($interface, $config['aliases']); - self::assertSame($implementation, $config['aliases'][$interface]); - } - } - - public function testGetAdapterManagerConfigContainsFactories(): void - { - $config = $this->configProvider->getAdapterManagerConfig(); - - $expectedFactories = [ - AdapterInterface::class => Container\AdapterFactory::class, - Connection::class => Container\PdoConnectionFactory::class, - Pdo::class => Container\PdoDriverFactory::class, - Result::class => Container\PdoResultFactory::class, - Statement::class => Container\PdoStatementFactory::class, - Sqlite::class => Container\PlatformInterfaceFactory::class, - Profiler::class => InvokableFactory::class, - ResultSet\ResultSet::class => InvokableFactory::class, - ]; - - foreach ($expectedFactories as $service => $factory) { - self::assertArrayHasKey($service, $config['factories']); - self::assertSame($factory, $config['factories'][$service]); - } - } - - public function testGetAdapterManagerConfigContainsInvokables(): void - { - $config = $this->configProvider->getAdapterManagerConfig(); - - $expectedInvokables = [ - Container\ConnectionInterfaceFactoryFactory::class, - Container\DriverInterfaceFactoryFactory::class, - Container\PlatformInterfaceFactoryFactory::class, - ]; - - foreach ($expectedInvokables as $invokable) { - self::assertArrayHasKey($invokable, $config['invokables']); - self::assertSame($invokable, $config['invokables'][$invokable]); - } - } -} +configProvider = new ConfigProvider(); + } + + public function testInvokeReturnsExpectedStructure(): void + { + $config = ($this->configProvider)(); + + self::assertIsArray($config); + self::assertArrayHasKey('dependencies', $config); + } + + public function testGetDependenciesReturnsCorrectStructure(): void + { + $dependencies = $this->configProvider->getDependencies(); + + self::assertIsArray($dependencies); + self::assertArrayHasKey('abstract_factories', $dependencies); + self::assertArrayHasKey('aliases', $dependencies); + self::assertArrayHasKey('factories', $dependencies); + self::assertArrayHasKey('invokables', $dependencies); + } + + public function testGetDependenciesContainsAbstractFactories(): void + { + $dependencies = $this->configProvider->getDependencies(); + + self::assertContains( + AdapterAbstractServiceFactory::class, + $dependencies['abstract_factories'] + ); + } + + public function testGetDependenciesContainsMetadataAlias(): void + { + $dependencies = $this->configProvider->getDependencies(); + + self::assertArrayHasKey(MetadataInterface::class, $dependencies['aliases']); + self::assertSame( + SqliteMetadata::class, + $dependencies['aliases'][MetadataInterface::class] + ); + } + + public function testGetDependenciesContainsMetadataFactory(): void + { + $dependencies = $this->configProvider->getDependencies(); + + self::assertArrayHasKey(SqliteMetadata::class, $dependencies['factories']); + self::assertSame( + Container\MetadataInterfaceFactory::class, + $dependencies['factories'][SqliteMetadata::class] + ); + } + + public function testConfigReturnsCorrectStructure(): void + { + $config = $this->configProvider->getDependencies(); + + self::assertIsArray($config); + self::assertArrayHasKey('aliases', $config); + self::assertArrayHasKey('factories', $config); + self::assertArrayHasKey('invokables', $config); + } + + public function testGetDependenciesContainsDriverAliases(): void + { + $config = $this->configProvider->getDependencies(); + + $expectedAliases = [ + 'SQLite' => Pdo::class, + 'Sqlite' => Pdo::class, + 'sqlite' => Pdo::class, + 'pdo' => Pdo::class, + 'pdo_sqlite' => Pdo::class, + 'pdosqlite' => Pdo::class, + 'pdodriver' => Pdo::class, + ]; + + foreach ($expectedAliases as $alias => $target) { + self::assertArrayHasKey($alias, $config['aliases']); + self::assertSame($target, $config['aliases'][$alias]); + } + } + + public function testGetDependenciesContainsInterfaceAliases(): void + { + $config = $this->configProvider->getDependencies(); + + $expectedAliases = [ + ConnectionInterface::class => Connection::class, + PdoConnectionInterface::class => Connection::class, + DriverInterface::class => Pdo::class, + PdoDriverInterface::class => Pdo::class, + PlatformInterface::class => Sqlite::class, + ProfilerInterface::class => Profiler::class, + ResultInterface::class => Result::class, + ResultSet\ResultSetInterface::class => ResultSet\ResultSet::class, + StatementInterface::class => Statement::class, + ]; + + foreach ($expectedAliases as $interface => $implementation) { + self::assertArrayHasKey($interface, $config['aliases']); + self::assertSame($implementation, $config['aliases'][$interface]); + } + } + + public function testConfigContainsFactoryFactoryAliases(): void + { + $config = $this->configProvider->getDependencies(); + + $expectedAliases = [ + ConnectionInterfaceFactoryFactoryInterface::class => Container\ConnectionInterfaceFactoryFactory::class, + DriverInterfaceFactoryFactoryInterface::class => Container\DriverInterfaceFactoryFactory::class, + PlatformInterfaceFactoryFactoryInterface::class => Container\PlatformInterfaceFactoryFactory::class, + ]; + + foreach ($expectedAliases as $interface => $implementation) { + self::assertArrayHasKey($interface, $config['aliases']); + self::assertSame($implementation, $config['aliases'][$interface]); + } + } + + public function testConfigContainsFactories(): void + { + $config = $this->configProvider->getDependencies(); + + $expectedFactories = [ + AdapterInterface::class => Container\AdapterFactory::class, + Connection::class => Container\PdoConnectionFactory::class, + Pdo::class => Container\PdoDriverFactory::class, + Result::class => Container\PdoResultFactory::class, + Statement::class => Container\PdoStatementFactory::class, + Sqlite::class => Container\PlatformInterfaceFactory::class, + Profiler::class => InvokableFactory::class, + ResultSet\ResultSet::class => InvokableFactory::class, + ]; + + foreach ($expectedFactories as $service => $factory) { + self::assertArrayHasKey($service, $config['factories']); + self::assertSame($factory, $config['factories'][$service]); + } + } + + public function testConfigContainsInvokables(): void + { + $config = $this->configProvider->getDependencies(); + + $expectedInvokables = [ + Container\ConnectionInterfaceFactoryFactory::class, + Container\DriverInterfaceFactoryFactory::class, + Container\PlatformInterfaceFactoryFactory::class, + ]; + + foreach ($expectedInvokables as $invokable) { + self::assertArrayHasKey($invokable, $config['invokables']); + self::assertSame($invokable, $config['invokables'][$invokable]); + } + } +} diff --git a/test/unit/Container/ConnectionInterfaceFactoryFactoryTest.php b/test/unit/Container/ConnectionInterfaceFactoryFactoryTest.php index d6cd4d6..5b612e6 100644 --- a/test/unit/Container/ConnectionInterfaceFactoryFactoryTest.php +++ b/test/unit/Container/ConnectionInterfaceFactoryFactoryTest.php @@ -1,129 +1,130 @@ -createMock(ContainerInterface::class); - $containerMock->method('get')->willReturnMap([ - [ - 'config', - [ - 'db' => [ - 'adapters' => [ - 'test_adapter' => [ - 'driver' => 'sqlite', - ], - ], - ], - AdapterManager::class => [ - 'aliases' => [ - 'sqlite' => Pdo::class, - ], - ], - ], - ], - ]); - - $factoryFactory = new ConnectionInterfaceFactoryFactory(); - $result = $factoryFactory($containerMock, 'test_adapter'); - - self::assertIsCallable($result); - } - - public function testInvokeReturnsPdoConnectionFactory(): void - { - $containerMock = $this->createMock(ContainerInterface::class); - $containerMock->method('get')->willReturnMap([ - [ - 'config', - [ - 'db' => [ - 'adapters' => [ - 'test_adapter' => [ - 'driver' => 'sqlite', - ], - ], - ], - AdapterManager::class => [ - 'aliases' => [ - 'sqlite' => Pdo::class, - ], - ], - ], - ], - ]); - - $factoryFactory = new ConnectionInterfaceFactoryFactory(); - $result = $factoryFactory($containerMock, 'test_adapter'); - - self::assertInstanceOf(PdoConnectionFactory::class, $result); - } - - public function testInvokeThrowsExceptionWhenDriverNotConfigured(): void - { - $containerMock = $this->createMock(ContainerInterface::class); - $containerMock->method('get')->willReturnMap([ - [ - 'config', - [ - 'db' => [ - 'adapters' => [ - 'test_adapter' => [], - ], - ], - ], - ], - ]); - - $factoryFactory = new ConnectionInterfaceFactoryFactory(); - - $this->expectException(RuntimeException::class); - $this->expectExceptionMessage('Named adapter "test_adapter" is not configured with a driver'); - - $factoryFactory($containerMock, 'test_adapter'); - } - - public function testInvokeThrowsExceptionForUnknownDriver(): void - { - $containerMock = $this->createMock(ContainerInterface::class); - $containerMock->method('get')->willReturnMap([ - [ - 'config', - [ - 'db' => [ - 'adapters' => [ - 'test_adapter' => [ - 'driver' => 'unknown', - ], - ], - ], - AdapterManager::class => [ - 'aliases' => [], - ], - ], - ], - ]); - - $factoryFactory = new ConnectionInterfaceFactoryFactory(); - - $this->expectException(RuntimeException::class); - $this->expectExceptionMessage('No connection factory found for driver "unknown"'); - - $factoryFactory($containerMock, 'test_adapter'); - } -} +createMock(ContainerInterface::class); + $containerMock->method('get')->willReturnMap([ + [ + 'config', + [ + 'dependencies' => [ + 'aliases' => [ + 'sqlite' => Pdo::class, + ], + ], + 'db' => [ + 'adapters' => [ + 'test_adapter' => [ + 'driver' => 'sqlite', + ], + ], + ], + ], + ], + ]); + + $factoryFactory = new ConnectionInterfaceFactoryFactory(); + $result = $factoryFactory($containerMock, 'test_adapter'); + + self::assertIsCallable($result); + } + + public function testInvokeReturnsPdoConnectionFactory(): void + { + $containerMock = $this->createMock(ContainerInterface::class); + $containerMock->method('get')->willReturnMap([ + [ + 'config', + [ + 'dependencies' => [ + 'aliases' => [ + 'sqlite' => Pdo::class, + ], + ], + 'db' => [ + 'adapters' => [ + 'test_adapter' => [ + 'driver' => 'sqlite', + ], + ], + ], + ], + ], + ]); + + $factoryFactory = new ConnectionInterfaceFactoryFactory(); + $result = $factoryFactory($containerMock, 'test_adapter'); + + self::assertInstanceOf(PdoConnectionFactory::class, $result); + } + + public function testInvokeThrowsExceptionWhenDriverNotConfigured(): void + { + $containerMock = $this->createMock(ContainerInterface::class); + $containerMock->method('get')->willReturnMap([ + [ + 'config', + [ + 'db' => [ + 'adapters' => [ + 'test_adapter' => [], + ], + ], + ], + ], + ]); + + $factoryFactory = new ConnectionInterfaceFactoryFactory(); + + $this->expectException(RuntimeException::class); + $this->expectExceptionMessage('Named adapter "test_adapter" is not configured with a driver'); + + $factoryFactory($containerMock, 'test_adapter'); + } + + public function testInvokeThrowsExceptionForUnknownDriver(): void + { + $containerMock = $this->createMock(ContainerInterface::class); + $containerMock->method('get')->willReturnMap([ + [ + 'config', + [ + 'dependencies' => [ + 'aliases' => [ + 'sqlite' => Pdo::class, + ], + ], + 'db' => [ + 'adapters' => [ + 'test_adapter' => [ + 'driver' => 'unknown', + ], + ], + ], + ], + ], + ]); + + $factoryFactory = new ConnectionInterfaceFactoryFactory(); + + $this->expectException(RuntimeException::class); + $this->expectExceptionMessage('No connection factory found for driver "unknown"'); + + $factoryFactory($containerMock, 'test_adapter'); + } +} diff --git a/test/unit/Container/DriverInterfaceFactoryFactoryTest.php b/test/unit/Container/DriverInterfaceFactoryFactoryTest.php index efbfe5e..4f385fc 100644 --- a/test/unit/Container/DriverInterfaceFactoryFactoryTest.php +++ b/test/unit/Container/DriverInterfaceFactoryFactoryTest.php @@ -1,136 +1,137 @@ -createMock(ContainerInterface::class); - $containerMock->method('get')->willReturnMap([ - [ - 'config', - [ - 'db' => [ - 'adapters' => [ - 'test_adapter' => [ - 'driver' => 'sqlite', - ], - ], - ], - AdapterManager::class => [ - 'aliases' => [ - 'sqlite' => Pdo::class, - ], - 'factories' => [ - Pdo::class => PdoDriverFactory::class, - ], - ], - ], - ], - ]); - - $factoryFactory = new DriverInterfaceFactoryFactory(); - $result = $factoryFactory($containerMock, 'test_adapter'); - - self::assertIsCallable($result); - } - - public function testInvokeReturnsPdoDriverFactory(): void - { - $containerMock = $this->createMock(ContainerInterface::class); - $containerMock->method('get')->willReturnMap([ - [ - 'config', - [ - 'db' => [ - 'adapters' => [ - 'test_adapter' => [ - 'driver' => 'sqlite', - ], - ], - ], - AdapterManager::class => [ - 'aliases' => [ - 'sqlite' => Pdo::class, - ], - 'factories' => [ - Pdo::class => PdoDriverFactory::class, - ], - ], - ], - ], - ]); - - $factoryFactory = new DriverInterfaceFactoryFactory(); - $result = $factoryFactory($containerMock, 'test_adapter'); - - self::assertInstanceOf(PdoDriverFactory::class, $result); - } - - public function testInvokeThrowsExceptionWhenDriverNotConfigured(): void - { - $containerMock = $this->createMock(ContainerInterface::class); - $containerMock->method('get')->willReturnMap([ - [ - 'config', - [ - 'db' => [ - 'adapters' => [ - 'test_adapter' => [], - ], - ], - ], - ], - ]); - - $factoryFactory = new DriverInterfaceFactoryFactory(); - - $this->expectException(RuntimeException::class); - $this->expectExceptionMessage('Named adapter "test_adapter" is not configured with a driver'); - - $factoryFactory($containerMock, 'test_adapter'); - } - - public function testInvokeWithDriverNotInAliases(): void - { - $containerMock = $this->createMock(ContainerInterface::class); - $containerMock->method('get')->willReturnMap([ - [ - 'config', - [ - 'db' => [ - 'adapters' => [ - 'test_adapter' => [ - 'driver' => Pdo::class, - ], - ], - ], - AdapterManager::class => [ - 'aliases' => [], - 'factories' => [ - Pdo::class => PdoDriverFactory::class, - ], - ], - ], - ], - ]); - - $factoryFactory = new DriverInterfaceFactoryFactory(); - $result = $factoryFactory($containerMock, 'test_adapter'); - - self::assertInstanceOf(PdoDriverFactory::class, $result); - } -} +createMock(ContainerInterface::class); + $containerMock->method('get')->willReturnMap([ + [ + 'config', + [ + 'dependencies' => [ + 'aliases' => [ + 'sqlite' => Pdo::class, + ], + 'factories' => [ + Pdo::class => PdoDriverFactory::class, + ], + ], + 'db' => [ + 'adapters' => [ + 'test_adapter' => [ + 'driver' => 'sqlite', + ], + ], + ], + ], + ], + ]); + + $factoryFactory = new DriverInterfaceFactoryFactory(); + $result = $factoryFactory($containerMock, 'test_adapter'); + + self::assertIsCallable($result); + } + + public function testInvokeReturnsPdoDriverFactory(): void + { + $containerMock = $this->createMock(ContainerInterface::class); + $containerMock->method('get')->willReturnMap([ + [ + 'config', + [ + 'dependencies' => [ + 'aliases' => [ + 'sqlite' => Pdo::class, + ], + 'factories' => [ + Pdo::class => PdoDriverFactory::class, + ], + ], + 'db' => [ + 'adapters' => [ + 'test_adapter' => [ + 'driver' => 'sqlite', + ], + ], + ], + ], + ], + ]); + + $factoryFactory = new DriverInterfaceFactoryFactory(); + $result = $factoryFactory($containerMock, 'test_adapter'); + + self::assertInstanceOf(PdoDriverFactory::class, $result); + } + + public function testInvokeThrowsExceptionWhenDriverNotConfigured(): void + { + $containerMock = $this->createMock(ContainerInterface::class); + $containerMock->method('get')->willReturnMap([ + [ + 'config', + [ + 'db' => [ + 'adapters' => [ + 'test_adapter' => [], + ], + ], + ], + ], + ]); + + $factoryFactory = new DriverInterfaceFactoryFactory(); + + $this->expectException(RuntimeException::class); + $this->expectExceptionMessage('Named adapter "test_adapter" is not configured with a driver'); + + $factoryFactory($containerMock, 'test_adapter'); + } + + public function testInvokeWithDriverNotInAliases(): void + { + $containerMock = $this->createMock(ContainerInterface::class); + $containerMock->method('get')->willReturnMap([ + [ + 'config', + [ + 'dependencies' => [ + 'aliases' => [ + 'sqlite' => Pdo::class, + ], + 'factories' => [ + Pdo::class => PdoDriverFactory::class, + ], + ], + 'db' => [ + 'adapters' => [ + 'test_adapter' => [ + 'driver' => Pdo::class, + ], + ], + ], + ], + ], + ]); + + $factoryFactory = new DriverInterfaceFactoryFactory(); + $result = $factoryFactory($containerMock, 'test_adapter'); + + self::assertInstanceOf(PdoDriverFactory::class, $result); + } +} From 48df1a9df8990e63a159dd174461dfcfb2ffa6a6 Mon Sep 17 00:00:00 2001 From: Joey Smith Date: Wed, 26 Nov 2025 02:10:34 -0600 Subject: [PATCH 3/3] update baseline Signed-off-by: Joey Smith Signed-off-by: Joey Smith --- phpstan-baseline.neon | 6 - src/ConfigProvider.php | 18 +- src/Container/PdoDriverFactory.php | 2 - .../Container/TestAsset/SetupTrait.php | 202 ++++----- test/unit/ConfigProviderTest.php | 400 +++++++++--------- .../ConnectionInterfaceFactoryFactoryTest.php | 260 ++++++------ .../DriverInterfaceFactoryFactoryTest.php | 274 ++++++------ 7 files changed, 577 insertions(+), 585 deletions(-) diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index aa4eea9..4fd25e4 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -6,12 +6,6 @@ parameters: count: 1 path: src/Container/DriverInterfaceFactoryFactory.php - - - message: '#^Cannot call static method createFromConfig\(\) on callable\.$#' - identifier: staticMethod.nonObject - count: 1 - path: src/Container/PdoDriverFactory.php - - message: '#^Parameter \#1 \$name \(string\) of method PhpDb\\Adapter\\Sqlite\\Driver\\Pdo\\Connection\:\:getLastGeneratedValue\(\) should be compatible with parameter \$name \(null\) of method PhpDb\\Adapter\\Driver\\ConnectionInterface\:\:getLastGeneratedValue\(\)$#' identifier: method.childParameterType diff --git a/src/ConfigProvider.php b/src/ConfigProvider.php index ba5c085..fd64fd0 100644 --- a/src/ConfigProvider.php +++ b/src/ConfigProvider.php @@ -59,17 +59,17 @@ public function getDependencies(): array ConnectionInterfaceFactoryFactoryInterface::class => Container\ConnectionInterfaceFactoryFactory::class, DriverInterfaceFactoryFactoryInterface::class => Container\DriverInterfaceFactoryFactory::class, PlatformInterfaceFactoryFactoryInterface::class => Container\PlatformInterfaceFactoryFactory::class, - MetadataInterface::class => Metadata\Source\SqliteMetadata::class, + MetadataInterface::class => Metadata\Source\SqliteMetadata::class, ], 'factories' => [ - AdapterInterface::class => Container\AdapterFactory::class, - Driver\Pdo\Connection::class => Container\PdoConnectionFactory::class, - Driver\Pdo\Pdo::class => Container\PdoDriverFactory::class, - Result::class => Container\PdoResultFactory::class, - Statement::class => Container\PdoStatementFactory::class, - Platform\Sqlite::class => Container\PlatformInterfaceFactory::class, - Profiler::class => InvokableFactory::class, - ResultSet\ResultSet::class => InvokableFactory::class, + AdapterInterface::class => Container\AdapterFactory::class, + Driver\Pdo\Connection::class => Container\PdoConnectionFactory::class, + Driver\Pdo\Pdo::class => Container\PdoDriverFactory::class, + Result::class => Container\PdoResultFactory::class, + Statement::class => Container\PdoStatementFactory::class, + Platform\Sqlite::class => Container\PlatformInterfaceFactory::class, + Profiler::class => InvokableFactory::class, + ResultSet\ResultSet::class => InvokableFactory::class, Metadata\Source\SqliteMetadata::class => Container\MetadataInterfaceFactory::class, ], 'invokables' => [ diff --git a/src/Container/PdoDriverFactory.php b/src/Container/PdoDriverFactory.php index 31d9bda..dcc8378 100644 --- a/src/Container/PdoDriverFactory.php +++ b/src/Container/PdoDriverFactory.php @@ -19,7 +19,6 @@ final class PdoDriverFactory { public function __invoke(ContainerInterface $container): PdoDriverInterface&PdoDriver { - /** @var ConnectionInterface&Connection $connectionInstance */ $connectionInstance = $container->get(Connection::class); @@ -41,7 +40,6 @@ public static function createFromConfig( ContainerInterface $container, string $requestedName, ): PdoDriverInterface&PdoDriver { - $connectionFactory = ( $container->get(ConnectionInterfaceFactoryFactory::class) )($container, $requestedName); diff --git a/test/integration/Container/TestAsset/SetupTrait.php b/test/integration/Container/TestAsset/SetupTrait.php index ab0aad9..bd87ab5 100644 --- a/test/integration/Container/TestAsset/SetupTrait.php +++ b/test/integration/Container/TestAsset/SetupTrait.php @@ -1,101 +1,101 @@ - []]; - - protected ?AdapterInterface $adapter; - - protected ContainerInterface $container; - - protected DriverInterface|string|null $driver; - - #[Override] - protected function setUp(): void - { - $this->getAdapter(); - parent::setUp(); - } - - protected function getAdapter(array $config = []): AdapterInterface - { - $connectionConfig = [ - 'db' => [ - 'driver' => $this->driver ?? Pdo::class, - 'connection' => [ - 'dsn' => 'sqlite::memory:', - 'charset' => 'utf8', - 'driver_options' => [], - ], - 'options' => [ - //'buffer_results' => false, - ], - ], - ]; - - // merge service config from both PhpDb and PhpDb\Adapter\Mysql - $serviceManagerConfig = ArrayUtils::merge( - (new LaminasDbConfigProvider())()['dependencies'], - (new ConfigProvider())()['dependencies'] - ); - - $serviceManagerConfig = ArrayUtils::merge( - $serviceManagerConfig, - $connectionConfig - ); - - // prefer passed config over environment variables - if ($config !== []) { - $serviceManagerConfig = ArrayUtils::merge($serviceManagerConfig, $config); - } - - $serviceManagerConfig = ArrayUtils::merge( - $serviceManagerConfig, - [ - 'services' => [ - 'config' => $serviceManagerConfig, - ], - ] - ); - - $this->config = $serviceManagerConfig; - $this->container = new ServiceManager($this->config); - $this->adapter = $this->container->get(AdapterInterface::class); - - return $this->adapter; - } - - protected function getConfig(): array - { - return $this->config; - } - - protected function getHostname(): string - { - return $this->getConfig()['db']['connection']['hostname']; - } -} + []]; + + protected ?AdapterInterface $adapter; + + protected ContainerInterface $container; + + protected DriverInterface|string|null $driver; + + #[Override] + protected function setUp(): void + { + $this->getAdapter(); + parent::setUp(); + } + + protected function getAdapter(array $config = []): AdapterInterface + { + $connectionConfig = [ + 'db' => [ + 'driver' => $this->driver ?? Pdo::class, + 'connection' => [ + 'dsn' => 'sqlite::memory:', + 'charset' => 'utf8', + 'driver_options' => [], + ], + 'options' => [ + //'buffer_results' => false, + ], + ], + ]; + + // merge service config from both PhpDb and PhpDb\Adapter\Mysql + $serviceManagerConfig = ArrayUtils::merge( + (new LaminasDbConfigProvider())()['dependencies'], + (new ConfigProvider())()['dependencies'] + ); + + $serviceManagerConfig = ArrayUtils::merge( + $serviceManagerConfig, + $connectionConfig + ); + + // prefer passed config over environment variables + if ($config !== []) { + $serviceManagerConfig = ArrayUtils::merge($serviceManagerConfig, $config); + } + + $serviceManagerConfig = ArrayUtils::merge( + $serviceManagerConfig, + [ + 'services' => [ + 'config' => $serviceManagerConfig, + ], + ] + ); + + $this->config = $serviceManagerConfig; + $this->container = new ServiceManager($this->config); + $this->adapter = $this->container->get(AdapterInterface::class); + + return $this->adapter; + } + + protected function getConfig(): array + { + return $this->config; + } + + protected function getHostname(): string + { + return $this->getConfig()['db']['connection']['hostname']; + } +} diff --git a/test/unit/ConfigProviderTest.php b/test/unit/ConfigProviderTest.php index c078f22..b91adc6 100644 --- a/test/unit/ConfigProviderTest.php +++ b/test/unit/ConfigProviderTest.php @@ -1,200 +1,200 @@ -configProvider = new ConfigProvider(); - } - - public function testInvokeReturnsExpectedStructure(): void - { - $config = ($this->configProvider)(); - - self::assertIsArray($config); - self::assertArrayHasKey('dependencies', $config); - } - - public function testGetDependenciesReturnsCorrectStructure(): void - { - $dependencies = $this->configProvider->getDependencies(); - - self::assertIsArray($dependencies); - self::assertArrayHasKey('abstract_factories', $dependencies); - self::assertArrayHasKey('aliases', $dependencies); - self::assertArrayHasKey('factories', $dependencies); - self::assertArrayHasKey('invokables', $dependencies); - } - - public function testGetDependenciesContainsAbstractFactories(): void - { - $dependencies = $this->configProvider->getDependencies(); - - self::assertContains( - AdapterAbstractServiceFactory::class, - $dependencies['abstract_factories'] - ); - } - - public function testGetDependenciesContainsMetadataAlias(): void - { - $dependencies = $this->configProvider->getDependencies(); - - self::assertArrayHasKey(MetadataInterface::class, $dependencies['aliases']); - self::assertSame( - SqliteMetadata::class, - $dependencies['aliases'][MetadataInterface::class] - ); - } - - public function testGetDependenciesContainsMetadataFactory(): void - { - $dependencies = $this->configProvider->getDependencies(); - - self::assertArrayHasKey(SqliteMetadata::class, $dependencies['factories']); - self::assertSame( - Container\MetadataInterfaceFactory::class, - $dependencies['factories'][SqliteMetadata::class] - ); - } - - public function testConfigReturnsCorrectStructure(): void - { - $config = $this->configProvider->getDependencies(); - - self::assertIsArray($config); - self::assertArrayHasKey('aliases', $config); - self::assertArrayHasKey('factories', $config); - self::assertArrayHasKey('invokables', $config); - } - - public function testGetDependenciesContainsDriverAliases(): void - { - $config = $this->configProvider->getDependencies(); - - $expectedAliases = [ - 'SQLite' => Pdo::class, - 'Sqlite' => Pdo::class, - 'sqlite' => Pdo::class, - 'pdo' => Pdo::class, - 'pdo_sqlite' => Pdo::class, - 'pdosqlite' => Pdo::class, - 'pdodriver' => Pdo::class, - ]; - - foreach ($expectedAliases as $alias => $target) { - self::assertArrayHasKey($alias, $config['aliases']); - self::assertSame($target, $config['aliases'][$alias]); - } - } - - public function testGetDependenciesContainsInterfaceAliases(): void - { - $config = $this->configProvider->getDependencies(); - - $expectedAliases = [ - ConnectionInterface::class => Connection::class, - PdoConnectionInterface::class => Connection::class, - DriverInterface::class => Pdo::class, - PdoDriverInterface::class => Pdo::class, - PlatformInterface::class => Sqlite::class, - ProfilerInterface::class => Profiler::class, - ResultInterface::class => Result::class, - ResultSet\ResultSetInterface::class => ResultSet\ResultSet::class, - StatementInterface::class => Statement::class, - ]; - - foreach ($expectedAliases as $interface => $implementation) { - self::assertArrayHasKey($interface, $config['aliases']); - self::assertSame($implementation, $config['aliases'][$interface]); - } - } - - public function testConfigContainsFactoryFactoryAliases(): void - { - $config = $this->configProvider->getDependencies(); - - $expectedAliases = [ - ConnectionInterfaceFactoryFactoryInterface::class => Container\ConnectionInterfaceFactoryFactory::class, - DriverInterfaceFactoryFactoryInterface::class => Container\DriverInterfaceFactoryFactory::class, - PlatformInterfaceFactoryFactoryInterface::class => Container\PlatformInterfaceFactoryFactory::class, - ]; - - foreach ($expectedAliases as $interface => $implementation) { - self::assertArrayHasKey($interface, $config['aliases']); - self::assertSame($implementation, $config['aliases'][$interface]); - } - } - - public function testConfigContainsFactories(): void - { - $config = $this->configProvider->getDependencies(); - - $expectedFactories = [ - AdapterInterface::class => Container\AdapterFactory::class, - Connection::class => Container\PdoConnectionFactory::class, - Pdo::class => Container\PdoDriverFactory::class, - Result::class => Container\PdoResultFactory::class, - Statement::class => Container\PdoStatementFactory::class, - Sqlite::class => Container\PlatformInterfaceFactory::class, - Profiler::class => InvokableFactory::class, - ResultSet\ResultSet::class => InvokableFactory::class, - ]; - - foreach ($expectedFactories as $service => $factory) { - self::assertArrayHasKey($service, $config['factories']); - self::assertSame($factory, $config['factories'][$service]); - } - } - - public function testConfigContainsInvokables(): void - { - $config = $this->configProvider->getDependencies(); - - $expectedInvokables = [ - Container\ConnectionInterfaceFactoryFactory::class, - Container\DriverInterfaceFactoryFactory::class, - Container\PlatformInterfaceFactoryFactory::class, - ]; - - foreach ($expectedInvokables as $invokable) { - self::assertArrayHasKey($invokable, $config['invokables']); - self::assertSame($invokable, $config['invokables'][$invokable]); - } - } -} +configProvider = new ConfigProvider(); + } + + public function testInvokeReturnsExpectedStructure(): void + { + $config = ($this->configProvider)(); + + self::assertIsArray($config); + self::assertArrayHasKey('dependencies', $config); + } + + public function testGetDependenciesReturnsCorrectStructure(): void + { + $dependencies = $this->configProvider->getDependencies(); + + self::assertIsArray($dependencies); + self::assertArrayHasKey('abstract_factories', $dependencies); + self::assertArrayHasKey('aliases', $dependencies); + self::assertArrayHasKey('factories', $dependencies); + self::assertArrayHasKey('invokables', $dependencies); + } + + public function testGetDependenciesContainsAbstractFactories(): void + { + $dependencies = $this->configProvider->getDependencies(); + + self::assertContains( + AdapterAbstractServiceFactory::class, + $dependencies['abstract_factories'] + ); + } + + public function testGetDependenciesContainsMetadataAlias(): void + { + $dependencies = $this->configProvider->getDependencies(); + + self::assertArrayHasKey(MetadataInterface::class, $dependencies['aliases']); + self::assertSame( + SqliteMetadata::class, + $dependencies['aliases'][MetadataInterface::class] + ); + } + + public function testGetDependenciesContainsMetadataFactory(): void + { + $dependencies = $this->configProvider->getDependencies(); + + self::assertArrayHasKey(SqliteMetadata::class, $dependencies['factories']); + self::assertSame( + Container\MetadataInterfaceFactory::class, + $dependencies['factories'][SqliteMetadata::class] + ); + } + + public function testConfigReturnsCorrectStructure(): void + { + $config = $this->configProvider->getDependencies(); + + self::assertIsArray($config); + self::assertArrayHasKey('aliases', $config); + self::assertArrayHasKey('factories', $config); + self::assertArrayHasKey('invokables', $config); + } + + public function testGetDependenciesContainsDriverAliases(): void + { + $config = $this->configProvider->getDependencies(); + + $expectedAliases = [ + 'SQLite' => Pdo::class, + 'Sqlite' => Pdo::class, + 'sqlite' => Pdo::class, + 'pdo' => Pdo::class, + 'pdo_sqlite' => Pdo::class, + 'pdosqlite' => Pdo::class, + 'pdodriver' => Pdo::class, + ]; + + foreach ($expectedAliases as $alias => $target) { + self::assertArrayHasKey($alias, $config['aliases']); + self::assertSame($target, $config['aliases'][$alias]); + } + } + + public function testGetDependenciesContainsInterfaceAliases(): void + { + $config = $this->configProvider->getDependencies(); + + $expectedAliases = [ + ConnectionInterface::class => Connection::class, + PdoConnectionInterface::class => Connection::class, + DriverInterface::class => Pdo::class, + PdoDriverInterface::class => Pdo::class, + PlatformInterface::class => Sqlite::class, + ProfilerInterface::class => Profiler::class, + ResultInterface::class => Result::class, + ResultSet\ResultSetInterface::class => ResultSet\ResultSet::class, + StatementInterface::class => Statement::class, + ]; + + foreach ($expectedAliases as $interface => $implementation) { + self::assertArrayHasKey($interface, $config['aliases']); + self::assertSame($implementation, $config['aliases'][$interface]); + } + } + + public function testConfigContainsFactoryFactoryAliases(): void + { + $config = $this->configProvider->getDependencies(); + + $expectedAliases = [ + ConnectionInterfaceFactoryFactoryInterface::class => Container\ConnectionInterfaceFactoryFactory::class, + DriverInterfaceFactoryFactoryInterface::class => Container\DriverInterfaceFactoryFactory::class, + PlatformInterfaceFactoryFactoryInterface::class => Container\PlatformInterfaceFactoryFactory::class, + ]; + + foreach ($expectedAliases as $interface => $implementation) { + self::assertArrayHasKey($interface, $config['aliases']); + self::assertSame($implementation, $config['aliases'][$interface]); + } + } + + public function testConfigContainsFactories(): void + { + $config = $this->configProvider->getDependencies(); + + $expectedFactories = [ + AdapterInterface::class => Container\AdapterFactory::class, + Connection::class => Container\PdoConnectionFactory::class, + Pdo::class => Container\PdoDriverFactory::class, + Result::class => Container\PdoResultFactory::class, + Statement::class => Container\PdoStatementFactory::class, + Sqlite::class => Container\PlatformInterfaceFactory::class, + Profiler::class => InvokableFactory::class, + ResultSet\ResultSet::class => InvokableFactory::class, + ]; + + foreach ($expectedFactories as $service => $factory) { + self::assertArrayHasKey($service, $config['factories']); + self::assertSame($factory, $config['factories'][$service]); + } + } + + public function testConfigContainsInvokables(): void + { + $config = $this->configProvider->getDependencies(); + + $expectedInvokables = [ + Container\ConnectionInterfaceFactoryFactory::class, + Container\DriverInterfaceFactoryFactory::class, + Container\PlatformInterfaceFactoryFactory::class, + ]; + + foreach ($expectedInvokables as $invokable) { + self::assertArrayHasKey($invokable, $config['invokables']); + self::assertSame($invokable, $config['invokables'][$invokable]); + } + } +} diff --git a/test/unit/Container/ConnectionInterfaceFactoryFactoryTest.php b/test/unit/Container/ConnectionInterfaceFactoryFactoryTest.php index 5b612e6..a5a4783 100644 --- a/test/unit/Container/ConnectionInterfaceFactoryFactoryTest.php +++ b/test/unit/Container/ConnectionInterfaceFactoryFactoryTest.php @@ -1,130 +1,130 @@ -createMock(ContainerInterface::class); - $containerMock->method('get')->willReturnMap([ - [ - 'config', - [ - 'dependencies' => [ - 'aliases' => [ - 'sqlite' => Pdo::class, - ], - ], - 'db' => [ - 'adapters' => [ - 'test_adapter' => [ - 'driver' => 'sqlite', - ], - ], - ], - ], - ], - ]); - - $factoryFactory = new ConnectionInterfaceFactoryFactory(); - $result = $factoryFactory($containerMock, 'test_adapter'); - - self::assertIsCallable($result); - } - - public function testInvokeReturnsPdoConnectionFactory(): void - { - $containerMock = $this->createMock(ContainerInterface::class); - $containerMock->method('get')->willReturnMap([ - [ - 'config', - [ - 'dependencies' => [ - 'aliases' => [ - 'sqlite' => Pdo::class, - ], - ], - 'db' => [ - 'adapters' => [ - 'test_adapter' => [ - 'driver' => 'sqlite', - ], - ], - ], - ], - ], - ]); - - $factoryFactory = new ConnectionInterfaceFactoryFactory(); - $result = $factoryFactory($containerMock, 'test_adapter'); - - self::assertInstanceOf(PdoConnectionFactory::class, $result); - } - - public function testInvokeThrowsExceptionWhenDriverNotConfigured(): void - { - $containerMock = $this->createMock(ContainerInterface::class); - $containerMock->method('get')->willReturnMap([ - [ - 'config', - [ - 'db' => [ - 'adapters' => [ - 'test_adapter' => [], - ], - ], - ], - ], - ]); - - $factoryFactory = new ConnectionInterfaceFactoryFactory(); - - $this->expectException(RuntimeException::class); - $this->expectExceptionMessage('Named adapter "test_adapter" is not configured with a driver'); - - $factoryFactory($containerMock, 'test_adapter'); - } - - public function testInvokeThrowsExceptionForUnknownDriver(): void - { - $containerMock = $this->createMock(ContainerInterface::class); - $containerMock->method('get')->willReturnMap([ - [ - 'config', - [ - 'dependencies' => [ - 'aliases' => [ - 'sqlite' => Pdo::class, - ], - ], - 'db' => [ - 'adapters' => [ - 'test_adapter' => [ - 'driver' => 'unknown', - ], - ], - ], - ], - ], - ]); - - $factoryFactory = new ConnectionInterfaceFactoryFactory(); - - $this->expectException(RuntimeException::class); - $this->expectExceptionMessage('No connection factory found for driver "unknown"'); - - $factoryFactory($containerMock, 'test_adapter'); - } -} +createMock(ContainerInterface::class); + $containerMock->method('get')->willReturnMap([ + [ + 'config', + [ + 'dependencies' => [ + 'aliases' => [ + 'sqlite' => Pdo::class, + ], + ], + 'db' => [ + 'adapters' => [ + 'test_adapter' => [ + 'driver' => 'sqlite', + ], + ], + ], + ], + ], + ]); + + $factoryFactory = new ConnectionInterfaceFactoryFactory(); + $result = $factoryFactory($containerMock, 'test_adapter'); + + self::assertIsCallable($result); + } + + public function testInvokeReturnsPdoConnectionFactory(): void + { + $containerMock = $this->createMock(ContainerInterface::class); + $containerMock->method('get')->willReturnMap([ + [ + 'config', + [ + 'dependencies' => [ + 'aliases' => [ + 'sqlite' => Pdo::class, + ], + ], + 'db' => [ + 'adapters' => [ + 'test_adapter' => [ + 'driver' => 'sqlite', + ], + ], + ], + ], + ], + ]); + + $factoryFactory = new ConnectionInterfaceFactoryFactory(); + $result = $factoryFactory($containerMock, 'test_adapter'); + + self::assertInstanceOf(PdoConnectionFactory::class, $result); + } + + public function testInvokeThrowsExceptionWhenDriverNotConfigured(): void + { + $containerMock = $this->createMock(ContainerInterface::class); + $containerMock->method('get')->willReturnMap([ + [ + 'config', + [ + 'db' => [ + 'adapters' => [ + 'test_adapter' => [], + ], + ], + ], + ], + ]); + + $factoryFactory = new ConnectionInterfaceFactoryFactory(); + + $this->expectException(RuntimeException::class); + $this->expectExceptionMessage('Named adapter "test_adapter" is not configured with a driver'); + + $factoryFactory($containerMock, 'test_adapter'); + } + + public function testInvokeThrowsExceptionForUnknownDriver(): void + { + $containerMock = $this->createMock(ContainerInterface::class); + $containerMock->method('get')->willReturnMap([ + [ + 'config', + [ + 'dependencies' => [ + 'aliases' => [ + 'sqlite' => Pdo::class, + ], + ], + 'db' => [ + 'adapters' => [ + 'test_adapter' => [ + 'driver' => 'unknown', + ], + ], + ], + ], + ], + ]); + + $factoryFactory = new ConnectionInterfaceFactoryFactory(); + + $this->expectException(RuntimeException::class); + $this->expectExceptionMessage('No connection factory found for driver "unknown"'); + + $factoryFactory($containerMock, 'test_adapter'); + } +} diff --git a/test/unit/Container/DriverInterfaceFactoryFactoryTest.php b/test/unit/Container/DriverInterfaceFactoryFactoryTest.php index 4f385fc..9a04f33 100644 --- a/test/unit/Container/DriverInterfaceFactoryFactoryTest.php +++ b/test/unit/Container/DriverInterfaceFactoryFactoryTest.php @@ -1,137 +1,137 @@ -createMock(ContainerInterface::class); - $containerMock->method('get')->willReturnMap([ - [ - 'config', - [ - 'dependencies' => [ - 'aliases' => [ - 'sqlite' => Pdo::class, - ], - 'factories' => [ - Pdo::class => PdoDriverFactory::class, - ], - ], - 'db' => [ - 'adapters' => [ - 'test_adapter' => [ - 'driver' => 'sqlite', - ], - ], - ], - ], - ], - ]); - - $factoryFactory = new DriverInterfaceFactoryFactory(); - $result = $factoryFactory($containerMock, 'test_adapter'); - - self::assertIsCallable($result); - } - - public function testInvokeReturnsPdoDriverFactory(): void - { - $containerMock = $this->createMock(ContainerInterface::class); - $containerMock->method('get')->willReturnMap([ - [ - 'config', - [ - 'dependencies' => [ - 'aliases' => [ - 'sqlite' => Pdo::class, - ], - 'factories' => [ - Pdo::class => PdoDriverFactory::class, - ], - ], - 'db' => [ - 'adapters' => [ - 'test_adapter' => [ - 'driver' => 'sqlite', - ], - ], - ], - ], - ], - ]); - - $factoryFactory = new DriverInterfaceFactoryFactory(); - $result = $factoryFactory($containerMock, 'test_adapter'); - - self::assertInstanceOf(PdoDriverFactory::class, $result); - } - - public function testInvokeThrowsExceptionWhenDriverNotConfigured(): void - { - $containerMock = $this->createMock(ContainerInterface::class); - $containerMock->method('get')->willReturnMap([ - [ - 'config', - [ - 'db' => [ - 'adapters' => [ - 'test_adapter' => [], - ], - ], - ], - ], - ]); - - $factoryFactory = new DriverInterfaceFactoryFactory(); - - $this->expectException(RuntimeException::class); - $this->expectExceptionMessage('Named adapter "test_adapter" is not configured with a driver'); - - $factoryFactory($containerMock, 'test_adapter'); - } - - public function testInvokeWithDriverNotInAliases(): void - { - $containerMock = $this->createMock(ContainerInterface::class); - $containerMock->method('get')->willReturnMap([ - [ - 'config', - [ - 'dependencies' => [ - 'aliases' => [ - 'sqlite' => Pdo::class, - ], - 'factories' => [ - Pdo::class => PdoDriverFactory::class, - ], - ], - 'db' => [ - 'adapters' => [ - 'test_adapter' => [ - 'driver' => Pdo::class, - ], - ], - ], - ], - ], - ]); - - $factoryFactory = new DriverInterfaceFactoryFactory(); - $result = $factoryFactory($containerMock, 'test_adapter'); - - self::assertInstanceOf(PdoDriverFactory::class, $result); - } -} +createMock(ContainerInterface::class); + $containerMock->method('get')->willReturnMap([ + [ + 'config', + [ + 'dependencies' => [ + 'aliases' => [ + 'sqlite' => Pdo::class, + ], + 'factories' => [ + Pdo::class => PdoDriverFactory::class, + ], + ], + 'db' => [ + 'adapters' => [ + 'test_adapter' => [ + 'driver' => 'sqlite', + ], + ], + ], + ], + ], + ]); + + $factoryFactory = new DriverInterfaceFactoryFactory(); + $result = $factoryFactory($containerMock, 'test_adapter'); + + self::assertIsCallable($result); + } + + public function testInvokeReturnsPdoDriverFactory(): void + { + $containerMock = $this->createMock(ContainerInterface::class); + $containerMock->method('get')->willReturnMap([ + [ + 'config', + [ + 'dependencies' => [ + 'aliases' => [ + 'sqlite' => Pdo::class, + ], + 'factories' => [ + Pdo::class => PdoDriverFactory::class, + ], + ], + 'db' => [ + 'adapters' => [ + 'test_adapter' => [ + 'driver' => 'sqlite', + ], + ], + ], + ], + ], + ]); + + $factoryFactory = new DriverInterfaceFactoryFactory(); + $result = $factoryFactory($containerMock, 'test_adapter'); + + self::assertInstanceOf(PdoDriverFactory::class, $result); + } + + public function testInvokeThrowsExceptionWhenDriverNotConfigured(): void + { + $containerMock = $this->createMock(ContainerInterface::class); + $containerMock->method('get')->willReturnMap([ + [ + 'config', + [ + 'db' => [ + 'adapters' => [ + 'test_adapter' => [], + ], + ], + ], + ], + ]); + + $factoryFactory = new DriverInterfaceFactoryFactory(); + + $this->expectException(RuntimeException::class); + $this->expectExceptionMessage('Named adapter "test_adapter" is not configured with a driver'); + + $factoryFactory($containerMock, 'test_adapter'); + } + + public function testInvokeWithDriverNotInAliases(): void + { + $containerMock = $this->createMock(ContainerInterface::class); + $containerMock->method('get')->willReturnMap([ + [ + 'config', + [ + 'dependencies' => [ + 'aliases' => [ + 'sqlite' => Pdo::class, + ], + 'factories' => [ + Pdo::class => PdoDriverFactory::class, + ], + ], + 'db' => [ + 'adapters' => [ + 'test_adapter' => [ + 'driver' => Pdo::class, + ], + ], + ], + ], + ], + ]); + + $factoryFactory = new DriverInterfaceFactoryFactory(); + $result = $factoryFactory($containerMock, 'test_adapter'); + + self::assertInstanceOf(PdoDriverFactory::class, $result); + } +}