diff --git a/composer.json b/composer.json index db63269..5ebf606 100644 --- a/composer.json +++ b/composer.json @@ -29,6 +29,8 @@ "ergebnis/composer-normalize": "^2.42", "friendsofphp/php-cs-fixer": "^3.11", "jangregor/phpstan-prophecy": "^1.0", + "matthiasnoback/symfony-dependency-injection-test": "^5.1", + "nyholm/symfony-bundle-test": "^3.0", "phpspec/prophecy-phpunit": "^2.0", "phpstan/extension-installer": "^1.1", "phpstan/phpstan": "^1.9", diff --git a/phpstan.neon b/phpstan.neon index 393aff3..689b0bc 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -5,7 +5,4 @@ parameters: paths: - src - symfony: - containerXmlPath: tests/app/var/cache/test/TestKernelTestDebugContainer.xml - checkGenericClassInNonGenericObjectType: false diff --git a/tests/ConfigurableKernelTestCase.php b/tests/ConfigurableKernelTestCase.php new file mode 100644 index 0000000..2fa1e3b --- /dev/null +++ b/tests/ConfigurableKernelTestCase.php @@ -0,0 +1,60 @@ + */ + private static iterable $kernelConfigurations = []; + + protected static function getKernelClass(): string + { + return \TestKernel::class; + } + + protected static function createKernel(array $options = []): \TestKernel + { + $kernel = parent::createKernel($options); + \assert($kernel instanceof \TestKernel); + + foreach (self::$kernelConfigurations as $configuration) { + $configuration->configure($kernel); + } + + $kernel->handleOptions($options); + + return $kernel; + } + + /** + * @internal + * + * @before + */ + public function _getKernelConfigurationFromAttributes(): void + { + $class = new \ReflectionClass($this); + $method = $class->getMethod($this->getName(false)); + + $attributes = []; + foreach ($class->getAttributes(ConfigureContainer::class) as $attribute) { + $attributes[] = $attribute->newInstance(); + } + + foreach ($method->getAttributes(ConfigureContainer::class) as $attribute) { + $attributes[] = $attribute->newInstance(); + } + + self::$kernelConfigurations = $attributes; + } + + protected function tearDown(): void + { + self::$kernelConfigurations = []; + parent::tearDown(); + } +} diff --git a/tests/Converter/GenericConverterIntegrationTest.php b/tests/Converter/GenericConverterIntegrationTest.php index 8b8802f..0efd614 100644 --- a/tests/Converter/GenericConverterIntegrationTest.php +++ b/tests/Converter/GenericConverterIntegrationTest.php @@ -4,31 +4,22 @@ namespace Neusta\ConverterBundle\Tests\Converter; -use Neusta\ConverterBundle\Converter; use Neusta\ConverterBundle\Converter\Context\GenericContext; -use Neusta\ConverterBundle\Tests\Fixtures\Model\Person; -use Neusta\ConverterBundle\Tests\Fixtures\Model\User; -use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; +use Neusta\ConverterBundle\Tests\ConfigurableKernelTestCase; +use Neusta\ConverterBundle\Tests\Fixtures\Model\Source\User; +use Neusta\ConverterBundle\Tests\Support\Attribute\ConfigureContainer; -class GenericConverterIntegrationTest extends KernelTestCase +#[ConfigureContainer(__DIR__ . '/../Fixtures/Config/person.yaml')] +class GenericConverterIntegrationTest extends ConfigurableKernelTestCase { - /** @var Converter */ - private Converter $converter; - - protected function setUp(): void - { - parent::setUp(); - $this->converter = self::getContainer()->get('test.person.converter'); - } - public function testConvert(): void { // Test Fixture $source = (new User())->setFirstname('Max')->setLastname('Mustermann'); // Test Execution - $target = $this->converter->convert($source); + $target = self::getContainer()->get('test.person.converter')->convert($source); // Test Assertion - self::assertEquals('Max Mustermann', $target->getFullName()); + self::assertSame('Max Mustermann', $target->getFullName()); } public function testConvertWithContext(): void @@ -37,8 +28,8 @@ public function testConvertWithContext(): void $source = (new User())->setFirstname('Max')->setLastname('Mustermann'); $ctx = (new GenericContext())->setValue('separator', ', '); // Test Execution - $target = $this->converter->convert($source, $ctx); + $target = self::getContainer()->get('test.person.converter')->convert($source, $ctx); // Test Assertion - self::assertEquals('Max, Mustermann', $target->getFullName()); + self::assertSame('Max, Mustermann', $target->getFullName()); } } diff --git a/tests/Converter/GenericConverterTest.php b/tests/Converter/GenericConverterTest.php index 65fd6db..20a6f51 100644 --- a/tests/Converter/GenericConverterTest.php +++ b/tests/Converter/GenericConverterTest.php @@ -8,9 +8,9 @@ use Neusta\ConverterBundle\Converter\Context\GenericContext; use Neusta\ConverterBundle\Converter\GenericConverter; use Neusta\ConverterBundle\Populator\ContextMappingPopulator; -use Neusta\ConverterBundle\Tests\Fixtures\Model\Person; -use Neusta\ConverterBundle\Tests\Fixtures\Model\PersonFactory; -use Neusta\ConverterBundle\Tests\Fixtures\Model\User; +use Neusta\ConverterBundle\Tests\Fixtures\Model\Source\User; +use Neusta\ConverterBundle\Tests\Fixtures\Model\Target\Factory\PersonFactory; +use Neusta\ConverterBundle\Tests\Fixtures\Model\Target\Person; use Neusta\ConverterBundle\Tests\Fixtures\Populator\PersonNamePopulator; use PHPUnit\Framework\TestCase; diff --git a/tests/Converter/StrategicConverterTest.php b/tests/Converter/StrategicConverterTest.php index e734e74..516da9b 100644 --- a/tests/Converter/StrategicConverterTest.php +++ b/tests/Converter/StrategicConverterTest.php @@ -9,8 +9,8 @@ use Neusta\ConverterBundle\Converter\StrategicConverter; use Neusta\ConverterBundle\Converter\Strategy\ConverterSelector; use Neusta\ConverterBundle\Exception\ConverterException; -use Neusta\ConverterBundle\Tests\Fixtures\Model\Person; -use Neusta\ConverterBundle\Tests\Fixtures\Model\User; +use Neusta\ConverterBundle\Tests\Fixtures\Model\Source\User; +use Neusta\ConverterBundle\Tests\Fixtures\Model\Target\Person; use PHPUnit\Framework\TestCase; use Prophecy\PhpUnit\ProphecyTrait; use Prophecy\Prophecy\ObjectProphecy; diff --git a/tests/DependencyInjection/NeustaConverterExtensionTest.php b/tests/DependencyInjection/NeustaConverterExtensionTest.php index 86c40dd..ab7ad57 100644 --- a/tests/DependencyInjection/NeustaConverterExtensionTest.php +++ b/tests/DependencyInjection/NeustaConverterExtensionTest.php @@ -4,27 +4,31 @@ namespace Neusta\ConverterBundle\Tests\DependencyInjection; +use Matthias\SymfonyDependencyInjectionTest\PhpUnit\AbstractExtensionTestCase; use Neusta\ConverterBundle\Converter; use Neusta\ConverterBundle\Converter\GenericConverter; use Neusta\ConverterBundle\DependencyInjection\NeustaConverterExtension; -use Neusta\ConverterBundle\NeustaConverterBundle; use Neusta\ConverterBundle\Populator\ArrayConvertingPopulator; use Neusta\ConverterBundle\Populator\ContextMappingPopulator; use Neusta\ConverterBundle\Populator\ConvertingPopulator; use Neusta\ConverterBundle\Populator\PropertyMappingPopulator; -use Neusta\ConverterBundle\Tests\Fixtures\Model\PersonFactory; +use Neusta\ConverterBundle\Tests\Fixtures\Model\Target\Factory\PersonFactory; use Neusta\ConverterBundle\Tests\Fixtures\Populator\PersonNamePopulator; -use PHPUnit\Framework\TestCase; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag; use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\DependencyInjection\TypedReference; -class NeustaConverterExtensionTest extends TestCase +class NeustaConverterExtensionTest extends AbstractExtensionTestCase { + protected function getContainerExtensions(): array + { + return [ + new NeustaConverterExtension(), + ]; + } + public function test_with_generic_converter(): void { - $container = $this->buildContainer([ + $this->load([ 'converter' => [ 'foobar' => [ 'target_factory' => PersonFactory::class, @@ -35,20 +39,15 @@ public function test_with_generic_converter(): void ], ]); - // converter - $converter = $container->getDefinition('foobar'); - self::assertSame(GenericConverter::class, $converter->getClass()); - self::assertTrue($converter->isPublic()); - self::assertTrue($container->hasAlias(Converter::class . ' $foobarConverter')); - self::assertIsReference(PersonFactory::class, $converter->getArgument('$factory')); - self::assertIsArray($converter->getArgument('$populators')); - self::assertCount(1, $converter->getArgument('$populators')); - self::assertIsReference(PersonNamePopulator::class, $converter->getArgument('$populators')[0]); + $this->assertContainerBuilderHasPublicService('foobar', GenericConverter::class); + $this->assertContainerBuilderHasAlias(Converter::class . ' $foobarConverter', 'foobar'); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar', '$factory', new Reference(PersonFactory::class)); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar', '$populators', [new Reference(PersonNamePopulator::class)]); } public function test_with_mapped_properties(): void { - $container = $this->buildContainer([ + $this->load([ 'converter' => [ 'foobar' => [ 'target_factory' => PersonFactory::class, @@ -64,41 +63,37 @@ public function test_with_mapped_properties(): void ]); // converter - $converter = $container->getDefinition('foobar'); - self::assertSame(GenericConverter::class, $converter->getClass()); - self::assertTrue($converter->isPublic()); - self::assertTrue($container->hasAlias(Converter::class . ' $foobarConverter')); - self::assertIsReference(PersonFactory::class, $converter->getArgument('$factory')); - self::assertIsArray($converter->getArgument('$populators')); - self::assertCount(3, $converter->getArgument('$populators')); - self::assertIsReference('foobar.populator.name', $converter->getArgument('$populators')[0]); - self::assertIsReference('foobar.populator.ageInYears', $converter->getArgument('$populators')[1]); + $this->assertContainerBuilderHasPublicService('foobar', GenericConverter::class); + $this->assertContainerBuilderHasAlias(Converter::class . ' $foobarConverter', 'foobar'); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar', '$factory', new Reference(PersonFactory::class)); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar', '$populators', [ + new Reference('foobar.populator.name'), + new Reference('foobar.populator.ageInYears'), + new Reference('foobar.populator.email'), + ]); // name property populator - $namePopulator = $container->getDefinition('foobar.populator.name'); - self::assertSame(PropertyMappingPopulator::class, $namePopulator->getClass()); - self::assertIsReference('property_accessor', $namePopulator->getArgument('$accessor')); - self::assertSame('name', $namePopulator->getArgument('$targetProperty')); - self::assertSame('name', $namePopulator->getArgument('$sourceProperty')); + $this->assertContainerBuilderHasService('foobar.populator.name', PropertyMappingPopulator::class); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar.populator.name', '$accessor', new Reference('property_accessor')); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar.populator.name', '$targetProperty', 'name'); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar.populator.name', '$sourceProperty', 'name'); // ageInYears property populator - $ageInYearsPopulator = $container->getDefinition('foobar.populator.ageInYears'); - self::assertSame(PropertyMappingPopulator::class, $ageInYearsPopulator->getClass()); - self::assertIsReference('property_accessor', $ageInYearsPopulator->getArgument('$accessor')); - self::assertSame('ageInYears', $ageInYearsPopulator->getArgument('$targetProperty')); - self::assertSame('age', $ageInYearsPopulator->getArgument('$sourceProperty')); + $this->assertContainerBuilderHasService('foobar.populator.ageInYears', PropertyMappingPopulator::class); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar.populator.ageInYears', '$accessor', new Reference('property_accessor')); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar.populator.ageInYears', '$targetProperty', 'ageInYears'); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar.populator.ageInYears', '$sourceProperty', 'age'); // email property populator - $emailPopulator = $container->getDefinition('foobar.populator.email'); - self::assertSame(PropertyMappingPopulator::class, $emailPopulator->getClass()); - self::assertIsReference('property_accessor', $emailPopulator->getArgument('$accessor')); - self::assertSame('email', $emailPopulator->getArgument('$targetProperty')); - self::assertSame('mail', $emailPopulator->getArgument('$sourceProperty')); + $this->assertContainerBuilderHasService('foobar.populator.email', PropertyMappingPopulator::class); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar.populator.email', '$accessor', new Reference('property_accessor')); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar.populator.email', '$targetProperty', 'email'); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar.populator.email', '$sourceProperty', 'mail'); } public function test_with_mapped_context(): void { - $container = $this->buildContainer([ + $this->load([ 'converter' => [ 'foobar' => [ 'target_factory' => PersonFactory::class, @@ -111,34 +106,30 @@ public function test_with_mapped_context(): void ]); // converter - $converter = $container->getDefinition('foobar'); - self::assertSame(GenericConverter::class, $converter->getClass()); - self::assertTrue($converter->isPublic()); - self::assertTrue($container->hasAlias(Converter::class . ' $foobarConverter')); - self::assertIsReference(PersonFactory::class, $converter->getArgument('$factory')); - self::assertIsArray($converter->getArgument('$populators')); - self::assertCount(2, $converter->getArgument('$populators')); - self::assertIsReference('foobar.populator.context.name', $converter->getArgument('$populators')[0]); - self::assertIsReference('foobar.populator.context.ageInYears', $converter->getArgument('$populators')[1]); + $this->assertContainerBuilderHasPublicService('foobar', GenericConverter::class); + $this->assertContainerBuilderHasAlias(Converter::class . ' $foobarConverter', 'foobar'); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar', '$factory', new Reference(PersonFactory::class)); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar', '$populators', [ + new Reference('foobar.populator.context.name'), + new Reference('foobar.populator.context.ageInYears'), + ]); // name context populator - $namePopulator = $container->getDefinition('foobar.populator.context.name'); - self::assertSame(ContextMappingPopulator::class, $namePopulator->getClass()); - self::assertIsReference('property_accessor', $namePopulator->getArgument('$accessor')); - self::assertSame('name', $namePopulator->getArgument('$targetProperty')); - self::assertSame('name', $namePopulator->getArgument('$contextProperty')); + $this->assertContainerBuilderHasService('foobar.populator.context.name', ContextMappingPopulator::class); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar.populator.context.name', '$accessor', new Reference('property_accessor')); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar.populator.context.name', '$targetProperty', 'name'); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar.populator.context.name', '$contextProperty', 'name'); // ageInYears context populator - $ageInYearsPopulator = $container->getDefinition('foobar.populator.context.ageInYears'); - self::assertSame(ContextMappingPopulator::class, $ageInYearsPopulator->getClass()); - self::assertIsReference('property_accessor', $ageInYearsPopulator->getArgument('$accessor')); - self::assertSame('ageInYears', $ageInYearsPopulator->getArgument('$targetProperty')); - self::assertSame('age', $ageInYearsPopulator->getArgument('$contextProperty')); + $this->assertContainerBuilderHasService('foobar.populator.context.ageInYears', ContextMappingPopulator::class); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar.populator.context.ageInYears', '$accessor', new Reference('property_accessor')); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar.populator.context.ageInYears', '$targetProperty', 'ageInYears'); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar.populator.context.ageInYears', '$contextProperty', 'age'); } public function test_with_converting_populator(): void { - $container = $this->buildContainer([ + $this->load([ 'populator' => [ 'foobar' => [ 'converter' => GenericConverter::class, @@ -149,20 +140,16 @@ public function test_with_converting_populator(): void ], ]); - // converter - $populator = $container->getDefinition('foobar'); - - self::assertSame(ConvertingPopulator::class, $populator->getClass()); - self::assertTrue($populator->isPublic()); - self::assertInstanceOf(TypedReference::class, $populator->getArgument('$converter')); - self::assertSame(GenericConverter::class, (string) $populator->getArgument('$converter')); - self::assertSame('targetTest', $populator->getArgument('$targetPropertyName')); - self::assertSame('sourceTest', $populator->getArgument('$sourcePropertyName')); + // populator + $this->assertContainerBuilderHasPublicService('foobar', ConvertingPopulator::class); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar', '$converter', new TypedReference(GenericConverter::class, Converter::class)); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar', '$targetPropertyName', 'targetTest'); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar', '$sourcePropertyName', 'sourceTest'); } public function test_with_converting_populator_without_source_property_config(): void { - $container = $this->buildContainer([ + $this->load([ 'populator' => [ 'foobar' => [ 'converter' => GenericConverter::class, @@ -173,22 +160,18 @@ public function test_with_converting_populator_without_source_property_config(): ], ]); - // converter - $populator = $container->getDefinition('foobar'); - - self::assertSame(ConvertingPopulator::class, $populator->getClass()); - self::assertTrue($populator->isPublic()); - self::assertInstanceOf(TypedReference::class, $populator->getArgument('$converter')); - self::assertSame(GenericConverter::class, (string) $populator->getArgument('$converter')); - self::assertSame('test', $populator->getArgument('$targetPropertyName')); - self::assertSame('test', $populator->getArgument('$sourcePropertyName')); + // populator + $this->assertContainerBuilderHasPublicService('foobar', ConvertingPopulator::class); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar', '$converter', new TypedReference(GenericConverter::class, Converter::class)); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar', '$targetPropertyName', 'test'); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar', '$sourcePropertyName', 'test'); } public function test_with_converting_populator_with_array_converting_populator_config(): void { $this->expectExceptionMessage('The "property..source_array_item" option is only supported for array converting populators.'); - $this->buildContainer([ + $this->load([ 'populator' => [ 'foobar' => [ 'converter' => GenericConverter::class, @@ -204,7 +187,7 @@ public function test_with_converting_populator_with_array_converting_populator_c public function test_with_array_converting_populator(): void { - $container = $this->buildContainer([ + $this->load([ 'populator' => [ 'foobar' => [ 'populator' => ArrayConvertingPopulator::class, @@ -216,20 +199,16 @@ public function test_with_array_converting_populator(): void ], ]); - // converter - $populator = $container->getDefinition('foobar'); - - self::assertSame(ArrayConvertingPopulator::class, $populator->getClass()); - self::assertTrue($populator->isPublic()); - self::assertInstanceOf(TypedReference::class, $populator->getArgument('$converter')); - self::assertSame(GenericConverter::class, (string) $populator->getArgument('$converter')); - self::assertSame('targetTest', $populator->getArgument('$targetPropertyName')); - self::assertSame('sourceTest', $populator->getArgument('$sourceArrayPropertyName')); + // populator + $this->assertContainerBuilderHasPublicService('foobar', ArrayConvertingPopulator::class); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar', '$converter', new TypedReference(GenericConverter::class, Converter::class)); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar', '$targetPropertyName', 'targetTest'); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar', '$sourceArrayPropertyName', 'sourceTest'); } public function test_with_array_converting_populator_without_source_property_config(): void { - $container = $this->buildContainer([ + $this->load([ 'populator' => [ 'foobar' => [ 'populator' => ArrayConvertingPopulator::class, @@ -241,20 +220,16 @@ public function test_with_array_converting_populator_without_source_property_con ], ]); - // converter - $populator = $container->getDefinition('foobar'); - - self::assertSame(ArrayConvertingPopulator::class, $populator->getClass()); - self::assertTrue($populator->isPublic()); - self::assertInstanceOf(TypedReference::class, $populator->getArgument('$converter')); - self::assertSame(GenericConverter::class, (string) $populator->getArgument('$converter')); - self::assertSame('test', $populator->getArgument('$targetPropertyName')); - self::assertSame('test', $populator->getArgument('$sourceArrayPropertyName')); + // populator + $this->assertContainerBuilderHasPublicService('foobar', ArrayConvertingPopulator::class); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar', '$converter', new TypedReference(GenericConverter::class, Converter::class)); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar', '$targetPropertyName', 'test'); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar', '$sourceArrayPropertyName', 'test'); } public function test_with_array_converting_populator_with_inner_property(): void { - $container = $this->buildContainer([ + $this->load([ 'populator' => [ 'foobar' => [ 'populator' => ArrayConvertingPopulator::class, @@ -269,18 +244,17 @@ public function test_with_array_converting_populator_with_inner_property(): void ], ]); - // converter - $populator = $container->getDefinition('foobar'); - - self::assertSame(ArrayConvertingPopulator::class, $populator->getClass()); - self::assertSame('targetTest', $populator->getArgument('$targetPropertyName')); - self::assertSame('sourceTest', $populator->getArgument('$sourceArrayPropertyName')); - self::assertSame('value', $populator->getArgument('$sourceArrayItemPropertyName')); + // populator + $this->assertContainerBuilderHasPublicService('foobar', ArrayConvertingPopulator::class); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar', '$converter', new TypedReference(GenericConverter::class, Converter::class)); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar', '$targetPropertyName', 'targetTest'); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar', '$sourceArrayPropertyName', 'sourceTest'); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar', '$sourceArrayItemPropertyName', 'value'); } public function test_with_array_converting_populator_with_inner_property_and_empty_source(): void { - $container = $this->buildContainer([ + $this->load([ 'populator' => [ 'foobar' => [ 'populator' => ArrayConvertingPopulator::class, @@ -295,18 +269,17 @@ public function test_with_array_converting_populator_with_inner_property_and_emp ], ]); - // converter - $populator = $container->getDefinition('foobar'); - - self::assertSame(ArrayConvertingPopulator::class, $populator->getClass()); - self::assertSame('test', $populator->getArgument('$targetPropertyName')); - self::assertSame('test', $populator->getArgument('$sourceArrayPropertyName')); - self::assertSame('value', $populator->getArgument('$sourceArrayItemPropertyName')); + // populator + $this->assertContainerBuilderHasPublicService('foobar', ArrayConvertingPopulator::class); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar', '$converter', new TypedReference(GenericConverter::class, Converter::class)); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar', '$targetPropertyName', 'test'); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar', '$sourceArrayPropertyName', 'test'); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar', '$sourceArrayItemPropertyName', 'value'); } public function test_with_array_converting_populator_with_inner_property_and_missing_source_property_config(): void { - $container = $this->buildContainer([ + $this->load([ 'populator' => [ 'foobar' => [ 'populator' => ArrayConvertingPopulator::class, @@ -320,18 +293,17 @@ public function test_with_array_converting_populator_with_inner_property_and_mis ], ]); - // converter - $populator = $container->getDefinition('foobar'); - - self::assertSame(ArrayConvertingPopulator::class, $populator->getClass()); - self::assertSame('test', $populator->getArgument('$targetPropertyName')); - self::assertSame('test', $populator->getArgument('$sourceArrayPropertyName')); - self::assertSame('value', $populator->getArgument('$sourceArrayItemPropertyName')); + // populator + $this->assertContainerBuilderHasPublicService('foobar', ArrayConvertingPopulator::class); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar', '$converter', new TypedReference(GenericConverter::class, Converter::class)); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar', '$targetPropertyName', 'test'); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar', '$sourceArrayPropertyName', 'test'); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar', '$sourceArrayItemPropertyName', 'value'); } public function test_with_array_converting_populator_with_default_value(): void { - $container = $this->buildContainer([ + $this->load([ 'converter' => [ 'foobar' => [ 'target_factory' => PersonFactory::class, @@ -353,49 +325,36 @@ public function test_with_array_converting_populator_with_default_value(): void ]); // name property populator - $namePopulator = $container->getDefinition('foobar.populator.name'); - self::assertSame('name', $namePopulator->getArgument('$targetProperty')); - self::assertSame('name', $namePopulator->getArgument('$sourceProperty')); - self::assertSame('John Doe', $namePopulator->getArgument('$defaultValue')); + $this->assertContainerBuilderHasService('foobar.populator.name', PropertyMappingPopulator::class); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar.populator.name', '$accessor', new Reference('property_accessor')); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar.populator.name', '$targetProperty', 'name'); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar.populator.name', '$sourceProperty', 'name'); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar.populator.name', '$defaultValue', 'John Doe'); // ageInYears property populator - $ageInYearsPopulator = $container->getDefinition('foobar.populator.ageInYears'); - self::assertSame('ageInYears', $ageInYearsPopulator->getArgument('$targetProperty')); - self::assertSame('age', $ageInYearsPopulator->getArgument('$sourceProperty')); - self::assertSame(42, $ageInYearsPopulator->getArgument('$defaultValue')); + $this->assertContainerBuilderHasService('foobar.populator.ageInYears', PropertyMappingPopulator::class); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar.populator.ageInYears', '$accessor', new Reference('property_accessor')); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar.populator.ageInYears', '$targetProperty', 'ageInYears'); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar.populator.ageInYears', '$sourceProperty', 'age'); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar.populator.ageInYears', '$defaultValue', 42); // locale property populator - $localePopulator = $container->getDefinition('foobar.populator.locale'); - self::assertSame('locale', $localePopulator->getArgument('$targetProperty')); - self::assertSame('locale', $localePopulator->getArgument('$sourceProperty')); - self::assertSame('en', $localePopulator->getArgument('$defaultValue')); - } - - private static function assertIsReference(string $expected, mixed $actual): void - { - self::assertInstanceOf(Reference::class, $actual); - self::assertSame($expected, (string) $actual); + $this->assertContainerBuilderHasService('foobar.populator.locale', PropertyMappingPopulator::class); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar.populator.locale', '$accessor', new Reference('property_accessor')); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar.populator.locale', '$targetProperty', 'locale'); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar.populator.locale', '$sourceProperty', 'locale'); + $this->assertContainerBuilderHasServiceDefinitionWithArgument('foobar.populator.locale', '$defaultValue', 'en'); } - private function buildContainer(array $extensionConfig): ContainerBuilder + /** + * Assert that the ContainerBuilder for this test has a public service definition with the given id and class. + */ + protected function assertContainerBuilderHasPublicService(string $serviceId, ?string $expectedClass = null): void { - $container = new ContainerBuilder(new ParameterBag([ - 'kernel.debug' => true, - 'kernel.bundles' => ['NeustaConverterBundle' => NeustaConverterBundle::class], - ])); - - $container->registerExtension(new NeustaConverterExtension()); - $container->loadFromExtension('neusta_converter', $extensionConfig); - - $container->getCompilerPassConfig()->setOptimizationPasses([]); - $container->getCompilerPassConfig()->setRemovingPasses([]); - $container->getCompilerPassConfig()->setAfterRemovingPasses([]); - - $bundle = new NeustaConverterBundle(); - $bundle->build($container); - - $container->compile(); - - return $container; + $this->assertContainerBuilderHasService($serviceId, $expectedClass); + $this->assertTrue( + $this->container->getDefinition('foobar')->isPublic(), + sprintf('service definition "%s" is "public"', $serviceId), + ); } } diff --git a/tests/Fixtures/Config/activities.yaml b/tests/Fixtures/Config/activities.yaml new file mode 100644 index 0000000..e805863 --- /dev/null +++ b/tests/Fixtures/Config/activities.yaml @@ -0,0 +1,8 @@ +services: + test.person.activities.populator: + public: true + parent: 'neusta_converter.array_property_mapping_populator' + arguments: + $sourceArrayItemProperty: 'label' + $sourceArrayProperty: 'hobbies' + $targetProperty: 'activities' diff --git a/tests/Fixtures/Config/address.yaml b/tests/Fixtures/Config/address.yaml new file mode 100644 index 0000000..0a5a45f --- /dev/null +++ b/tests/Fixtures/Config/address.yaml @@ -0,0 +1,34 @@ +neusta_converter: + populator: + test.person.address.populator: + converter: test.address.converter + property: + address: ~ + +services: + Neusta\ConverterBundle\Tests\Fixtures\Model\Target\Factory\AddressFactory: ~ + Neusta\ConverterBundle\Tests\Fixtures\Populator\AddressPopulator: ~ + + test.address.converter: + public: true + parent: 'neusta_converter.generic_converter' + arguments: + $factory: '@Neusta\ConverterBundle\Tests\Fixtures\Model\Target\Factory\AddressFactory' + $populators: + - '@Neusta\ConverterBundle\Tests\Fixtures\Populator\AddressPopulator' + + test.person.wrong.source.type.populator: + public: true + parent: 'neusta_converter.converting_populator' + arguments: + $converter: '@test.address.converter' + $sourcePropertyName: 'fieldWithUnknownType' + $targetPropertyName: 'address' + + test.person.wrong.converter.populator: + public: true + parent: 'neusta_converter.converting_populator' + arguments: + $converter: '@test.person.converter' # wrong converter for testing + $sourcePropertyName: 'address' + $targetPropertyName: 'address' diff --git a/tests/Fixtures/Config/contact_numbers.yaml b/tests/Fixtures/Config/contact_numbers.yaml new file mode 100644 index 0000000..85e01a7 --- /dev/null +++ b/tests/Fixtures/Config/contact_numbers.yaml @@ -0,0 +1,17 @@ +neusta_converter: + converter: + test.contactnumber.converter: + target_factory: Neusta\ConverterBundle\Tests\Fixtures\Model\Target\Factory\ContactNumberFactory + properties: + phoneNumber: number + +services: + Neusta\ConverterBundle\Tests\Fixtures\Model\Target\Factory\ContactNumberFactory: ~ + + test.person.contactnumbers.populator: + public: true + parent: 'neusta_converter.array_converting_populator' + arguments: + $converter: '@test.contactnumber.converter' + $sourceArrayPropertyName: 'phones' + $targetPropertyName: 'contactNumbers' diff --git a/tests/Fixtures/Config/full_name.yaml b/tests/Fixtures/Config/full_name.yaml new file mode 100644 index 0000000..293a43c --- /dev/null +++ b/tests/Fixtures/Config/full_name.yaml @@ -0,0 +1,7 @@ +services: + test.person.fullName.populator: + public: true + parent: 'neusta_converter.property_mapping_populator' + arguments: + $targetProperty: 'fullName' + $sourceProperty: 'fullName' diff --git a/tests/app/config/packages/neusta_converter.yaml b/tests/Fixtures/Config/person.yaml similarity index 59% rename from tests/app/config/packages/neusta_converter.yaml rename to tests/Fixtures/Config/person.yaml index 849bea1..59da524 100644 --- a/tests/app/config/packages/neusta_converter.yaml +++ b/tests/Fixtures/Config/person.yaml @@ -2,7 +2,7 @@ neusta_converter: converter: test.person.converter: # converter: Neusta\ConverterBundle\Converter\GenericConverter - target_factory: Neusta\ConverterBundle\Tests\Fixtures\Model\PersonFactory + target_factory: Neusta\ConverterBundle\Tests\Fixtures\Model\Target\Factory\PersonFactory populators: - Neusta\ConverterBundle\Tests\Fixtures\Populator\PersonNamePopulator # properties: @@ -12,13 +12,6 @@ neusta_converter: # group: ~ # same property name # locale: language # different property names - test.contactnumber.converter: - target_factory: Neusta\ConverterBundle\Tests\Fixtures\Model\ContactNumberFactory - properties: - phoneNumber: number - - populator: - test.person.address.populator: - converter: test.address.converter - property: - address: ~ +services: + Neusta\ConverterBundle\Tests\Fixtures\Model\Target\Factory\PersonFactory: ~ + Neusta\ConverterBundle\Tests\Fixtures\Populator\PersonNamePopulator: ~ diff --git a/tests/Fixtures/Model/Address.php b/tests/Fixtures/Model/Source/Address.php similarity index 94% rename from tests/Fixtures/Model/Address.php rename to tests/Fixtures/Model/Source/Address.php index 4bb79d0..6562581 100644 --- a/tests/Fixtures/Model/Address.php +++ b/tests/Fixtures/Model/Source/Address.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Neusta\ConverterBundle\Tests\Fixtures\Model; +namespace Neusta\ConverterBundle\Tests\Fixtures\Model\Source; class Address { diff --git a/tests/Fixtures/Model/Hobby.php b/tests/Fixtures/Model/Source/Hobby.php similarity index 90% rename from tests/Fixtures/Model/Hobby.php rename to tests/Fixtures/Model/Source/Hobby.php index f5751fe..bc2216d 100644 --- a/tests/Fixtures/Model/Hobby.php +++ b/tests/Fixtures/Model/Source/Hobby.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Neusta\ConverterBundle\Tests\Fixtures\Model; +namespace Neusta\ConverterBundle\Tests\Fixtures\Model\Source; class Hobby { diff --git a/tests/Fixtures/Model/Phone.php b/tests/Fixtures/Model/Source/Phone.php similarity index 88% rename from tests/Fixtures/Model/Phone.php rename to tests/Fixtures/Model/Source/Phone.php index 8bdee72..80f6823 100644 --- a/tests/Fixtures/Model/Phone.php +++ b/tests/Fixtures/Model/Source/Phone.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Neusta\ConverterBundle\Tests\Fixtures\Model; +namespace Neusta\ConverterBundle\Tests\Fixtures\Model\Source; class Phone { diff --git a/tests/Fixtures/Model/User.php b/tests/Fixtures/Model/Source/User.php similarity index 96% rename from tests/Fixtures/Model/User.php rename to tests/Fixtures/Model/Source/User.php index 0382c06..10b6a30 100644 --- a/tests/Fixtures/Model/User.php +++ b/tests/Fixtures/Model/Source/User.php @@ -2,7 +2,9 @@ declare(strict_types=1); -namespace Neusta\ConverterBundle\Tests\Fixtures\Model; +namespace Neusta\ConverterBundle\Tests\Fixtures\Model\Source; + +use Neusta\ConverterBundle\Tests\Fixtures\Model\UnknownType; class User { diff --git a/tests/Fixtures/Model/ContactNumber.php b/tests/Fixtures/Model/Target/ContactNumber.php similarity index 83% rename from tests/Fixtures/Model/ContactNumber.php rename to tests/Fixtures/Model/Target/ContactNumber.php index 75d71a3..bb818ee 100644 --- a/tests/Fixtures/Model/ContactNumber.php +++ b/tests/Fixtures/Model/Target/ContactNumber.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Neusta\ConverterBundle\Tests\Fixtures\Model; +namespace Neusta\ConverterBundle\Tests\Fixtures\Model\Target; class ContactNumber { diff --git a/tests/Fixtures/Model/AddressFactory.php b/tests/Fixtures/Model/Target/Factory/AddressFactory.php similarity index 72% rename from tests/Fixtures/Model/AddressFactory.php rename to tests/Fixtures/Model/Target/Factory/AddressFactory.php index bdfc099..f03686e 100644 --- a/tests/Fixtures/Model/AddressFactory.php +++ b/tests/Fixtures/Model/Target/Factory/AddressFactory.php @@ -2,10 +2,11 @@ declare(strict_types=1); -namespace Neusta\ConverterBundle\Tests\Fixtures\Model; +namespace Neusta\ConverterBundle\Tests\Fixtures\Model\Target\Factory; use Neusta\ConverterBundle\Converter\Context\GenericContext; use Neusta\ConverterBundle\TargetFactory; +use Neusta\ConverterBundle\Tests\Fixtures\Model\Target\PersonAddress; /** * @implements TargetFactory diff --git a/tests/Fixtures/Model/ContactNumberFactory.php b/tests/Fixtures/Model/Target/Factory/ContactNumberFactory.php similarity index 72% rename from tests/Fixtures/Model/ContactNumberFactory.php rename to tests/Fixtures/Model/Target/Factory/ContactNumberFactory.php index e7dbeaf..adf857b 100644 --- a/tests/Fixtures/Model/ContactNumberFactory.php +++ b/tests/Fixtures/Model/Target/Factory/ContactNumberFactory.php @@ -2,10 +2,11 @@ declare(strict_types=1); -namespace Neusta\ConverterBundle\Tests\Fixtures\Model; +namespace Neusta\ConverterBundle\Tests\Fixtures\Model\Target\Factory; use Neusta\ConverterBundle\Converter\Context\GenericContext; use Neusta\ConverterBundle\TargetFactory; +use Neusta\ConverterBundle\Tests\Fixtures\Model\Target\ContactNumber; /** * @implements TargetFactory diff --git a/tests/Fixtures/Model/PersonFactory.php b/tests/Fixtures/Model/Target/Factory/PersonFactory.php similarity index 72% rename from tests/Fixtures/Model/PersonFactory.php rename to tests/Fixtures/Model/Target/Factory/PersonFactory.php index 1c73976..6c68eb1 100644 --- a/tests/Fixtures/Model/PersonFactory.php +++ b/tests/Fixtures/Model/Target/Factory/PersonFactory.php @@ -2,10 +2,11 @@ declare(strict_types=1); -namespace Neusta\ConverterBundle\Tests\Fixtures\Model; +namespace Neusta\ConverterBundle\Tests\Fixtures\Model\Target\Factory; use Neusta\ConverterBundle\Converter\Context\GenericContext; use Neusta\ConverterBundle\TargetFactory; +use Neusta\ConverterBundle\Tests\Fixtures\Model\Target\Person; /** * @implements TargetFactory diff --git a/tests/Fixtures/Model/Person.php b/tests/Fixtures/Model/Target/Person.php similarity index 97% rename from tests/Fixtures/Model/Person.php rename to tests/Fixtures/Model/Target/Person.php index 72b72b7..e7b8c1f 100644 --- a/tests/Fixtures/Model/Person.php +++ b/tests/Fixtures/Model/Target/Person.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Neusta\ConverterBundle\Tests\Fixtures\Model; +namespace Neusta\ConverterBundle\Tests\Fixtures\Model\Target; class Person { diff --git a/tests/Fixtures/Model/PersonAddress.php b/tests/Fixtures/Model/Target/PersonAddress.php similarity index 94% rename from tests/Fixtures/Model/PersonAddress.php rename to tests/Fixtures/Model/Target/PersonAddress.php index 0e441d3..e5a9386 100644 --- a/tests/Fixtures/Model/PersonAddress.php +++ b/tests/Fixtures/Model/Target/PersonAddress.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Neusta\ConverterBundle\Tests\Fixtures\Model; +namespace Neusta\ConverterBundle\Tests\Fixtures\Model\Target; class PersonAddress { diff --git a/tests/Fixtures/Populator/AddressPopulator.php b/tests/Fixtures/Populator/AddressPopulator.php index 52b1240..3ef9884 100644 --- a/tests/Fixtures/Populator/AddressPopulator.php +++ b/tests/Fixtures/Populator/AddressPopulator.php @@ -6,8 +6,8 @@ use Neusta\ConverterBundle\Converter\Context\GenericContext; use Neusta\ConverterBundle\Populator; -use Neusta\ConverterBundle\Tests\Fixtures\Model\Address; -use Neusta\ConverterBundle\Tests\Fixtures\Model\PersonAddress; +use Neusta\ConverterBundle\Tests\Fixtures\Model\Source\Address; +use Neusta\ConverterBundle\Tests\Fixtures\Model\Target\PersonAddress; /** * @implements Populator diff --git a/tests/Fixtures/Populator/PersonNamePopulator.php b/tests/Fixtures/Populator/PersonNamePopulator.php index ead2477..2267048 100644 --- a/tests/Fixtures/Populator/PersonNamePopulator.php +++ b/tests/Fixtures/Populator/PersonNamePopulator.php @@ -6,8 +6,8 @@ use Neusta\ConverterBundle\Converter\Context\GenericContext; use Neusta\ConverterBundle\Populator; -use Neusta\ConverterBundle\Tests\Fixtures\Model\Person; -use Neusta\ConverterBundle\Tests\Fixtures\Model\User; +use Neusta\ConverterBundle\Tests\Fixtures\Model\Source\User; +use Neusta\ConverterBundle\Tests\Fixtures\Model\Target\Person; /** * @implements Populator diff --git a/tests/Populator/ArrayConvertingPopulatorIntegrationTest.php b/tests/Populator/ArrayConvertingPopulatorIntegrationTest.php index 3004005..1111d4e 100644 --- a/tests/Populator/ArrayConvertingPopulatorIntegrationTest.php +++ b/tests/Populator/ArrayConvertingPopulatorIntegrationTest.php @@ -4,45 +4,32 @@ namespace Neusta\ConverterBundle\Tests\Populator; -use Neusta\ConverterBundle\Populator\ArrayConvertingPopulator; -use Neusta\ConverterBundle\Tests\Fixtures\Model\Person; -use Neusta\ConverterBundle\Tests\Fixtures\Model\Phone; -use Neusta\ConverterBundle\Tests\Fixtures\Model\User; -use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; +use Neusta\ConverterBundle\Tests\ConfigurableKernelTestCase; +use Neusta\ConverterBundle\Tests\Fixtures\Model\Source\Phone; +use Neusta\ConverterBundle\Tests\Fixtures\Model\Source\User; +use Neusta\ConverterBundle\Tests\Fixtures\Model\Target\Person; +use Neusta\ConverterBundle\Tests\Support\Attribute\ConfigureContainer; -class ArrayConvertingPopulatorIntegrationTest extends KernelTestCase +class ArrayConvertingPopulatorIntegrationTest extends ConfigurableKernelTestCase { - private ArrayConvertingPopulator $populator; - - protected function setUp(): void - { - parent::setUp(); - $this->populator = self::getContainer()->get('test.person.contactnumbers.populator'); - } - + #[ConfigureContainer(__DIR__ . '/../Fixtures/Config/contact_numbers.yaml')] public function testPopulate(): void { - $phone1 = (new Phone())->setType('mobile')->setNumber('0171 2456543'); - $phone2 = (new Phone())->setType('mobile')->setNumber('0172 2456543'); - $phone3 = (new Phone())->setType('home')->setNumber('0421 2456543'); - - $user = (new User())->setPhones([$phone1, $phone2, $phone3]); + $phone1 = '0171 2456543'; + $phone2 = '0172 2456543'; + $phone3 = '0421 2456543'; + $user = (new User())->setPhones([ + (new Phone())->setType('mobile')->setNumber($phone1), + (new Phone())->setType('mobile')->setNumber($phone2), + (new Phone())->setType('home')->setNumber($phone3), + ]); $person = new Person(); - $this->populator->populate($person, $user); + self::getContainer()->get('test.person.contactnumbers.populator')->populate($person, $user); - self::assertEquals( - [ - '0171 2456543', - '0172 2456543', - '0421 2456543', - ], - array_map( - function ($item) { - return $item->getPhoneNumber(); - }, - $person->getContactNumbers() - ) + self::assertSame( + [$phone1, $phone2, $phone3], + array_map(fn ($item) => $item->getPhoneNumber(), $person->getContactNumbers()), ); } } diff --git a/tests/Populator/ArrayPropertyMappingPopulatorIntegrationTest.php b/tests/Populator/ArrayPropertyMappingPopulatorIntegrationTest.php index b4f9089..11b47f7 100644 --- a/tests/Populator/ArrayPropertyMappingPopulatorIntegrationTest.php +++ b/tests/Populator/ArrayPropertyMappingPopulatorIntegrationTest.php @@ -4,22 +4,15 @@ namespace Neusta\ConverterBundle\Tests\Populator; -use Neusta\ConverterBundle\Populator\ArrayPropertyMappingPopulator; -use Neusta\ConverterBundle\Tests\Fixtures\Model\Hobby; -use Neusta\ConverterBundle\Tests\Fixtures\Model\Person; -use Neusta\ConverterBundle\Tests\Fixtures\Model\User; -use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; +use Neusta\ConverterBundle\Tests\ConfigurableKernelTestCase; +use Neusta\ConverterBundle\Tests\Fixtures\Model\Source\Hobby; +use Neusta\ConverterBundle\Tests\Fixtures\Model\Source\User; +use Neusta\ConverterBundle\Tests\Fixtures\Model\Target\Person; +use Neusta\ConverterBundle\Tests\Support\Attribute\ConfigureContainer; -class ArrayPropertyMappingPopulatorIntegrationTest extends KernelTestCase +class ArrayPropertyMappingPopulatorIntegrationTest extends ConfigurableKernelTestCase { - private ArrayPropertyMappingPopulator $populator; - - protected function setUp(): void - { - parent::setUp(); - $this->populator = self::getContainer()->get('test.person.activities.populator'); - } - + #[ConfigureContainer(__DIR__ . '/../Fixtures/Config/activities.yaml')] public function testPopulate(): void { $user = (new User())->setHobbies([ @@ -29,15 +22,15 @@ public function testPopulate(): void ]); $person = new Person(); - $this->populator->populate($person, $user); + self::getContainer()->get('test.person.activities.populator')->populate($person, $user); - self::assertEquals( + self::assertSame( [ 'reading', 'swimming', 'computers', ], - $person->getActivities() + $person->getActivities(), ); } } diff --git a/tests/Populator/ArrayPropertyMappingPopulatorTest.php b/tests/Populator/ArrayPropertyMappingPopulatorTest.php index e5b6a1a..14a7f34 100644 --- a/tests/Populator/ArrayPropertyMappingPopulatorTest.php +++ b/tests/Populator/ArrayPropertyMappingPopulatorTest.php @@ -5,9 +5,9 @@ namespace Neusta\ConverterBundle\Tests\Populator; use Neusta\ConverterBundle\Populator\ArrayPropertyMappingPopulator; -use Neusta\ConverterBundle\Tests\Fixtures\Model\Hobby; -use Neusta\ConverterBundle\Tests\Fixtures\Model\Person; -use Neusta\ConverterBundle\Tests\Fixtures\Model\User; +use Neusta\ConverterBundle\Tests\Fixtures\Model\Source\Hobby; +use Neusta\ConverterBundle\Tests\Fixtures\Model\Source\User; +use Neusta\ConverterBundle\Tests\Fixtures\Model\Target\Person; use PHPUnit\Framework\TestCase; use Prophecy\PhpUnit\ProphecyTrait; diff --git a/tests/Populator/ContextMappingPopulatorTest.php b/tests/Populator/ContextMappingPopulatorTest.php index 5f9a635..5a9581c 100644 --- a/tests/Populator/ContextMappingPopulatorTest.php +++ b/tests/Populator/ContextMappingPopulatorTest.php @@ -7,8 +7,8 @@ use Neusta\ConverterBundle\Converter\Context\GenericContext; use Neusta\ConverterBundle\Exception\PopulationException; use Neusta\ConverterBundle\Populator\ContextMappingPopulator; -use Neusta\ConverterBundle\Tests\Fixtures\Model\Person; -use Neusta\ConverterBundle\Tests\Fixtures\Model\User; +use Neusta\ConverterBundle\Tests\Fixtures\Model\Source\User; +use Neusta\ConverterBundle\Tests\Fixtures\Model\Target\Person; use PHPUnit\Framework\TestCase; class ContextMappingPopulatorTest extends TestCase diff --git a/tests/Populator/PersonAddressPopulatorIntegrationTest.php b/tests/Populator/PersonAddressPopulatorIntegrationTest.php index 4065d71..5d0f94b 100644 --- a/tests/Populator/PersonAddressPopulatorIntegrationTest.php +++ b/tests/Populator/PersonAddressPopulatorIntegrationTest.php @@ -4,71 +4,56 @@ namespace Neusta\ConverterBundle\Tests\Populator; -use Neusta\ConverterBundle\Converter\Context\GenericContext; use Neusta\ConverterBundle\Exception\PopulationException; -use Neusta\ConverterBundle\Populator; -use Neusta\ConverterBundle\Tests\Fixtures\Model\Address; -use Neusta\ConverterBundle\Tests\Fixtures\Model\Person; -use Neusta\ConverterBundle\Tests\Fixtures\Model\PersonAddress; +use Neusta\ConverterBundle\Tests\ConfigurableKernelTestCase; +use Neusta\ConverterBundle\Tests\Fixtures\Model\Source\Address; +use Neusta\ConverterBundle\Tests\Fixtures\Model\Source\User; +use Neusta\ConverterBundle\Tests\Fixtures\Model\Target\Person; +use Neusta\ConverterBundle\Tests\Fixtures\Model\Target\PersonAddress; use Neusta\ConverterBundle\Tests\Fixtures\Model\UnknownType; -use Neusta\ConverterBundle\Tests\Fixtures\Model\User; -use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; +use Neusta\ConverterBundle\Tests\Support\Attribute\ConfigureContainer; -class PersonAddressPopulatorIntegrationTest extends KernelTestCase +#[ConfigureContainer(__DIR__ . '/../Fixtures/Config/person.yaml')] +#[ConfigureContainer(__DIR__ . '/../Fixtures/Config/address.yaml')] +class PersonAddressPopulatorIntegrationTest extends ConfigurableKernelTestCase { public function testPopulate_regular_case(): void { - /** @var Populator $populator */ - $populator = self::getContainer()->get('test.person.address.populator'); - $address = (new Address()) + $user = (new User())->setAddress((new Address()) ->setCity('Bremen') ->setPostalCode('28217') ->setStreet('Konsul-Smidt-Straße') - ->setStreetNo('24'); - - $user = (new User())->setAddress($address); - + ->setStreetNo('24')); $person = (new Person())->setAddress(new PersonAddress()); - $populator->populate($person, $user); + self::getContainer()->get('test.person.address.populator')->populate($person, $user); - self::assertEquals('24', $person->getAddress()->getStreetNo()); + self::assertSame('24', $person->getAddress()->getStreetNo()); } public function testPopulate_wrong_source_type(): void { - /** @var Populator $populator */ - $populator = self::getContainer()->get('test.person.wrong.source.type.populator'); - $user = (new User())->setFieldWithUnknownType(new UnknownType()); - $person = (new Person())->setAddress(new PersonAddress()); $this->expectException(PopulationException::class); $this->expectExceptionMessageMatches("/Population Exception \(fieldWithUnknownType -> address\): (.*)/"); - $populator->populate($person, $user); - self::assertEquals('24', $person->getAddress()->getStreetNo()); + self::getContainer()->get('test.person.wrong.source.type.populator')->populate($person, $user); } public function testPopulate_wrong_converter(): void { - /** @var Populator $populator */ - $populator = self::getContainer()->get('test.person.wrong.converter.populator'); - $address = (new Address()) + $user = (new User())->setAddress((new Address()) ->setCity('Bremen') ->setPostalCode('28217') ->setStreet('Konsul-Smidt-Straße') - ->setStreetNo('24'); - - $user = (new User())->setAddress($address); - + ->setStreetNo('24')); $person = (new Person())->setAddress(new PersonAddress()); $this->expectException(PopulationException::class); $this->expectExceptionMessageMatches("/Population Exception \(address -> address\): (.*)/"); - $populator->populate($person, $user); - self::assertEquals('24', $person->getAddress()->getStreetNo()); + self::getContainer()->get('test.person.wrong.converter.populator')->populate($person, $user); } } diff --git a/tests/Populator/PropertyMappingPopulatorIntegrationTest.php b/tests/Populator/PropertyMappingPopulatorIntegrationTest.php index 8e29d0f..a73dda3 100644 --- a/tests/Populator/PropertyMappingPopulatorIntegrationTest.php +++ b/tests/Populator/PropertyMappingPopulatorIntegrationTest.php @@ -4,27 +4,20 @@ namespace Neusta\ConverterBundle\Tests\Populator; -use Neusta\ConverterBundle\Populator\PropertyMappingPopulator; -use Neusta\ConverterBundle\Tests\Fixtures\Model\Person; -use Neusta\ConverterBundle\Tests\Fixtures\Model\User; -use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; +use Neusta\ConverterBundle\Tests\ConfigurableKernelTestCase; +use Neusta\ConverterBundle\Tests\Fixtures\Model\Source\User; +use Neusta\ConverterBundle\Tests\Fixtures\Model\Target\Person; +use Neusta\ConverterBundle\Tests\Support\Attribute\ConfigureContainer; -class PropertyMappingPopulatorIntegrationTest extends KernelTestCase +class PropertyMappingPopulatorIntegrationTest extends ConfigurableKernelTestCase { - private PropertyMappingPopulator $populator; - - protected function setUp(): void - { - parent::setUp(); - $this->populator = self::getContainer()->get('test.person.fullName.populator'); - } - + #[ConfigureContainer(__DIR__ . '/../Fixtures/Config/full_name.yaml')] public function testPopulate(): void { $user = (new User())->setFullName('Max Mustermann'); $person = new Person(); - $this->populator->populate($person, $user); + self::getContainer()->get('test.person.fullName.populator')->populate($person, $user); self::assertEquals('Max Mustermann', $person->getFullName()); } diff --git a/tests/Populator/PropertyMappingPopulatorTest.php b/tests/Populator/PropertyMappingPopulatorTest.php index 7dabfda..1a60a7d 100644 --- a/tests/Populator/PropertyMappingPopulatorTest.php +++ b/tests/Populator/PropertyMappingPopulatorTest.php @@ -5,8 +5,8 @@ namespace Neusta\ConverterBundle\Tests\Populator; use Neusta\ConverterBundle\Populator\PropertyMappingPopulator; -use Neusta\ConverterBundle\Tests\Fixtures\Model\Person; -use Neusta\ConverterBundle\Tests\Fixtures\Model\User; +use Neusta\ConverterBundle\Tests\Fixtures\Model\Source\User; +use Neusta\ConverterBundle\Tests\Fixtures\Model\Target\Person; use PHPUnit\Framework\TestCase; use Prophecy\PhpUnit\ProphecyTrait; diff --git a/tests/Support/Attribute/ConfigureContainer.php b/tests/Support/Attribute/ConfigureContainer.php new file mode 100644 index 0000000..07e4b1f --- /dev/null +++ b/tests/Support/Attribute/ConfigureContainer.php @@ -0,0 +1,21 @@ +addTestConfig($this->config); + } +} diff --git a/tests/app/TestKernel.php b/tests/app/TestKernel.php index b5cefed..0702c3f 100644 --- a/tests/app/TestKernel.php +++ b/tests/app/TestKernel.php @@ -3,22 +3,25 @@ declare(strict_types=1); use Neusta\ConverterBundle\NeustaConverterBundle; -use Symfony\Bundle\FrameworkBundle\FrameworkBundle; -use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait; -use Symfony\Component\HttpKernel\Kernel; -class TestKernel extends Kernel +final class TestKernel extends Nyholm\BundleTest\TestKernel { - use MicroKernelTrait; + private ?string $testProjectDir = null; - public function registerBundles(): iterable + public function __construct(string $environment, bool $debug) { - yield new FrameworkBundle(); - yield new NeustaConverterBundle(); + parent::__construct($environment, $debug); + + $this->addTestBundle(NeustaConverterBundle::class); } public function getProjectDir(): string { - return __DIR__; + return $this->testProjectDir ?? __DIR__; + } + + public function setTestProjectDir($projectDir): void + { + $this->testProjectDir = $projectDir; } } diff --git a/tests/app/config/packages/framework.yaml b/tests/app/config/packages/framework.yaml deleted file mode 100644 index 04246e4..0000000 --- a/tests/app/config/packages/framework.yaml +++ /dev/null @@ -1,3 +0,0 @@ -framework: - secret: S3CRET - test: true diff --git a/tests/app/config/services.yaml b/tests/app/config/services.yaml deleted file mode 100644 index 81ea253..0000000 --- a/tests/app/config/services.yaml +++ /dev/null @@ -1,61 +0,0 @@ -services: - _defaults: - autowire: true - autoconfigure: true - # for tests only - public: true - - test.address.converter: - parent: 'neusta_converter.generic_converter' - public: true - arguments: - $factory: '@Neusta\ConverterBundle\Tests\Fixtures\Model\AddressFactory' - $populators: - - '@Neusta\ConverterBundle\Tests\Fixtures\Populator\AddressPopulator' - - Neusta\ConverterBundle\Tests\Fixtures\Populator\PersonNamePopulator: ~ - Neusta\ConverterBundle\Tests\Fixtures\Populator\AddressPopulator: ~ - - test.person.wrong.source.type.populator: - parent: 'neusta_converter.converting_populator' - public: true - arguments: - $converter: '@test.address.converter' - $sourcePropertyName: 'fieldWithUnknownType' - $targetPropertyName: 'address' - - test.person.wrong.converter.populator: - parent: 'neusta_converter.converting_populator' - public: true - arguments: - $converter: '@test.person.converter' # wrong converter for testing - $sourcePropertyName: 'address' - $targetPropertyName: 'address' - - - test.person.fullName.populator: - parent: 'neusta_converter.property_mapping_populator' - public: true - arguments: - $targetProperty: 'fullName' - $sourceProperty: 'fullName' - - test.person.activities.populator: - parent: 'neusta_converter.array_property_mapping_populator' - public: true - arguments: - $sourceArrayItemProperty: 'label' - $sourceArrayProperty: 'hobbies' - $targetProperty: 'activities' - - test.person.contactnumbers.populator: - parent: 'neusta_converter.array_converting_populator' - public: true - arguments: - $converter: '@test.contactnumber.converter' - $sourceArrayPropertyName: 'phones' - $targetPropertyName: 'contactNumbers' - - Neusta\ConverterBundle\Tests\Fixtures\Model\PersonFactory: ~ - Neusta\ConverterBundle\Tests\Fixtures\Model\AddressFactory: ~ - Neusta\ConverterBundle\Tests\Fixtures\Model\ContactNumberFactory: ~