Initial commit, cloned from lumax/dependency-injection-component
This commit is contained in:
commit
5ee5de9ef1
19 changed files with 3440 additions and 0 deletions
5
.gitattributes
vendored
Normal file
5
.gitattributes
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
/tests/ export-ignore
|
||||||
|
Jenkinsfile export-ignore
|
||||||
|
phpunit.xml export-ignore
|
||||||
|
.gitignore export-ignore
|
||||||
|
.gitattributes export-ignore
|
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
/.idea
|
||||||
|
/vendor
|
||||||
|
/node_modules
|
||||||
|
/coverage
|
||||||
|
/.phpunit.result.cache
|
35
CHANGELOG.md
Normal file
35
CHANGELOG.md
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
# Luma | Dependency Injection Component Change Log
|
||||||
|
|
||||||
|
## [1.3.0] - 2024-05-05
|
||||||
|
### Added
|
||||||
|
- Add support for configuration parameters as service arguments
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- N/A
|
||||||
|
|
||||||
|
### Deprecated
|
||||||
|
- N/A
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
- N/A
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- N/A
|
||||||
|
|
||||||
|
### Security
|
||||||
|
- Updated dependencies
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [1.2.2] - 2024-03-02
|
||||||
|
- Minor housekeeping; `package.json` cleanup, `composer.json` cleanup
|
||||||
|
- Update build pipelines
|
||||||
|
|
||||||
|
## [1.2.1] - 2024-02-23
|
||||||
|
- Update build pipelines
|
||||||
|
|
||||||
|
## [1.2.0] - 2024-02-22
|
||||||
|
- Added CHANGELOG
|
||||||
|
- Added automated build pipeline
|
||||||
|
- `DependencyManager` now throws a RuntimeException if `loadDependenciesFromFile` is called with an invalid filetype (such as JSON).
|
||||||
|
- Increased test coverage to 100%
|
89
README.md
Normal file
89
README.md
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
# Luma | Dependency Injection Component
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<!-- Version Badge -->
|
||||||
|
<img src="https://img.shields.io/badge/Version-1.3.0-blue" alt="Version 1.3.0">
|
||||||
|
<!-- PHP Coverage Badge -->
|
||||||
|
<img src="https://img.shields.io/badge/PHP Coverage-96.36%25-green" alt="PHP Coverage 96.36%">
|
||||||
|
<!-- License Badge -->
|
||||||
|
<img src="https://img.shields.io/badge/License-GPL--3.0--or--later-34ad9b" alt="License GPL--3.0--or--later">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
A PHP package for managing dependencies and dependency injection.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
You can install this package via [Composer](https://getcomposer.org/):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
composer require lumax/dependency-injection-component
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### DependencyContainer
|
||||||
|
|
||||||
|
The `DependencyContainer` class provides a simple way to manage and retrieve dependencies. You can add and retrieve
|
||||||
|
dependencies as follows:
|
||||||
|
|
||||||
|
```php
|
||||||
|
use Loom\DependencyInjectionComponent\DependencyContainer;
|
||||||
|
|
||||||
|
// Create a container
|
||||||
|
$container = new DependencyContainer();
|
||||||
|
|
||||||
|
// Add a dependency
|
||||||
|
$container->add(MyDependency::class, new MyDependency());
|
||||||
|
|
||||||
|
// Retrieve a dependency
|
||||||
|
$dependency = $container->get(MyDependency::class);
|
||||||
|
```
|
||||||
|
|
||||||
|
### DependencyManager
|
||||||
|
|
||||||
|
The `DependencyManager` class allows you to load dependencies from a YAML configuration file and register them in a
|
||||||
|
`DependencyContainer`. Here's an example of how to use it:
|
||||||
|
|
||||||
|
```php
|
||||||
|
use Loom\DependencyInjectionComponent\DependencyContainer;
|
||||||
|
use Loom\DependencyInjectionComponent\DependencyManager;
|
||||||
|
|
||||||
|
// Create a container
|
||||||
|
$container = new DependencyContainer();
|
||||||
|
|
||||||
|
// Create a manager and load dependencies from a YAML file
|
||||||
|
$manager = new DependencyManager($container);
|
||||||
|
$manager->loadDependenciesFromFile('path/to/dependencies.yaml');
|
||||||
|
```
|
||||||
|
|
||||||
|
In your YAML configuration file (`dependencies.yaml`), you can define services and their arguments for injection.
|
||||||
|
|
||||||
|
### Setting Up Your Services/Dependencies Definitions
|
||||||
|
|
||||||
|
Here's an example of a `dependencies.yaml` file that demonstrates how to define services and their arguments for injection:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
myService:
|
||||||
|
class: 'Namespace\MyService'
|
||||||
|
arguments:
|
||||||
|
- 'argument1'
|
||||||
|
- 'argument2'
|
||||||
|
- '@anotherService' # Inject another service
|
||||||
|
```
|
||||||
|
|
||||||
|
Here's a breakdown of the elements in the dependencies.yaml file:
|
||||||
|
|
||||||
|
- `services`: This section defines the services and their configurations.
|
||||||
|
- `alias`: Your chosen alias for the service - `myService`.
|
||||||
|
- `class`: The fully qualified class name of the service class.
|
||||||
|
- `arguments`: An array of constructor arguments. Use "@" to reference other services.
|
||||||
|
|
||||||
|
Once you've set up your `dependencies.yaml` file with the desired services and configurations, you can load and manage
|
||||||
|
these dependencies using the Dependency Injection Package.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
This package is open-source software licensed under the [GNU General Public License, version 3.0 (GPL-3.0)](https://opensource.org/licenses/GPL-3.0).
|
35
composer.json
Normal file
35
composer.json
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
{
|
||||||
|
"name": "loomlabs/loom.di-component",
|
||||||
|
"description": "A Dependency Injection Package",
|
||||||
|
"type": "library",
|
||||||
|
"minimum-stability": "stable",
|
||||||
|
"require": {
|
||||||
|
"symfony/yaml": "^6.3",
|
||||||
|
"psr/container": "^2.0",
|
||||||
|
"lumax/framework-component": "^1.1"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "^10.3"
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Loom\\DependencyInjectionComponent\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload-dev": {
|
||||||
|
"psr-4": {
|
||||||
|
"Loom\\DependencyInjectionComponent\\Tests\\": "tests/Unit/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"test": "php -d xdebug.mode=coverage ./vendor/bin/phpunit --testdox --colors=always --coverage-html coverage --coverage-clover coverage/coverage.xml --testdox-html coverage/testdox.html && npx badger --phpunit ./coverage/coverage.xml && npx badger --version ./composer.json && npx badger --license ./composer.json"
|
||||||
|
},
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Daniel Winning",
|
||||||
|
"email": "daniel@winningsoftware.co.uk"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"version": "1.3.0",
|
||||||
|
"license": "GPL-3.0-or-later"
|
||||||
|
}
|
2779
composer.lock
generated
Normal file
2779
composer.lock
generated
Normal file
File diff suppressed because it is too large
Load diff
14
package-lock.json
generated
Normal file
14
package-lock.json
generated
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
{
|
||||||
|
"name": "dependency-injection",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"lockfileVersion": 1,
|
||||||
|
"requires": true,
|
||||||
|
"dependencies": {
|
||||||
|
"@dannyxcii/badger": {
|
||||||
|
"version": "0.4.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@dannyxcii/badger/-/badger-0.4.1.tgz",
|
||||||
|
"integrity": "sha512-fK39595AbeKiajI6cxI+Odov+/r8aWXLItNELoxFhf59uzTEI6lL7JUm2t7GyBi0OZieO+7me1zWdRkIONdFOQ==",
|
||||||
|
"dev": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
16
package.json
Normal file
16
package.json
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
{
|
||||||
|
"description": "A PHP package for managing dependencies and dependency injection.",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/DanielWinning/dependency-injection-component.git"
|
||||||
|
},
|
||||||
|
"author": "Daniel Winning <daniel@winningsoftware.co.uk>",
|
||||||
|
"license": "GPL-3.0-or-later",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/DanielWinning/dependency-injection-component/issues"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/DanielWinning/dependency-injection-component#readme",
|
||||||
|
"devDependencies": {
|
||||||
|
"@dannyxcii/badger": "^0.4.1"
|
||||||
|
}
|
||||||
|
}
|
22
phpunit.xml
Normal file
22
phpunit.xml
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<phpunit colors="true"
|
||||||
|
bootstrap="vendor/autoload.php"
|
||||||
|
displayDetailsOnIncompleteTests="true"
|
||||||
|
displayDetailsOnSkippedTests="true"
|
||||||
|
displayDetailsOnTestsThatTriggerDeprecations="true"
|
||||||
|
displayDetailsOnTestsThatTriggerWarnings="true"
|
||||||
|
displayDetailsOnTestsThatTriggerNotices="true"
|
||||||
|
failOnWarning="true"
|
||||||
|
failOnRisky="true">
|
||||||
|
<testsuites>
|
||||||
|
<testsuite name="Unit Tests">
|
||||||
|
<directory>tests/Unit</directory>
|
||||||
|
</testsuite>
|
||||||
|
</testsuites>
|
||||||
|
<coverage/>
|
||||||
|
<source>
|
||||||
|
<include>
|
||||||
|
<directory suffix=".php">src</directory>
|
||||||
|
</include>
|
||||||
|
</source>
|
||||||
|
</phpunit>
|
80
src/DependencyContainer.php
Normal file
80
src/DependencyContainer.php
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Loom\DependencyInjectionComponent;
|
||||||
|
|
||||||
|
use Loom\DependencyInjectionComponent\Exception\NotFoundException;
|
||||||
|
use Psr\Container\ContainerInterface;
|
||||||
|
|
||||||
|
class DependencyContainer implements ContainerInterface
|
||||||
|
{
|
||||||
|
private array $container = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $key
|
||||||
|
* @param mixed $value
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function add(string $key, mixed $value): void
|
||||||
|
{
|
||||||
|
$this->container[$key] = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $id
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*
|
||||||
|
* @throws NotFoundException
|
||||||
|
*/
|
||||||
|
public function get($id): mixed
|
||||||
|
{
|
||||||
|
if ($this->has($id)) {
|
||||||
|
return $this->container[$id];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (class_exists($id)) {
|
||||||
|
return $this->resolveService($id);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new NotFoundException("Dependency not found $id");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $id
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function has(string $id): bool
|
||||||
|
{
|
||||||
|
return isset($this->container[$id]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getServices(): array
|
||||||
|
{
|
||||||
|
return $this->container;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resolve a service by its fully qualified class name (FQCN).
|
||||||
|
*
|
||||||
|
* @param string $className
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*
|
||||||
|
* @throws NotFoundException
|
||||||
|
*/
|
||||||
|
private function resolveService(string $className): mixed
|
||||||
|
{
|
||||||
|
foreach ($this->container as $value) {
|
||||||
|
if ($value instanceof $className) {
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new NotFoundException("Dependency not found: $className");
|
||||||
|
}
|
||||||
|
}
|
126
src/DependencyManager.php
Normal file
126
src/DependencyManager.php
Normal file
|
@ -0,0 +1,126 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Loom\DependencyInjectionComponent;
|
||||||
|
|
||||||
|
use Luma\Framework\Luma;
|
||||||
|
use Symfony\Component\Yaml\Yaml;
|
||||||
|
|
||||||
|
class DependencyManager
|
||||||
|
{
|
||||||
|
private DependencyContainer $container;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param DependencyContainer $container
|
||||||
|
*/
|
||||||
|
public function __construct(DependencyContainer $container)
|
||||||
|
{
|
||||||
|
$this->container = $container;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $filename
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*
|
||||||
|
* @throws Exception\NotFoundException
|
||||||
|
*/
|
||||||
|
public function loadDependenciesFromFile(string $filename): void
|
||||||
|
{
|
||||||
|
$loadedConfig = $this->loadConfigFile($filename);
|
||||||
|
|
||||||
|
if (isset($loadedConfig['services'])) {
|
||||||
|
$this->registerServices($loadedConfig['services']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $filename
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
private function loadConfigFile(string $filename): array
|
||||||
|
{
|
||||||
|
if (!str_ends_with($filename, '.yaml')) {
|
||||||
|
throw new \RuntimeException("Invalid dependency configuration in YAML file: $filename");
|
||||||
|
}
|
||||||
|
|
||||||
|
$loadedConfig = Yaml::parseFile($filename);
|
||||||
|
|
||||||
|
if (is_null($loadedConfig)) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $loadedConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $services
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*
|
||||||
|
* @throws Exception\NotFoundException
|
||||||
|
*/
|
||||||
|
private function registerServices(array $services): void
|
||||||
|
{
|
||||||
|
foreach ($services as $key => $config) {
|
||||||
|
$this->validateServiceConfig($config);
|
||||||
|
|
||||||
|
$arguments = $this->resolveServiceArguments($config['arguments'] ?? []);
|
||||||
|
|
||||||
|
$serviceInstance = $this->instantiateService($config['class'], $arguments);
|
||||||
|
|
||||||
|
$this->container->add($key, $serviceInstance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $config
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
private function validateServiceConfig(array $config): void
|
||||||
|
{
|
||||||
|
if (!isset($config['class']) || !class_exists($config['class'])) {
|
||||||
|
throw new \RuntimeException("Invalid service class in configuration");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $arguments
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*
|
||||||
|
* @throws Exception\NotFoundException
|
||||||
|
*/
|
||||||
|
private function resolveServiceArguments(array $arguments): array
|
||||||
|
{
|
||||||
|
$resolvedArguments = [];
|
||||||
|
|
||||||
|
foreach ($arguments as $argument) {
|
||||||
|
if (is_string($argument) && str_starts_with($argument, '@')) {
|
||||||
|
$serviceAlias = ltrim($argument, '@');
|
||||||
|
$resolvedArguments[] = $this->container->get($serviceAlias);
|
||||||
|
} elseif (is_string($argument) && str_starts_with($argument, ':') && str_ends_with($argument, ':')) {
|
||||||
|
$resolvedArguments[] = Luma::getConfigParam(trim($argument, ':'));
|
||||||
|
} else {
|
||||||
|
$resolvedArguments[] = $argument;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $resolvedArguments;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $class
|
||||||
|
* @param array $arguments
|
||||||
|
*
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
private function instantiateService(string $class, array $arguments): object
|
||||||
|
{
|
||||||
|
if (empty($arguments)) {
|
||||||
|
return new $class();
|
||||||
|
} else {
|
||||||
|
return new $class(...$arguments);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
17
src/Exception/NotFoundException.php
Normal file
17
src/Exception/NotFoundException.php
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Loom\DependencyInjectionComponent\Exception;
|
||||||
|
|
||||||
|
use Psr\Container\NotFoundExceptionInterface;
|
||||||
|
|
||||||
|
class NotFoundException extends \Exception implements NotFoundExceptionInterface
|
||||||
|
{
|
||||||
|
public function __construct(string $message = 'Entry not found', int $code = 0, \Throwable $previous = null)
|
||||||
|
{
|
||||||
|
parent::__construct($message, $code, $previous);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
89
tests/Unit/DependencyContainerTest.php
Normal file
89
tests/Unit/DependencyContainerTest.php
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Loom\DependencyInjectionComponent\Tests;
|
||||||
|
|
||||||
|
use Loom\DependencyInjectionComponent\DependencyContainer;
|
||||||
|
use Loom\DependencyInjectionComponent\Exception\NotFoundException;
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
class DependencyContainerTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @return void
|
||||||
|
*
|
||||||
|
* @throws NotFoundException
|
||||||
|
*/
|
||||||
|
public function testAddAndGet(): void
|
||||||
|
{
|
||||||
|
$container = new DependencyContainer();
|
||||||
|
|
||||||
|
$container->add('app.lang', 'en_gb');
|
||||||
|
|
||||||
|
$this->assertEquals('en_gb', $container->get('app.lang'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testHas(): void
|
||||||
|
{
|
||||||
|
$container = new DependencyContainer();
|
||||||
|
|
||||||
|
$container->add('app.lang', 'en_gb');
|
||||||
|
|
||||||
|
$this->assertTrue($container->has('app.lang'));
|
||||||
|
$this->assertFalse($container->has('el'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return void
|
||||||
|
*
|
||||||
|
* @throws NotFoundException
|
||||||
|
*/
|
||||||
|
public function testGetNonExistentKeyThrowsNotFoundException(): void
|
||||||
|
{
|
||||||
|
$container = new DependencyContainer();
|
||||||
|
|
||||||
|
$this->expectException(NotFoundException::class);
|
||||||
|
$container->get('app');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testGetServices(): void
|
||||||
|
{
|
||||||
|
$container = new DependencyContainer();
|
||||||
|
|
||||||
|
$service = new \stdClass();
|
||||||
|
$container->add('test', $service);
|
||||||
|
|
||||||
|
$this->assertEquals(['test' => $service], $container->getServices());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return void
|
||||||
|
*
|
||||||
|
* @throws NotFoundException
|
||||||
|
*/
|
||||||
|
public function testResolveService(): void
|
||||||
|
{
|
||||||
|
$container = new DependencyContainer();
|
||||||
|
|
||||||
|
$service = new \stdClass();
|
||||||
|
$service->testString = 'Test Service';
|
||||||
|
|
||||||
|
$container->add('test', $service);
|
||||||
|
$resolvedService = $container->get('test');
|
||||||
|
|
||||||
|
$this->assertSame($service, $resolvedService);
|
||||||
|
$this->assertEquals($service->testString, $resolvedService->testString);
|
||||||
|
|
||||||
|
$resolvedService = $container->get('\stdClass');
|
||||||
|
$this->assertSame($service, $resolvedService);
|
||||||
|
$this->assertEquals($service->testString, $resolvedService->testString);
|
||||||
|
|
||||||
|
$this->expectException(NotFoundException::class);
|
||||||
|
$container->get('\Exception');
|
||||||
|
}
|
||||||
|
}
|
108
tests/Unit/DependencyManagerTest.php
Normal file
108
tests/Unit/DependencyManagerTest.php
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Loom\DependencyInjectionComponent\Tests;
|
||||||
|
|
||||||
|
use Loom\DependencyInjectionComponent\DependencyContainer;
|
||||||
|
use Loom\DependencyInjectionComponent\DependencyManager;
|
||||||
|
use Loom\DependencyInjectionComponent\Exception\NotFoundException;
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
class DependencyManagerTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testItCreatesAnInstanceOfDependencyManager(): void
|
||||||
|
{
|
||||||
|
$container = new DependencyContainer();
|
||||||
|
$manager = new DependencyManager($container);
|
||||||
|
|
||||||
|
$this->assertInstanceOf(DependencyManager::class, $manager);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return void
|
||||||
|
*
|
||||||
|
* @throws NotFoundException
|
||||||
|
*/
|
||||||
|
public function testItThrowsNoErrorLoadingFromYaml(): void
|
||||||
|
{
|
||||||
|
$container = new DependencyContainer();
|
||||||
|
$manager = new DependencyManager($container);
|
||||||
|
|
||||||
|
$this->expectNotToPerformAssertions();
|
||||||
|
|
||||||
|
$manager->loadDependenciesFromFile($this->getTestServiceConfigPath());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return void
|
||||||
|
*
|
||||||
|
* @throws NotFoundException
|
||||||
|
*/
|
||||||
|
public function testItReturnsExpectedDependency(): void
|
||||||
|
{
|
||||||
|
$container = new DependencyContainer();
|
||||||
|
$manager = new DependencyManager($container);
|
||||||
|
|
||||||
|
$manager->loadDependenciesFromFile($this->getTestServiceConfigPath());
|
||||||
|
$arithmeticError = $container->get('arithmetic_error');
|
||||||
|
|
||||||
|
$this->assertInstanceOf(\ArithmeticError::class, $arithmeticError);
|
||||||
|
$this->assertEquals('Always the same error message', $arithmeticError->getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return void
|
||||||
|
*
|
||||||
|
* @throws NotFoundException
|
||||||
|
*/
|
||||||
|
public function testEmptyServiceConfigReturnsEmptyArray(): void
|
||||||
|
{
|
||||||
|
$container = new DependencyContainer();
|
||||||
|
$manager = new DependencyManager($container);
|
||||||
|
|
||||||
|
$manager->loadDependenciesFromFile($this->getTestServiceConfigPath('_empty'));
|
||||||
|
|
||||||
|
$this->assertEquals([], $container->getServices());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return void
|
||||||
|
*
|
||||||
|
* @throws NotFoundException
|
||||||
|
*/
|
||||||
|
public function testInvalidServiceConfigThrowsRuntimeException(): void
|
||||||
|
{
|
||||||
|
$container = new DependencyContainer();
|
||||||
|
$manager = new DependencyManager($container);
|
||||||
|
|
||||||
|
$this->expectException(\RuntimeException::class);
|
||||||
|
$manager->loadDependenciesFromFile($this->getTestServiceConfigPath('_invalid_class'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return void
|
||||||
|
*
|
||||||
|
* @throws NotFoundException
|
||||||
|
*/
|
||||||
|
public function testInvalidFileTypeThrowsRuntimeException(): void
|
||||||
|
{
|
||||||
|
$container = new DependencyContainer();
|
||||||
|
$manager = new DependencyManager($container);
|
||||||
|
|
||||||
|
self::expectException(\RuntimeException::class);
|
||||||
|
$manager->loadDependenciesFromFile($this->getTestServiceConfigPath('', 'services.json'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $append
|
||||||
|
*
|
||||||
|
* @param string|null $customName
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
private function getTestServiceConfigPath(string $append = '', string $customName = null): string
|
||||||
|
{
|
||||||
|
return sprintf('%s/%s', dirname(__FILE__, 2), $customName ?? "services$append.yaml");
|
||||||
|
}
|
||||||
|
}
|
1
tests/config.yaml
Normal file
1
tests/config.yaml
Normal file
|
@ -0,0 +1 @@
|
||||||
|
test_string: 'Test string'
|
0
tests/services.json
Normal file
0
tests/services.json
Normal file
16
tests/services.yaml
Normal file
16
tests/services.yaml
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
services:
|
||||||
|
stdcl:
|
||||||
|
class: \stdClass
|
||||||
|
arguments: []
|
||||||
|
standard_exception:
|
||||||
|
class: \Exception
|
||||||
|
arguments:
|
||||||
|
- 'Always the same error message'
|
||||||
|
arithmetic_error:
|
||||||
|
class: \ArithmeticError
|
||||||
|
arguments:
|
||||||
|
message: 'Always the same error message'
|
||||||
|
code: 0
|
||||||
|
previous: '@standard_exception'
|
||||||
|
assertion_error:
|
||||||
|
class: \AssertionError
|
0
tests/services_empty.yaml
Normal file
0
tests/services_empty.yaml
Normal file
3
tests/services_invalid_class.yaml
Normal file
3
tests/services_invalid_class.yaml
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
services:
|
||||||
|
test:
|
||||||
|
arguments: []
|
Loading…
Add table
Reference in a new issue