Skip to content

Commit

Permalink
drop-mapping-config
Browse files Browse the repository at this point in the history
  • Loading branch information
Dominik Zogg committed May 2, 2020
1 parent 95585af commit 226d34b
Show file tree
Hide file tree
Showing 4 changed files with 117 additions and 205 deletions.
59 changes: 19 additions & 40 deletions app/ServiceFactory/DeserializationServiceFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,13 @@
use App\Mapping\Deserialization\PetCollectionMapping;
use App\Mapping\Deserialization\PetMapping;
use App\Mapping\Deserialization\VaccinationMapping;
use App\Mapping\MappingConfig;
use App\Model\Pet;
use App\Model\Vaccination;
use Chubbyphp\Deserialization\Decoder\JsonTypeDecoder;
use Chubbyphp\Deserialization\Decoder\JsonxTypeDecoder;
use Chubbyphp\Deserialization\Decoder\UrlEncodedTypeDecoder;
use Chubbyphp\Deserialization\Decoder\YamlTypeDecoder;
use Chubbyphp\Deserialization\Mapping\CallableDenormalizationObjectMapping;
use Chubbyphp\Deserialization\Mapping\DenormalizationObjectMappingInterface;
use Chubbyphp\Deserialization\Mapping\LazyDenormalizationObjectMapping;
use Psr\Container\ContainerInterface;

final class DeserializationServiceFactory
Expand All @@ -28,48 +26,29 @@ public function __invoke(): array
{
return [
'deserializer.decodertypes' => static function () {
$decoderTypes = [];

$decoderTypes[] = new JsonTypeDecoder();
$decoderTypes[] = new JsonxTypeDecoder('application/jsonx+xml');
$decoderTypes[] = new UrlEncodedTypeDecoder();
$decoderTypes[] = new YamlTypeDecoder();

return $decoderTypes;
},
'deserializer.mappingConfigs' => static function () {
return [
PetCollection::class => new MappingConfig(PetCollectionMapping::class),
Pet::class => new MappingConfig(PetMapping::class),
Vaccination::class => new MappingConfig(VaccinationMapping::class),
new JsonTypeDecoder(),
new JsonxTypeDecoder('application/jsonx+xml'),
new UrlEncodedTypeDecoder(),
new YamlTypeDecoder(),
];
},
PetCollectionMapping::class => static function () {
return new PetCollectionMapping();
},
PetMapping::class => static function () {
return new PetMapping();
},
VaccinationMapping::class => static function () {
return new VaccinationMapping();
},
'deserializer.denormalizer.objectmappings' => function (ContainerInterface $container) {
$mappings = [];
foreach ($container->get('deserializer.mappingConfigs') as $class => $mappingConfig) {
$resolver = function () use ($container, $mappingConfig) {
return $this->resolve($container, $mappingConfig);
};

$mappings[] = new CallableDenormalizationObjectMapping($class, $resolver);
}

return $mappings;
return [
new LazyDenormalizationObjectMapping($container, PetCollectionMapping::class, PetCollection::class),
new LazyDenormalizationObjectMapping($container, PetMapping::class, Pet::class),
new LazyDenormalizationObjectMapping($container, VaccinationMapping::class, Vaccination::class),
];
},
];
}

private function resolve(
ContainerInterface $container,
MappingConfig $mappingConfig
): DenormalizationObjectMappingInterface {
$mappingClass = $mappingConfig->getMappingClass();

$dependencies = [];
foreach ($mappingConfig->getDependencies() as $dependency) {
$dependencies[] = $container->get($dependency);
}

return new $mappingClass(...$dependencies);
}
}
77 changes: 38 additions & 39 deletions app/ServiceFactory/SerializationServiceFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
namespace App\ServiceFactory;

use App\Collection\PetCollection;
use App\Mapping\MappingConfig;
use App\Mapping\Serialization\PetCollectionMapping;
use App\Mapping\Serialization\PetMapping;
use App\Mapping\Serialization\VaccinationMapping;
Expand All @@ -28,8 +27,7 @@
use Chubbyphp\Serialization\Encoder\JsonxTypeEncoder;
use Chubbyphp\Serialization\Encoder\UrlEncodedTypeEncoder;
use Chubbyphp\Serialization\Encoder\YamlTypeEncoder;
use Chubbyphp\Serialization\Mapping\CallableNormalizationObjectMapping;
use Chubbyphp\Serialization\Mapping\NormalizationObjectMappingInterface;
use Chubbyphp\Serialization\Mapping\LazyNormalizationObjectMapping;
use Psr\Container\ContainerInterface;

final class SerializationServiceFactory
Expand All @@ -50,45 +48,46 @@ public function __invoke(): array

return $encoderTypes;
},
'serializer.mappingConfigs' => static function () {
return [
BadRequest::class => new MappingConfig(BadRequestMapping::class),
InternalServerError::class => new MappingConfig(InternalServerErrorMapping::class),
NotAcceptable::class => new MappingConfig(NotAcceptableMapping::class),
NotFound::class => new MappingConfig(NotFoundMapping::class),
Pet::class => new MappingConfig(PetMapping::class, [RouterInterface::class]),
PetCollection::class => new MappingConfig(PetCollectionMapping::class, [RouterInterface::class]),
UnprocessableEntity::class => new MappingConfig(UnprocessableEntityMapping::class),
UnsupportedMediaType::class => new MappingConfig(UnsupportedMediaTypeMapping::class),
Vaccination::class => new MappingConfig(VaccinationMapping::class),
];
BadRequestMapping::class => static function () {
return new BadRequestMapping();
},
InternalServerErrorMapping::class => static function () {
return new InternalServerErrorMapping();
},
NotAcceptableMapping::class => static function () {
return new NotAcceptableMapping();
},
NotFoundMapping::class => static function () {
return new NotFoundMapping();
},
PetCollectionMapping::class => static function (ContainerInterface $container) {
return new PetCollectionMapping($container->get(RouterInterface::class));
},
PetMapping::class => static function (ContainerInterface $container) {
return new PetMapping($container->get(RouterInterface::class));
},
UnprocessableEntityMapping::class => static function () {
return new UnprocessableEntityMapping();
},
UnsupportedMediaTypeMapping::class => static function () {
return new UnsupportedMediaTypeMapping();
},
VaccinationMapping::class => static function () {
return new VaccinationMapping();
},
'serializer.normalizer.objectmappings' => function (ContainerInterface $container) {
$mappings = [];
foreach ($container->get('serializer.mappingConfigs') as $class => $mappingConfig) {
$resolver = function () use ($container, $mappingConfig) {
return $this->resolve($container, $mappingConfig);
};

$mappings[] = new CallableNormalizationObjectMapping($class, $resolver);
}

return $mappings;
return [
new LazyNormalizationObjectMapping($container, BadRequestMapping::class, BadRequest::class),
new LazyNormalizationObjectMapping($container, InternalServerErrorMapping::class, InternalServerError::class),
new LazyNormalizationObjectMapping($container, NotAcceptableMapping::class, NotAcceptable::class),
new LazyNormalizationObjectMapping($container, NotFoundMapping::class, NotFound::class),
new LazyNormalizationObjectMapping($container, PetCollectionMapping::class, PetCollection::class),
new LazyNormalizationObjectMapping($container, PetMapping::class, Pet::class),
new LazyNormalizationObjectMapping($container, UnprocessableEntityMapping::class, UnprocessableEntity::class),
new LazyNormalizationObjectMapping($container, UnsupportedMediaTypeMapping::class, UnsupportedMediaType::class),
new LazyNormalizationObjectMapping($container, VaccinationMapping::class, Vaccination::class),
];
},
];
}

private function resolve(
ContainerInterface $container,
MappingConfig $mappingConfig
): NormalizationObjectMappingInterface {
$mappingClass = $mappingConfig->getMappingClass();

$dependencies = [];
foreach ($mappingConfig->getDependencies() as $dependency) {
$dependencies[] = $container->get($dependency);
}

return new $mappingClass(...$dependencies);
}
}
85 changes: 27 additions & 58 deletions tests/Unit/ServiceFactory/DeserializationServiceFactoryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,16 @@
use App\Mapping\Deserialization\PetCollectionMapping;
use App\Mapping\Deserialization\PetMapping;
use App\Mapping\Deserialization\VaccinationMapping;
use App\Mapping\MappingConfig;
use App\Model\Pet;
use App\Model\Vaccination;
use App\ServiceFactory\DeserializationServiceFactory;
use Chubbyphp\Container\Container;
use Chubbyphp\Deserialization\Decoder\JsonTypeDecoder;
use Chubbyphp\Deserialization\Decoder\JsonxTypeDecoder;
use Chubbyphp\Deserialization\Decoder\UrlEncodedTypeDecoder;
use Chubbyphp\Deserialization\Decoder\YamlTypeDecoder;
use Chubbyphp\Deserialization\Mapping\CallableDenormalizationObjectMapping;
use Chubbyphp\Mock\Call;
use Chubbyphp\Mock\MockByCallsTrait;
use PHPUnit\Framework\MockObject\MockObject;
use Chubbyphp\Deserialization\Mapping\LazyDenormalizationObjectMapping;
use PHPUnit\Framework\TestCase;
use Psr\Container\ContainerInterface;

/**
* @covers \App\ServiceFactory\DeserializationServiceFactory
Expand All @@ -30,13 +26,11 @@
*/
final class DeserializationServiceFactoryTest extends TestCase
{
use MockByCallsTrait;

public function testFactories(): void
{
$factories = (new DeserializationServiceFactory())();

self::assertCount(3, $factories);
self::assertCount(5, $factories);
}

public function testDecoderTypes(): void
Expand Down Expand Up @@ -66,68 +60,43 @@ public function testDecoderTypes(): void
self::assertInstanceOf(YamlTypeDecoder::class, array_shift($decoderTypes));
}

public function testMappingConfigs(): void
{
$factories = (new DeserializationServiceFactory())();

self::assertArrayHasKey('deserializer.mappingConfigs', $factories);

$mappingConfigs = $factories['deserializer.mappingConfigs']();

self::assertIsArray($mappingConfigs);

self::assertCount(3, $mappingConfigs);

self::assertMappingConfig($mappingConfigs, PetCollection::class, PetCollectionMapping::class);
self::assertMappingConfig($mappingConfigs, Pet::class, PetMapping::class);
self::assertMappingConfig($mappingConfigs, Vaccination::class, VaccinationMapping::class);
}

public function testObjectMappings(): void
{
/** @var ContainerInterface|MockObject $container */
$container = $this->getMockByCalls(ContainerInterface::class, [
Call::create('get')->with('deserializer.mappingConfigs')->willReturn([
Pet::class => new MappingConfig(PetMapping::class, ['dependencyClass']),
]),
Call::create('get')->with('dependencyClass')->willReturn(new \stdClass()),
]);
$expectedMappings = [
PetCollectionMapping::class => PetCollection::class,
PetMapping::class => Pet::class,
VaccinationMapping::class => Vaccination::class,
];

$factories = (new DeserializationServiceFactory())();

self::assertArrayHasKey('deserializer.denormalizer.objectmappings', $factories);

$mappings = $factories['deserializer.denormalizer.objectmappings']($container);
$container = new Container();
$container->factory(
'deserializer.denormalizer.objectmappings',
$factories['deserializer.denormalizer.objectmappings']
);

self::assertIsArray($mappings);
foreach ($expectedMappings as $mappingClass => $class) {
$container->factory($mappingClass, $factories[$mappingClass]);
}

self::assertCount(1, $mappings);
self::assertArrayHasKey('deserializer.denormalizer.objectmappings', $factories);

/** @var CallableDenormalizationObjectMapping $mapping */
$mapping = array_shift($mappings);
$mappings = $container->get('deserializer.denormalizer.objectmappings');

self::assertInstanceOf(CallableDenormalizationObjectMapping::class, $mapping);
self::assertIsArray($mappings);

$mapping->getDenormalizationFactory('path');
}
self::assertCount(count($expectedMappings), $mappings);

/**
* @param array<string, MappingConfig> $mappingConfigs
*/
private function assertMappingConfig(
array $mappingConfigs,
string $class,
string $mappingClass,
array $dependencies = []
): void {
self::assertArrayHasKey($class, $mappingConfigs);
foreach ($expectedMappings as $mappingClass => $class) {
/** @var LazyDenormalizationObjectMapping $mapping */
$mapping = array_shift($mappings);

/** @var MappingConfig $mappingConfig */
$mappingConfig = $mappingConfigs[$class];
self::assertInstanceOf(LazyDenormalizationObjectMapping::class, $mapping);

self::assertInstanceOf(MappingConfig::class, $mappingConfig);
self::assertSame($class, $mapping->getClass());

self::assertSame($mappingClass, $mappingConfig->getMappingClass());
self::assertSame($dependencies, $mappingConfig->getDependencies());
$mapping->getDenormalizationFieldMappings('path');
}
}
}

0 comments on commit 226d34b

Please sign in to comment.