Skip to content

Commit 14d9fe5

Browse files
committed
test: input without data transformer only with operation
1 parent 21a8a40 commit 14d9fe5

File tree

11 files changed

+90
-11
lines changed

11 files changed

+90
-11
lines changed

src/Metadata/Resource/Factory/AttributesResourceMetadataCollectionFactory.php

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -137,12 +137,8 @@ private function buildResourceOperations(array $attributes, string $resourceClas
137137

138138
// Loop again and set default operations if none where found
139139
foreach ($resources as $index => $resource) {
140-
if (\count($resource->getOperations() ?? [])) {
141-
continue;
142-
}
143-
144140
$operations = [];
145-
foreach ([new Get(), new GetCollection(), new Post(), new Put(), new Patch(), new Delete()] as $i => $operation) {
141+
foreach ($resource->getOperations() ?? [new Get(), new GetCollection(), new Post(), new Put(), new Patch(), new Delete()] as $i => $operation) {
146142
[$key, $operation] = $this->getOperationWithDefaults($resource, $operation);
147143
$operations[$key] = $operation;
148144
}

src/Metadata/Resource/Factory/UriTemplateResourceMetadataCollectionFactory.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,21 +59,33 @@ public function create(string $resourceClass): ResourceMetadataCollection
5959

6060
$operations = new Operations();
6161
foreach ($resource->getOperations() ?? new Operations() as $key => $operation) {
62+
/** @var Operation */
6263
$operation = $this->configureUriVariables($operation);
6364

6465
if ($operation->getUriTemplate()) {
6566
$operation = $operation->withExtraProperties($operation->getExtraProperties() + ['user_defined_uri_template' => true]);
67+
if (!$operation->getName()) {
68+
$operation = $operation->withName($key);
69+
}
70+
6671
$operations->add($key, $operation);
6772
continue;
6873
}
6974

7075
if ($routeName = $operation->getRouteName()) {
76+
if (!$operation->getName()) {
77+
$operation = $operation->withName($routeName);
78+
}
79+
7180
$operations->add($routeName, $operation);
7281
continue;
7382
}
7483

7584
$operation = $operation->withUriTemplate($this->generateUriTemplate($operation));
7685
$operationName = $operation->getName() ?: sprintf('_api_%s_%s%s', $operation->getUriTemplate(), strtolower($operation->getMethod() ?? Operation::METHOD_GET), $operation->isCollection() ? '_collection' : '');
86+
if (!$operation->getName()) {
87+
$operation = $operation->withName($operationName);
88+
}
7789

7890
$operations->add($operationName, $operation);
7991
}

src/OpenApi/Factory/OpenApiFactory.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ final class OpenApiFactory implements OpenApiFactoryInterface
6464
private $openApiOptions;
6565
private $paginationOptions;
6666
private $router;
67+
private $routeCollection;
6768

6869
public function __construct(ResourceNameCollectionFactoryInterface $resourceNameCollectionFactory, ResourceMetadataCollectionFactoryInterface $resourceMetadataFactory, $propertyNameCollectionFactory, $propertyMetadataFactory, SchemaFactoryInterface $jsonSchemaFactory, TypeFactoryInterface $jsonSchemaTypeFactory, OperationPathResolverInterface $operationPathResolver, ContainerInterface $filterLocator, array $formats = [], Options $openApiOptions = null, PaginationOptions $paginationOptions = null, RouterInterface $router = null)
6970
{
@@ -141,8 +142,13 @@ private function collectPaths(ApiResource $resource, ResourceMetadataCollection
141142

142143
$uriVariables = $operation->getUriVariables();
143144
$resourceClass = $operation->getClass() ?? $resource->getClass();
145+
$routeName = $operation->getRouteName() ?? $operation->getName();
144146

145-
$path = $this->getPath($operation->getRouteName() ? $this->router->getRouteCollection()->get($operation->getRouteName())->getPath() : ($operation->getRoutePrefix() ?? '').$operation->getUriTemplate());
147+
if (!$this->routeCollection && $this->router) {
148+
$this->routeCollection = $this->router->getRouteCollection();
149+
}
150+
151+
$path = $this->getPath($routeName && $this->routeCollection ? $this->routeCollection->get($routeName)->getPath() : ($operation->getRoutePrefix() ?? '').$operation->getUriTemplate());
146152
$method = $operation->getMethod() ?? Operation::METHOD_GET;
147153

148154
if (!\in_array($method, Model\PathItem::$methods, true)) {

src/Serializer/AbstractItemNormalizer.php

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -260,8 +260,10 @@ public function denormalize($data, $class, $format = null, array $context = [])
260260
return $dataTransformer->transform($denormalizedInput, $resourceClass, $dataTransformerContext);
261261
}
262262

263-
$resourceClass = $inputClass;
264-
$context['resource_class'] = $inputClass;
263+
if ($context['operation'] ?? false) {
264+
$resourceClass = $inputClass;
265+
$context['resource_class'] = $inputClass;
266+
}
265267
}
266268

267269
$supportsPlainIdentifiers = $this->supportsPlainIdentifiers();
@@ -296,6 +298,10 @@ public function denormalize($data, $class, $format = null, array $context = [])
296298
$previousObject = null !== $objectToPopulate ? clone $objectToPopulate : null;
297299
$object = parent::denormalize($data, $resourceClass, $format, $context);
298300

301+
if (!$this->resourceClassResolver->isResourceClass($context['resource_class'])) {
302+
return $object;
303+
}
304+
299305
// Revert attributes that aren't allowed to be changed after a post-denormalize check
300306
foreach (array_keys($data) as $attribute) {
301307
if (!$this->canAccessAttributePostDenormalize($object, $previousObject, $attribute, $context)) {
@@ -420,6 +426,10 @@ protected function extractAttributes($object, $format = null, array $context = [
420426
*/
421427
protected function getAllowedAttributes($classOrObject, array $context, $attributesAsString = false)
422428
{
429+
if (!$this->resourceClassResolver->isResourceClass($context['resource_class'])) {
430+
return parent::getAllowedAttributes($classOrObject, $context, $attributesAsString);
431+
}
432+
423433
$options = $this->getFactoryOptions($context);
424434
$propertyNames = $this->propertyNameCollectionFactory->create($context['resource_class'], $options);
425435

@@ -462,6 +472,10 @@ protected function isAllowedAttribute($classOrObject, $attribute, $format = null
462472
*/
463473
protected function canAccessAttribute($object, string $attribute, array $context = []): bool
464474
{
475+
if (!$this->resourceClassResolver->isResourceClass($context['resource_class'])) {
476+
return true;
477+
}
478+
465479
$options = $this->getFactoryOptions($context);
466480
/** @var PropertyMetadata|ApiProperty */
467481
$propertyMetadata = $this->propertyMetadataFactory->create($context['resource_class'], $attribute, $options);
@@ -863,6 +877,10 @@ protected function transformOutput($object, array $context = [], string $outputC
863877

864878
private function createAttributeValue($attribute, $value, $format = null, array $context = [])
865879
{
880+
if (!$this->resourceClassResolver->isResourceClass($context['resource_class'])) {
881+
return $value;
882+
}
883+
866884
/** @var ApiProperty|PropertyMetadata */
867885
$propertyMetadata = $this->propertyMetadataFactory->create($context['resource_class'], $attribute, $this->getFactoryOptions($context));
868886
$type = $propertyMetadata instanceof PropertyMetadata ? $propertyMetadata->getType() : ($propertyMetadata->getBuiltinTypes()[0] ?? null);

tests/Fixtures/TestBundle/DataPersister/UserResetPasswordDataPersister.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,3 @@ public function supports($data): bool
3838
return $data instanceof UserResetPasswordDto;
3939
}
4040
}
41-

tests/GraphQl/Serializer/ItemNormalizerTest.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ public function testNormalize()
9393

9494
$resourceClassResolverProphecy = $this->prophesize(ResourceClassResolverInterface::class);
9595
$resourceClassResolverProphecy->getResourceClass($dummy, null)->willReturn(Dummy::class);
96+
$resourceClassResolverProphecy->isResourceClass(Dummy::class)->willReturn(true);
9697

9798
$serializerProphecy = $this->prophesize(SerializerInterface::class);
9899
$serializerProphecy->willImplement(NormalizerInterface::class);
@@ -147,6 +148,7 @@ public function testNormalizeNoResolverData(): void
147148

148149
$resourceClassResolverProphecy = $this->prophesize(ResourceClassResolverInterface::class);
149150
$resourceClassResolverProphecy->getResourceClass($dummy, null)->willReturn(Dummy::class);
151+
$resourceClassResolverProphecy->isResourceClass(Dummy::class)->willReturn(true);
150152

151153
$serializerProphecy = $this->prophesize(SerializerInterface::class);
152154
$serializerProphecy->willImplement(NormalizerInterface::class);
@@ -196,6 +198,7 @@ public function testDenormalize()
196198

197199
$resourceClassResolverProphecy = $this->prophesize(ResourceClassResolverInterface::class);
198200
$resourceClassResolverProphecy->getResourceClass(null, Dummy::class)->willReturn(Dummy::class);
201+
$resourceClassResolverProphecy->isResourceClass(Dummy::class)->willReturn(true);
199202

200203
$serializerProphecy = $this->prophesize(SerializerInterface::class);
201204
$serializerProphecy->willImplement(DenormalizerInterface::class);

tests/Hal/Serializer/ItemNormalizerTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ public function testNormalize()
134134
$resourceClassResolverProphecy->getResourceClass($dummy, Dummy::class)->willReturn(Dummy::class);
135135
$resourceClassResolverProphecy->getResourceClass($relatedDummy, RelatedDummy::class)->willReturn(RelatedDummy::class);
136136
$resourceClassResolverProphecy->isResourceClass(RelatedDummy::class)->willReturn(true);
137+
$resourceClassResolverProphecy->isResourceClass(Dummy::class)->willReturn(true);
137138

138139
$serializerProphecy = $this->prophesize(SerializerInterface::class);
139140
$serializerProphecy->willImplement(NormalizerInterface::class);
@@ -201,6 +202,7 @@ public function testNormalizeWithoutCache()
201202
$resourceClassResolverProphecy->getResourceClass($dummy, Dummy::class)->willReturn(Dummy::class);
202203
$resourceClassResolverProphecy->getResourceClass($relatedDummy, RelatedDummy::class)->willReturn(RelatedDummy::class);
203204
$resourceClassResolverProphecy->isResourceClass(RelatedDummy::class)->willReturn(true);
205+
$resourceClassResolverProphecy->isResourceClass(Dummy::class)->willReturn(true);
204206

205207
$serializerProphecy = $this->prophesize(SerializerInterface::class);
206208
$serializerProphecy->willImplement(NormalizerInterface::class);

tests/JsonApi/Serializer/ItemNormalizerTest.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ public function testNormalize(): void
121121
$resourceClassResolverProphecy = $this->prophesize(ResourceClassResolverInterface::class);
122122
$resourceClassResolverProphecy->getResourceClass($dummy, null)->willReturn(Dummy::class);
123123
$resourceClassResolverProphecy->getResourceClass($dummy, Dummy::class)->willReturn(Dummy::class);
124+
$resourceClassResolverProphecy->isResourceClass(Dummy::class)->willReturn(true);
124125

125126
$propertyAccessorProphecy = $this->prophesize(PropertyAccessorInterface::class);
126127
$propertyAccessorProphecy->getValue($dummy, 'id')->willReturn(10);
@@ -187,6 +188,7 @@ public function testNormalizeChildInheritedProperty(): void
187188
$resourceClassResolverProphecy = $this->prophesize(ResourceClassResolverInterface::class);
188189
$resourceClassResolverProphecy->getResourceClass($dummy, null)->willReturn(Dummy::class);
189190
$resourceClassResolverProphecy->getResourceClass($dummy, Dummy::class)->willReturn(Dummy::class);
191+
$resourceClassResolverProphecy->isResourceClass(Dummy::class)->willReturn(true);
190192

191193
$propertyAccessorProphecy = $this->prophesize(PropertyAccessorInterface::class);
192194
$propertyAccessorProphecy->getValue($dummy, 'id')->willReturn(10);
@@ -299,6 +301,7 @@ public function testNormalizeNonExistentProperty()
299301
$resourceClassResolverProphecy = $this->prophesize(ResourceClassResolverInterface::class);
300302
$resourceClassResolverProphecy->getResourceClass($dummy, null)->willReturn(Dummy::class);
301303
$resourceClassResolverProphecy->getResourceClass($dummy, Dummy::class)->willReturn(Dummy::class);
304+
$resourceClassResolverProphecy->isResourceClass(Dummy::class)->willReturn(true);
302305

303306
$propertyAccessorProphecy = $this->prophesize(PropertyAccessorInterface::class);
304307
$propertyAccessorProphecy->getValue($dummy, 'bar')->willThrow(new NoSuchPropertyException());
@@ -384,6 +387,7 @@ public function testDenormalize()
384387
$resourceClassResolverProphecy->getResourceClass(null, Dummy::class)->willReturn(Dummy::class);
385388
$resourceClassResolverProphecy->getResourceClass(null, RelatedDummy::class)->willReturn(RelatedDummy::class);
386389
$resourceClassResolverProphecy->isResourceClass(RelatedDummy::class)->willReturn(true);
390+
$resourceClassResolverProphecy->isResourceClass(Dummy::class)->willReturn(true);
387391

388392
$serializerProphecy = $this->prophesize(SerializerInterface::class);
389393
$serializerProphecy->willImplement(NormalizerInterface::class);
@@ -472,6 +476,7 @@ public function testDenormalizeCollectionIsNotArray()
472476
$resourceClassResolverProphecy->getResourceClass(null, Dummy::class)->willReturn(Dummy::class);
473477
$resourceClassResolverProphecy->getResourceClass(null, RelatedDummy::class)->willReturn(RelatedDummy::class);
474478
$resourceClassResolverProphecy->isResourceClass(RelatedDummy::class)->willReturn(true);
479+
$resourceClassResolverProphecy->isResourceClass(Dummy::class)->willReturn(true);
475480

476481
$propertyAccessorProphecy = $this->prophesize(PropertyAccessorInterface::class);
477482

@@ -528,6 +533,7 @@ public function testDenormalizeCollectionWithInvalidKey()
528533
$resourceClassResolverProphecy = $this->prophesize(ResourceClassResolverInterface::class);
529534
$resourceClassResolverProphecy->getResourceClass(null, Dummy::class)->willReturn(Dummy::class);
530535
$resourceClassResolverProphecy->getResourceClass(null, RelatedDummy::class)->willReturn(RelatedDummy::class);
536+
$resourceClassResolverProphecy->isResourceClass(Dummy::class)->willReturn(true);
531537
$resourceClassResolverProphecy->isResourceClass(RelatedDummy::class)->willReturn(true);
532538

533539
$propertyAccessorProphecy = $this->prophesize(PropertyAccessorInterface::class);
@@ -581,6 +587,7 @@ public function testDenormalizeRelationIsNotResourceLinkage()
581587
$resourceClassResolverProphecy->getResourceClass(null, Dummy::class)->willReturn(Dummy::class);
582588
$resourceClassResolverProphecy->getResourceClass(null, RelatedDummy::class)->willReturn(RelatedDummy::class);
583589
$resourceClassResolverProphecy->isResourceClass(RelatedDummy::class)->willReturn(true);
590+
$resourceClassResolverProphecy->isResourceClass(Dummy::class)->willReturn(true);
584591

585592
$propertyAccessorProphecy = $this->prophesize(PropertyAccessorInterface::class);
586593

tests/JsonLd/Serializer/ItemNormalizerTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ public function testNormalize()
113113
$resourceClassResolverProphecy = $this->prophesize(ResourceClassResolverInterface::class);
114114
$resourceClassResolverProphecy->getResourceClass($dummy, null)->willReturn(Dummy::class);
115115
$resourceClassResolverProphecy->getResourceClass($dummy, Dummy::class)->willReturn(Dummy::class);
116+
$resourceClassResolverProphecy->isResourceClass(Dummy::class)->willReturn(true);
116117

117118
$serializerProphecy = $this->prophesize(SerializerInterface::class);
118119
$serializerProphecy->willImplement(NormalizerInterface::class);

0 commit comments

Comments
 (0)