diff --git a/typo3/sysext/core/Tests/Unit/DependencyInjection/FailsafeContainerTest.php b/typo3/sysext/core/Tests/Unit/DependencyInjection/FailsafeContainerTest.php index e18ce52f15476e3f94b6fc69832a700fe43fa7d6..fdc464a369ee8dd9b5c7e01b1966da58386b9e6b 100644 --- a/typo3/sysext/core/Tests/Unit/DependencyInjection/FailsafeContainerTest.php +++ b/typo3/sysext/core/Tests/Unit/DependencyInjection/FailsafeContainerTest.php @@ -17,8 +17,6 @@ declare(strict_types=1); namespace TYPO3\CMS\Core\Tests\Unit\DependencyInjection; -use Prophecy\PhpUnit\ProphecyTrait; -use Prophecy\Prophecy\ObjectProphecy; use Psr\Container\ContainerExceptionInterface; use Psr\Container\ContainerInterface; use Psr\Container\NotFoundExceptionInterface; @@ -27,31 +25,8 @@ use TYPO3\CMS\Core\DependencyInjection\FailsafeContainer as Container; use TYPO3\CMS\Core\DependencyInjection\ServiceProviderInterface; use TYPO3\TestingFramework\Core\Unit\UnitTestCase; -/** - * Testcase for the FailsafeContainer class - */ class FailsafeContainerTest extends UnitTestCase { - use ProphecyTrait; - - protected ?ObjectProphecy $providerProphecy; - - protected function setUp(): void - { - parent::setUp(); - - $this->providerProphecy = $this->createServiceProviderProphecy(); - } - - protected function createServiceProviderProphecy(array $extensions = [], array $factories = []): ObjectProphecy - { - $prophecy = $this->prophesize(); - $prophecy->willImplement(ServiceProviderInterface::class); - $prophecy->getFactories()->willReturn($extensions); - $prophecy->getExtensions()->willReturn($factories); - return $prophecy; - } - /** * @test */ @@ -65,12 +40,14 @@ class FailsafeContainerTest extends UnitTestCase */ public function withString(): void { - $this->providerProphecy->getFactories()->willReturn([ + $providerMock = $this->createMock(ServiceProviderInterface::class); + $providerMock->method('getExtensions')->willReturn([]); + $providerMock->method('getFactories')->willReturn([ 'param' => static function () { return 'value'; }, ]); - $container = new Container([$this->providerProphecy->reveal()]); + $container = new Container([$providerMock]); self::assertTrue($container->has('param')); self::assertEquals('value', $container->get('param')); @@ -79,14 +56,15 @@ class FailsafeContainerTest extends UnitTestCase /** * @test * @dataProvider objectFactories - * @param mixed $factory */ - public function get($factory): void + public function get(mixed $factory): void { - $this->providerProphecy->getFactories()->willReturn([ + $providerMock = $this->createMock(ServiceProviderInterface::class); + $providerMock->method('getExtensions')->willReturn([]); + $providerMock->method('getFactories')->willReturn([ 'service' => $factory, ]); - $container = new Container([$this->providerProphecy->reveal()]); + $container = new Container([$providerMock]); self::assertTrue($container->has('service')); self::assertInstanceOf(Service::class, $container->get('service')); @@ -95,15 +73,15 @@ class FailsafeContainerTest extends UnitTestCase /** * @test * @dataProvider objectFactories - * @param mixed $factory */ - public function multipleGetServicesShouldBeEqual($factory): void + public function multipleGetServicesShouldBeEqual(mixed $factory): void { - $this->providerProphecy->getFactories()->willReturn([ 'service' => $factory ]); + $providerMock = $this->createMock(ServiceProviderInterface::class); + $providerMock->method('getFactories')->willReturn(['service' => $factory]); // A factory can also be used as extension, as it's based on the same signature - $this->providerProphecy->getExtensions()->willReturn([ 'extension' => $factory ]); + $providerMock->method('getExtensions')->willReturn(['extension' => $factory]); - $container = new Container([$this->providerProphecy->reveal()]); + $container = new Container([$providerMock]); $serviceOne = $container->get('service'); $serviceTwo = $container->get('service'); @@ -120,7 +98,9 @@ class FailsafeContainerTest extends UnitTestCase */ public function passesContainerAsParameter(): void { - $this->providerProphecy->getFactories()->willReturn([ + $providerMock = $this->createMock(ServiceProviderInterface::class); + $providerMock->method('getExtensions')->willReturn([]); + $providerMock->method('getFactories')->willReturn([ 'service' => static function () { return new Service(); }, @@ -128,7 +108,7 @@ class FailsafeContainerTest extends UnitTestCase return $container; }, ]); - $container = new Container([$this->providerProphecy->reveal()]); + $container = new Container([$providerMock]); self::assertNotSame($container, $container->get('service')); self::assertSame($container, $container->get('container')); @@ -139,12 +119,14 @@ class FailsafeContainerTest extends UnitTestCase */ public function nullValueEntry(): void { - $this->providerProphecy->getFactories()->willReturn([ + $providerMock = $this->createMock(ServiceProviderInterface::class); + $providerMock->method('getExtensions')->willReturn([]); + $providerMock->method('getFactories')->willReturn([ 'null' => static function () { return null; }, ]); - $container = new Container([$this->providerProphecy->reveal()]); + $container = new Container([$providerMock]); self::assertTrue($container->has('null')); self::assertNull($container->get('null')); @@ -160,10 +142,12 @@ class FailsafeContainerTest extends UnitTestCase $calledCount++; return null; }; - $this->providerProphecy->getFactories()->willReturn([ + $providerMock = $this->createMock(ServiceProviderInterface::class); + $providerMock->method('getExtensions')->willReturn([]); + $providerMock->method('getFactories')->willReturn([ 'null' => $factory, ]); - $container = new Container([$this->providerProphecy->reveal()]); + $container = new Container([$providerMock]); self::assertTrue($container->has('null')); self::assertNull($container->get('null')); @@ -177,7 +161,9 @@ class FailsafeContainerTest extends UnitTestCase */ public function has(): void { - $this->providerProphecy->getFactories()->willReturn([ + $providerMock = $this->createMock(ServiceProviderInterface::class); + $providerMock->method('getExtensions')->willReturn([]); + $providerMock->method('getFactories')->willReturn([ 'service' => static function () { return new Service(); }, @@ -197,7 +183,7 @@ class FailsafeContainerTest extends UnitTestCase return 0; }, ]); - $container = new Container([$this->providerProphecy->reveal()]); + $container = new Container([$providerMock]); self::assertTrue($container->has('param')); self::assertTrue($container->has('service')); @@ -233,23 +219,24 @@ class FailsafeContainerTest extends UnitTestCase /** * @test * @dataProvider objectFactories - * @param mixed $factory */ - public function extension($factory): void + public function extension(mixed $factory): void { - $providerA = $this->providerProphecy; - $providerA->getFactories()->willReturn(['service' => $factory]); + $providerMockA = $this->createMock(ServiceProviderInterface::class); + $providerMockA->method('getFactories')->willReturn(['service' => $factory]); + $providerMockA->method('getExtensions')->willReturn([]); - $providerB = $this->createServiceProviderProphecy(); - $providerB->getExtensions()->willReturn([ + $providerMockB = $this->createMock(ServiceProviderInterface::class); + $providerMockB->method('getFactories')->willReturn([]); + $providerMockB->method('getExtensions')->willReturn([ 'service' => static function (ContainerInterface $c, Service $s) { $s->value = 'value'; return $s; }, ]); - $iterator = (static function () use ($providerA, $providerB): iterable { - yield $providerA->reveal(); - yield $providerB->reveal(); + $iterator = (static function () use ($providerMockA, $providerMockB): iterable { + yield $providerMockA; + yield $providerMockB; })(); $container = new Container($iterator); @@ -259,21 +246,22 @@ class FailsafeContainerTest extends UnitTestCase /** * @test * @dataProvider objectFactories - * @param mixed $factory */ - public function extendingLaterProvider($factory): void + public function extendingLaterProvider(mixed $factory): void { - $providerA = $this->providerProphecy; - $providerA->getFactories()->willReturn(['service' => $factory]); + $providerMockA = $this->createMock(ServiceProviderInterface::class); + $providerMockA->method('getFactories')->willReturn(['service' => $factory]); + $providerMockA->method('getExtensions')->willReturn([]); - $providerB = $this->createServiceProviderProphecy(); - $providerB->getExtensions()->willReturn([ + $providerMockB = $this->createMock(ServiceProviderInterface::class); + $providerMockB->method('getFactories')->willReturn([]); + $providerMockB->method('getExtensions')->willReturn([ 'service' => static function (ContainerInterface $c, Service $s) { $s->value = 'value'; return $s; }, ]); - $container = new Container([$providerB->reveal(), $providerA->reveal()]); + $container = new Container([$providerMockB, $providerMockA]); self::assertSame('value', $container->get('service')->value); } @@ -281,12 +269,12 @@ class FailsafeContainerTest extends UnitTestCase /** * @test * @dataProvider objectFactories - * @param mixed $factory */ - public function extendingOwnFactory($factory): void + public function extendingOwnFactory(mixed $factory): void { - $this->providerProphecy->getFactories()->willReturn(['service' => $factory]); - $this->providerProphecy->getExtensions()->willReturn( + $providerMock = $this->createMock(ServiceProviderInterface::class); + $providerMock->method('getFactories')->willReturn(['service' => $factory]); + $providerMock->method('getExtensions')->willReturn( [ 'service' => static function (ContainerInterface $c, Service $s) { $s->value = 'value'; @@ -294,7 +282,7 @@ class FailsafeContainerTest extends UnitTestCase }, ] ); - $container = new Container([$this->providerProphecy->reveal()]); + $container = new Container([$providerMock]); self::assertSame('value', $container->get('service')->value); } @@ -304,7 +292,9 @@ class FailsafeContainerTest extends UnitTestCase */ public function extendingNonExistingFactory(): void { - $this->providerProphecy->getExtensions()->willReturn([ + $providerMock = $this->createMock(ServiceProviderInterface::class); + $providerMock->method('getFactories')->willReturn([]); + $providerMock->method('getExtensions')->willReturn([ 'service' => static function (ContainerInterface $c, Service $s = null) { if ($s === null) { $s = new Service(); @@ -313,7 +303,7 @@ class FailsafeContainerTest extends UnitTestCase return $s; }, ]); - $container = new Container([$this->providerProphecy->reveal()]); + $container = new Container([$providerMock]); self::assertSame('value', $container->get('service')->value); } @@ -321,29 +311,31 @@ class FailsafeContainerTest extends UnitTestCase /** * @test * @dataProvider objectFactories - * @param mixed $factory */ - public function multipleExtensions($factory): void + public function multipleExtensions(mixed $factory): void { - $providerA = $this->providerProphecy; - $providerA->getFactories()->willReturn(['service' => $factory]); + $providerMockA = $this->createMock(ServiceProviderInterface::class); + $providerMockA->method('getFactories')->willReturn(['service' => $factory]); + $providerMockA->method('getExtensions')->willReturn([]); - $providerB = $this->createServiceProviderProphecy(); - $providerB->getExtensions()->willReturn([ + $providerMockB = $this->createMock(ServiceProviderInterface::class); + $providerMockB->method('getFactories')->willReturn([]); + $providerMockB->method('getExtensions')->willReturn([ 'service' => static function (ContainerInterface $c, Service $s) { $s->value = '1'; return $s; }, ]); - $providerC = $this->createServiceProviderProphecy(); - $providerC->getExtensions()->willReturn([ + $providerMockC = $this->createMock(ServiceProviderInterface::class); + $providerMockC->method('getFactories')->willReturn([]); + $providerMockC->method('getExtensions')->willReturn([ 'service' => static function (ContainerInterface $c, Service $s) { $s->value .= '2'; return $s; }, ]); - $container = new Container([$providerA->reveal(), $providerB->reveal(), $providerC->reveal()]); + $container = new Container([$providerMockA, $providerMockB, $providerMockC]); self::assertSame('12', $container->get('service')->value); } @@ -351,19 +343,20 @@ class FailsafeContainerTest extends UnitTestCase /** * @test * @dataProvider objectFactories - * @param mixed $factory */ - public function entryOverriding($factory): void + public function entryOverriding(mixed $factory): void { - $providerA = $this->providerProphecy; - $providerA->getFactories()->willReturn(['service' => $factory]); + $providerMockA = $this->createMock(ServiceProviderInterface::class); + $providerMockA->method('getFactories')->willReturn(['service' => $factory]); + $providerMockA->method('getExtensions')->willReturn([]); - $providerB = $this->createServiceProviderProphecy(); - $providerB->getFactories()->willReturn(['service' => static function () { + $providerMockB = $this->createMock(ServiceProviderInterface::class); + $providerMockB->method('getExtensions')->willReturn([]); + $providerMockB->method('getFactories')->willReturn(['service' => static function () { return 'value'; }]); - $container = new Container([$providerA->reveal(), $providerB->reveal()]); + $container = new Container([$providerMockA, $providerMockB]); self::assertNotInstanceOf(Service::class, $container->get('service')); self::assertEquals('value', $container->get('service')); @@ -374,7 +367,9 @@ class FailsafeContainerTest extends UnitTestCase */ public function cyclicDependency(): void { - $this->providerProphecy->getFactories()->willReturn([ + $providerMock = $this->createMock(ServiceProviderInterface::class); + $providerMock->method('getExtensions')->willReturn([]); + $providerMock->method('getFactories')->willReturn([ 'A' => static function (ContainerInterface $container) { return $container->get('B'); }, @@ -383,7 +378,7 @@ class FailsafeContainerTest extends UnitTestCase }, ]); - $container = new Container([$this->providerProphecy->reveal()]); + $container = new Container([$providerMock]); $this->expectException(ContainerExceptionInterface::class); $this->expectExceptionMessage('Container entry "A" is part of a cyclic dependency chain.'); @@ -395,7 +390,9 @@ class FailsafeContainerTest extends UnitTestCase */ public function cyclicDependencyRetrievedTwice(): void { - $this->providerProphecy->getFactories()->willReturn([ + $providerMock = $this->createMock(ServiceProviderInterface::class); + $providerMock->method('getExtensions')->willReturn([]); + $providerMock->method('getFactories')->willReturn([ 'A' => static function (ContainerInterface $container) { return $container->get('B'); }, @@ -404,7 +401,7 @@ class FailsafeContainerTest extends UnitTestCase }, ]); - $container = new Container([$this->providerProphecy->reveal()]); + $container = new Container([$providerMock]); $this->expectException(ContainerExceptionInterface::class); $this->expectExceptionMessage('Container entry "A" is part of a cyclic dependency chain.'); @@ -427,7 +424,8 @@ class FailsafeContainerTest extends UnitTestCase /** * @test - */public function nullContainerWithDefaultEntries(): void + */ + public function nullContainerWithDefaultEntries(): void { $container = new Container([], ['foo' => 'bar']); self::assertTrue($container->has('foo')); @@ -447,7 +445,7 @@ class FailsafeContainerTest extends UnitTestCase return [ [ // Static callback - [ self::class, 'factory'], + [self::class, 'factory'], ], [ // Closure @@ -465,7 +463,7 @@ class FailsafeContainerTest extends UnitTestCase }, ], [ - // Non static factory + // Non-static factory [ new class () { public function factory(): Service