19
19
use ApiPlatform \Core \Tests \Fixtures \TestBundle \Serializer \NameConverter \CustomConverter ;
20
20
use GraphQL \Type \Definition \ResolveInfo ;
21
21
use PHPUnit \Framework \TestCase ;
22
+ use Prophecy \Argument ;
23
+ use Symfony \Component \Serializer \NameConverter \AdvancedNameConverterInterface ;
22
24
23
25
/**
24
26
* @author Alan Poulain <contact@alanpoulain.eu>
@@ -36,16 +38,18 @@ protected function setUp(): void
36
38
{
37
39
$ this ->resourceMetadataFactoryProphecy = $ this ->prophesize (ResourceMetadataFactoryInterface::class);
38
40
39
- $ this ->serializerContextBuilder = new SerializerContextBuilder (
40
- $ this ->resourceMetadataFactoryProphecy ->reveal (),
41
- new CustomConverter ()
42
- );
41
+ $ this ->serializerContextBuilder = $ this ->buildSerializerContextBuilder ();
42
+ }
43
+
44
+ private function buildSerializerContextBuilder (?AdvancedNameConverterInterface $ advancedNameConverter = null ): SerializerContextBuilder
45
+ {
46
+ return new SerializerContextBuilder ($ this ->resourceMetadataFactoryProphecy ->reveal (), $ advancedNameConverter ?? new CustomConverter ());
43
47
}
44
48
45
49
/**
46
50
* @dataProvider createNormalizationContextProvider
47
51
*/
48
- public function testCreateNormalizationContext (?string $ resourceClass , string $ operationName , array $ fields , bool $ isMutation , bool $ isSubscription , bool $ noInfo , array $ expectedContext , ?string $ expectedExceptionClass = null , ?string $ expectedExceptionMessage = null ): void
52
+ public function testCreateNormalizationContext (?string $ resourceClass , string $ operationName , array $ fields , bool $ isMutation , bool $ isSubscription , bool $ noInfo , array $ expectedContext , ?AdvancedNameConverterInterface $ advancedNameConverter = null , ? string $ expectedExceptionClass = null , ?string $ expectedExceptionMessage = null ): void
49
53
{
50
54
$ resolverContext = [
51
55
'is_mutation ' => $ isMutation ,
@@ -76,13 +80,21 @@ public function testCreateNormalizationContext(?string $resourceClass, string $o
76
80
$ this ->expectExceptionMessage ($ expectedExceptionMessage );
77
81
}
78
82
79
- $ context = $ this ->serializerContextBuilder ->create ($ resourceClass , $ operationName , $ resolverContext , true );
83
+ $ serializerContextBuilder = $ this ->serializerContextBuilder ;
84
+ if ($ advancedNameConverter ) {
85
+ $ serializerContextBuilder = $ this ->buildSerializerContextBuilder ($ advancedNameConverter );
86
+ }
87
+
88
+ $ context = $ serializerContextBuilder ->create ($ resourceClass , $ operationName , $ resolverContext , true );
80
89
81
90
$ this ->assertSame ($ expectedContext , $ context );
82
91
}
83
92
84
93
public function createNormalizationContextProvider (): array
85
94
{
95
+ $ advancedNameConverter = $ this ->prophesize (AdvancedNameConverterInterface::class);
96
+ $ advancedNameConverter ->denormalize ('field ' , 'myResource ' , null , Argument::type ('array ' ))->willReturn ('denormalizedField ' );
97
+
86
98
return [
87
99
'nominal ' => [
88
100
$ resourceClass = 'myResource ' ,
@@ -95,13 +107,33 @@ public function createNormalizationContextProvider(): array
95
107
'groups ' => ['normalization_group ' ],
96
108
'resource_class ' => $ resourceClass ,
97
109
'graphql_operation_name ' => $ operationName ,
110
+ 'input ' => ['class ' => 'inputClass ' ],
111
+ 'output ' => ['class ' => 'outputClass ' ],
98
112
'attributes ' => [
99
113
'id ' => 3 ,
100
114
'field ' => 'foo ' ,
101
115
],
116
+ ],
117
+ ],
118
+ 'nominal with advanced name converter ' => [
119
+ $ resourceClass = 'myResource ' ,
120
+ $ operationName = 'item_query ' ,
121
+ ['_id ' => 3 , 'field ' => 'foo ' ],
122
+ false ,
123
+ false ,
124
+ false ,
125
+ [
126
+ 'groups ' => ['normalization_group ' ],
127
+ 'resource_class ' => $ resourceClass ,
128
+ 'graphql_operation_name ' => $ operationName ,
102
129
'input ' => ['class ' => 'inputClass ' ],
103
130
'output ' => ['class ' => 'outputClass ' ],
131
+ 'attributes ' => [
132
+ 'id ' => 3 ,
133
+ 'denormalizedField ' => 'foo ' ,
134
+ ],
104
135
],
136
+ $ advancedNameConverter ->reveal (),
105
137
],
106
138
'nominal collection ' => [
107
139
$ resourceClass = 'myResource ' ,
@@ -114,11 +146,11 @@ public function createNormalizationContextProvider(): array
114
146
'groups ' => ['normalization_group ' ],
115
147
'resource_class ' => $ resourceClass ,
116
148
'graphql_operation_name ' => $ operationName ,
149
+ 'input ' => ['class ' => 'inputClass ' ],
150
+ 'output ' => ['class ' => 'outputClass ' ],
117
151
'attributes ' => [
118
152
'nodeField ' => 'baz ' ,
119
153
],
120
- 'input ' => ['class ' => 'inputClass ' ],
121
- 'output ' => ['class ' => 'outputClass ' ],
122
154
],
123
155
],
124
156
'no resource class ' => [
@@ -147,12 +179,12 @@ public function createNormalizationContextProvider(): array
147
179
'groups ' => ['normalization_group ' ],
148
180
'resource_class ' => $ resourceClass ,
149
181
'graphql_operation_name ' => $ operationName ,
182
+ 'input ' => ['class ' => 'inputClass ' ],
183
+ 'output ' => ['class ' => 'outputClass ' ],
150
184
'attributes ' => [
151
185
'id ' => 7 ,
152
186
'related ' => ['field ' => 'bar ' ],
153
187
],
154
- 'input ' => ['class ' => 'inputClass ' ],
155
- 'output ' => ['class ' => 'outputClass ' ],
156
188
],
157
189
],
158
190
'mutation without resource class ' => [
@@ -163,6 +195,7 @@ public function createNormalizationContextProvider(): array
163
195
false ,
164
196
false ,
165
197
[],
198
+ null ,
166
199
\LogicException::class,
167
200
'ResourceMetadata should always exist for a mutation or a subscription. ' ,
168
201
],
@@ -177,13 +210,13 @@ public function createNormalizationContextProvider(): array
177
210
'groups ' => ['normalization_group ' ],
178
211
'resource_class ' => $ resourceClass ,
179
212
'graphql_operation_name ' => $ operationName ,
213
+ 'no_resolver_data ' => true ,
214
+ 'input ' => ['class ' => 'inputClass ' ],
215
+ 'output ' => ['class ' => 'outputClass ' ],
180
216
'attributes ' => [
181
217
'id ' => 7 ,
182
218
'related ' => ['field ' => 'bar ' ],
183
219
],
184
- 'no_resolver_data ' => true ,
185
- 'input ' => ['class ' => 'inputClass ' ],
186
- 'output ' => ['class ' => 'outputClass ' ],
187
220
],
188
221
],
189
222
];
0 commit comments