Skip to content

Commit ef4731a

Browse files
committed
Allow serializing when property and method start from "is"
Follow up for https://github.com/api-platform/core/pull/4064/files
1 parent a32b677 commit ef4731a

File tree

8 files changed

+192
-92
lines changed

8 files changed

+192
-92
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
Feature: Serialization of boolean properties
2+
In order to use an hypermedia API
3+
As a client software developer
4+
I need to be able get boolean properties with is* methods
5+
6+
@createSchema
7+
Scenario: Create a dummy boolean resource
8+
When I add "Content-Type" header equal to "application/ld+json"
9+
And I send a "POST" request to "/dummy_booleans" with body:
10+
"""
11+
{
12+
"isDummyBoolean": true
13+
}
14+
"""
15+
Then the response status code should be 201
16+
And the response should be in JSON
17+
And the header "Content-Type" should be equal to "application/ld+json; charset=utf-8"
18+
And the header "Content-Location" should be equal to "/dummy_booleans/1"
19+
And the header "Location" should be equal to "/dummy_booleans/1"
20+
And the JSON should be equal to:
21+
"""
22+
{
23+
"@context": "/contexts/DummyBoolean",
24+
"@id": "/dummy_booleans/1",
25+
"@type": "DummyBoolean",
26+
"id": 1,
27+
"isDummyBoolean": true,
28+
"dummyBoolean": true
29+
}
30+
"""

src/Serializer/AbstractItemNormalizer.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -517,7 +517,10 @@ protected function denormalizeRelation(string $attributeName, PropertyMetadata $
517517
*/
518518
protected function getFactoryOptions(array $context): array
519519
{
520-
$options = [];
520+
$options = [
521+
/* @see https://github.com/symfony/symfony/blob/v5.1.0/src/Symfony/Component/PropertyInfo/Extractor/ReflectionExtractor.php */
522+
'enable_getter_setter_extraction' => true,
523+
];
521524

522525
if (isset($context[self::GROUPS])) {
523526
/* @see https://github.com/symfony/symfony/blob/v4.2.6/src/Symfony/Component/PropertyInfo/Extractor/SerializerExtractor.php */

tests/GraphQl/Serializer/ItemNormalizerTest.php

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,15 @@ public function testNormalize()
7676
$dummy = new Dummy();
7777
$dummy->setName('hello');
7878

79+
$defaultOptions = ['enable_getter_setter_extraction' => true];
80+
7981
$propertyNameCollection = new PropertyNameCollection(['name']);
8082
$propertyNameCollectionFactoryProphecy = $this->prophesize(PropertyNameCollectionFactoryInterface::class);
81-
$propertyNameCollectionFactoryProphecy->create(Dummy::class, [])->willReturn($propertyNameCollection);
83+
$propertyNameCollectionFactoryProphecy->create(Dummy::class, $defaultOptions)->willReturn($propertyNameCollection);
8284

8385
$propertyMetadata = new PropertyMetadata(null, null, true);
8486
$propertyMetadataFactoryProphecy = $this->prophesize(PropertyMetadataFactoryInterface::class);
85-
$propertyMetadataFactoryProphecy->create(Dummy::class, 'name', [])->willReturn($propertyMetadata);
87+
$propertyMetadataFactoryProphecy->create(Dummy::class, 'name', $defaultOptions)->willReturn($propertyMetadata);
8688

8789
$iriConverterProphecy = $this->prophesize(IriConverterInterface::class);
8890
$iriConverterProphecy->getIriFromItem($dummy)->willReturn('/dummies/1');
@@ -131,13 +133,15 @@ public function testNormalizeNoResolverData(): void
131133
$dummy = new Dummy();
132134
$dummy->setName('hello');
133135

136+
$defaultOptions = ['enable_getter_setter_extraction' => true];
137+
134138
$propertyNameCollection = new PropertyNameCollection(['name']);
135139
$propertyNameCollectionFactoryProphecy = $this->prophesize(PropertyNameCollectionFactoryInterface::class);
136-
$propertyNameCollectionFactoryProphecy->create(Dummy::class, [])->willReturn($propertyNameCollection);
140+
$propertyNameCollectionFactoryProphecy->create(Dummy::class, $defaultOptions)->willReturn($propertyNameCollection);
137141

138142
$propertyMetadata = new PropertyMetadata(null, null, true);
139143
$propertyMetadataFactoryProphecy = $this->prophesize(PropertyMetadataFactoryInterface::class);
140-
$propertyMetadataFactoryProphecy->create(Dummy::class, 'name', [])->willReturn($propertyMetadata);
144+
$propertyMetadataFactoryProphecy->create(Dummy::class, 'name', $defaultOptions)->willReturn($propertyMetadata);
141145

142146
$iriConverterProphecy = $this->prophesize(IriConverterInterface::class);
143147
$iriConverterProphecy->getIriFromItem($dummy)->willReturn('/dummies/1');
@@ -181,13 +185,15 @@ public function testDenormalize()
181185
{
182186
$context = ['resource_class' => Dummy::class, 'api_allow_update' => true];
183187

188+
$defaultOptions = ['enable_getter_setter_extraction' => true];
189+
184190
$propertyNameCollection = new PropertyNameCollection(['name']);
185191
$propertyNameCollectionFactoryProphecy = $this->prophesize(PropertyNameCollectionFactoryInterface::class);
186-
$propertyNameCollectionFactoryProphecy->create(Dummy::class, [])->willReturn($propertyNameCollection)->shouldBeCalled();
192+
$propertyNameCollectionFactoryProphecy->create(Dummy::class, $defaultOptions)->willReturn($propertyNameCollection)->shouldBeCalled();
187193

188194
$propertyMetadata = new PropertyMetadata(null, null, true, true);
189195
$propertyMetadataFactoryProphecy = $this->prophesize(PropertyMetadataFactoryInterface::class);
190-
$propertyMetadataFactoryProphecy->create(Dummy::class, 'name', [])->willReturn($propertyMetadata)->shouldBeCalled();
196+
$propertyMetadataFactoryProphecy->create(Dummy::class, 'name', $defaultOptions)->willReturn($propertyMetadata)->shouldBeCalled();
191197

192198
$iriConverterProphecy = $this->prophesize(IriConverterInterface::class);
193199

tests/Hal/Serializer/ItemNormalizerTest.php

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -112,15 +112,17 @@ public function testNormalize()
112112
$dummy->setName('hello');
113113
$dummy->setRelatedDummy($relatedDummy);
114114

115+
$defaultOptions = ['enable_getter_setter_extraction' => true];
116+
115117
$propertyNameCollection = new PropertyNameCollection(['name', 'relatedDummy']);
116118
$propertyNameCollectionFactoryProphecy = $this->prophesize(PropertyNameCollectionFactoryInterface::class);
117-
$propertyNameCollectionFactoryProphecy->create(Dummy::class, [])->willReturn($propertyNameCollection);
119+
$propertyNameCollectionFactoryProphecy->create(Dummy::class, $defaultOptions)->willReturn($propertyNameCollection);
118120

119121
$propertyMetadataFactoryProphecy = $this->prophesize(PropertyMetadataFactoryInterface::class);
120-
$propertyMetadataFactoryProphecy->create(Dummy::class, 'name', [])->willReturn(
122+
$propertyMetadataFactoryProphecy->create(Dummy::class, 'name', $defaultOptions)->willReturn(
121123
new PropertyMetadata(new Type(Type::BUILTIN_TYPE_STRING), '', true)
122124
);
123-
$propertyMetadataFactoryProphecy->create(Dummy::class, 'relatedDummy', [])->willReturn(
125+
$propertyMetadataFactoryProphecy->create(Dummy::class, 'relatedDummy', $defaultOptions)->willReturn(
124126
new PropertyMetadata(new Type(Type::BUILTIN_TYPE_OBJECT, false, RelatedDummy::class), '', true, false, false)
125127
);
126128

@@ -179,15 +181,17 @@ public function testNormalizeWithoutCache()
179181
$dummy->setName('hello');
180182
$dummy->setRelatedDummy($relatedDummy);
181183

184+
$defaultOptions = ['enable_getter_setter_extraction' => true];
185+
182186
$propertyNameCollection = new PropertyNameCollection(['name', 'relatedDummy']);
183187
$propertyNameCollectionFactoryProphecy = $this->prophesize(PropertyNameCollectionFactoryInterface::class);
184-
$propertyNameCollectionFactoryProphecy->create(Dummy::class, [])->willReturn($propertyNameCollection);
188+
$propertyNameCollectionFactoryProphecy->create(Dummy::class, $defaultOptions)->willReturn($propertyNameCollection);
185189

186190
$propertyMetadataFactoryProphecy = $this->prophesize(PropertyMetadataFactoryInterface::class);
187-
$propertyMetadataFactoryProphecy->create(Dummy::class, 'name', [])->willReturn(
191+
$propertyMetadataFactoryProphecy->create(Dummy::class, 'name', $defaultOptions)->willReturn(
188192
new PropertyMetadata(new Type(Type::BUILTIN_TYPE_STRING), '', true)
189193
);
190-
$propertyMetadataFactoryProphecy->create(Dummy::class, 'relatedDummy', [])->willReturn(
194+
$propertyMetadataFactoryProphecy->create(Dummy::class, 'relatedDummy', $defaultOptions)->willReturn(
191195
new PropertyMetadata(new Type(Type::BUILTIN_TYPE_OBJECT, false, RelatedDummy::class), '', true, false, false)
192196
);
193197

@@ -261,18 +265,20 @@ public function testMaxDepth()
261265
$level3->name = 'level 3';
262266
$level2->child = $level3;
263267

268+
$defaultOptions = ['enable_getter_setter_extraction' => true];
269+
264270
$propertyNameCollection = new PropertyNameCollection(['id', 'name', 'child']);
265271
$propertyNameCollectionFactoryProphecy = $this->prophesize(PropertyNameCollectionFactoryInterface::class);
266-
$propertyNameCollectionFactoryProphecy->create(MaxDepthDummy::class, [])->willReturn($propertyNameCollection);
272+
$propertyNameCollectionFactoryProphecy->create(MaxDepthDummy::class, $defaultOptions)->willReturn($propertyNameCollection);
267273

268274
$propertyMetadataFactoryProphecy = $this->prophesize(PropertyMetadataFactoryInterface::class);
269-
$propertyMetadataFactoryProphecy->create(MaxDepthDummy::class, 'id', [])->willReturn(
275+
$propertyMetadataFactoryProphecy->create(MaxDepthDummy::class, 'id', $defaultOptions)->willReturn(
270276
new PropertyMetadata(new Type(Type::BUILTIN_TYPE_INT), '', true)
271277
);
272-
$propertyMetadataFactoryProphecy->create(MaxDepthDummy::class, 'name', [])->willReturn(
278+
$propertyMetadataFactoryProphecy->create(MaxDepthDummy::class, 'name', $defaultOptions)->willReturn(
273279
new PropertyMetadata(new Type(Type::BUILTIN_TYPE_STRING), '', true)
274280
);
275-
$propertyMetadataFactoryProphecy->create(MaxDepthDummy::class, 'child', [])->willReturn(
281+
$propertyMetadataFactoryProphecy->create(MaxDepthDummy::class, 'child', $defaultOptions)->willReturn(
276282
new PropertyMetadata(new Type(Type::BUILTIN_TYPE_OBJECT, false, MaxDepthDummy::class), '', true, false, true)
277283
);
278284

0 commit comments

Comments
 (0)