1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
|
<?php
declare(strict_types=1);
namespace DI\Test\UnitTest\Definition\Resolver;
use DI\Definition\DecoratorDefinition;
use DI\Definition\Resolver\DecoratorResolver;
use DI\Definition\Resolver\DefinitionResolver;
use DI\Definition\ValueDefinition;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Container\ContainerInterface;
use DI\Definition\Exception\InvalidDefinition;
/**
* @covers \DI\Definition\Resolver\DecoratorResolver
*/
#[\PHPUnit\Framework\Attributes\CoversClass(\DI\Definition\Resolver\DecoratorResolver::class)]
class DecoratorResolverTest extends TestCase
{
private DecoratorResolver $resolver;
private MockObject|DefinitionResolver $parentResolver;
public function setUp(): void
{
$this->markTestSkipped('Requires mnapoli/phpunit-easymock');
$container = $this->easyMock(ContainerInterface::class);
$this->parentResolver = $this->easyMock(DefinitionResolver::class);
$this->resolver = new DecoratorResolver($container, $this->parentResolver);
}
/**
* @test
*/
#[\PHPUnit\Framework\Attributes\Test]
public function should_resolve_decorators()
{
$previousDefinition = new ValueDefinition('bar');
$callable = function ($previous, ContainerInterface $container) {
return $previous . 'baz';
};
$definition = new DecoratorDefinition('foo', $callable);
$definition->setExtendedDefinition($previousDefinition);
$this->parentResolver->expects($this->once())
->method('resolve')
->with($previousDefinition)
->willReturn($previousDefinition->getValue());
$value = $this->resolver->resolve($definition);
$this->assertEquals('barbaz', $value);
}
/**
* @test
*/
#[\PHPUnit\Framework\Attributes\Test]
public function should_throw_if_the_factory_is_not_callable()
{
$this->expectException(InvalidDefinition::class);
$this->expectExceptionMessage('The decorator "foo" is not callable');
$definition = new DecoratorDefinition('foo', 'Hello world');
$this->resolver->resolve($definition);
}
}
|