• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

api-platform / core / 6067528200

04 Sep 2023 12:12AM UTC coverage: 36.875% (-21.9%) from 58.794%
6067528200

Pull #5791

github

web-flow
Merge 64157e578 into d09cfc9d2
Pull Request #5791: fix: strip down any sql function name

3096 of 3096 new or added lines in 205 files covered. (100.0%)

9926 of 26918 relevant lines covered (36.87%)

6.5 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/GraphQl/Tests/Serializer/SerializerContextBuilderTest.php
1
<?php
2

3
/*
4
 * This file is part of the API Platform project.
5
 *
6
 * (c) Kévin Dunglas <dunglas@gmail.com>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11

12
declare(strict_types=1);
13

14
namespace ApiPlatform\GraphQl\Tests\Serializer;
15

16
use ApiPlatform\GraphQl\Serializer\SerializerContextBuilder;
17
use ApiPlatform\GraphQl\Tests\Fixtures\Serializer\NameConverter\CustomConverter;
18
use ApiPlatform\Metadata\GraphQl\Mutation;
19
use ApiPlatform\Metadata\GraphQl\Operation;
20
use ApiPlatform\Metadata\GraphQl\Query;
21
use ApiPlatform\Metadata\GraphQl\Subscription;
22
use GraphQL\Type\Definition\ResolveInfo;
23
use PHPUnit\Framework\TestCase;
24
use Prophecy\Argument;
25
use Prophecy\PhpUnit\ProphecyTrait;
26
use Symfony\Component\Serializer\NameConverter\AdvancedNameConverterInterface;
27

28
/**
29
 * @author Alan Poulain <contact@alanpoulain.eu>
30
 */
31
class SerializerContextBuilderTest extends TestCase
32
{
33
    use ProphecyTrait;
34

35
    private SerializerContextBuilder $serializerContextBuilder;
36

37
    /**
38
     * {@inheritdoc}
39
     */
40
    protected function setUp(): void
41
    {
42
        $this->serializerContextBuilder = $this->buildSerializerContextBuilder();
×
43
    }
44

45
    private function buildSerializerContextBuilder(AdvancedNameConverterInterface $advancedNameConverter = null): SerializerContextBuilder
46
    {
47
        return new SerializerContextBuilder($advancedNameConverter ?? new CustomConverter());
×
48
    }
49

50
    private function buildOperationFromContext(bool $isMutation, bool $isSubscription, array $expectedContext, bool $isNormalization = true, string $resourceClass = null): Operation
51
    {
52
        $operation = !$isMutation && !$isSubscription ? new Query() : new Mutation();
×
53
        if ($isSubscription) {
×
54
            $operation = new Subscription();
×
55
        }
56

57
        $operation = $operation->withShortName('shortName');
×
58
        if (isset($expectedContext['operation_name'])) {
×
59
            $operation = $operation->withName($expectedContext['operation_name']);
×
60
        }
61

62
        if ($resourceClass) {
×
63
            if (isset($expectedContext['groups'])) {
×
64
                if ($isNormalization) {
×
65
                    $operation = $operation->withNormalizationContext(['groups' => $expectedContext['groups']]);
×
66
                } else {
67
                    $operation = $operation->withDenormalizationContext(['groups' => $expectedContext['groups']]);
×
68
                }
69
            }
70

71
            if (isset($expectedContext['input'])) {
×
72
                $operation = $operation->withInput($expectedContext['input']);
×
73
            }
74

75
            if (isset($expectedContext['input'])) {
×
76
                $operation = $operation->withOutput($expectedContext['output']);
×
77
            }
78
        }
79

80
        \assert($operation instanceof Operation);
81

82
        return $operation;
×
83
    }
84

85
    /**
86
     * @dataProvider createNormalizationContextProvider
87
     */
88
    public function testCreateNormalizationContext(?string $resourceClass, string $operationName, array $fields, bool $isMutation, bool $isSubscription, bool $noInfo, array $expectedContext, callable $advancedNameConverter = null, string $expectedExceptionClass = null, string $expectedExceptionMessage = null): void
89
    {
90
        $resolverContext = [];
×
91

92
        $operation = $this->buildOperationFromContext($isMutation, $isSubscription, $expectedContext, true, $resourceClass);
×
93
        if ($noInfo) {
×
94
            $resolverContext['fields'] = $fields;
×
95
        } else {
96
            $resolveInfoProphecy = $this->prophesize(ResolveInfo::class);
×
97
            $resolveInfoProphecy->getFieldSelection(\PHP_INT_MAX)->willReturn($fields);
×
98
            $resolverContext['info'] = $resolveInfoProphecy->reveal();
×
99
        }
100

101
        if ($expectedExceptionClass) {
×
102
            $this->expectException($expectedExceptionClass);
×
103
            $this->expectExceptionMessage($expectedExceptionMessage);
×
104
        }
105

106
        $serializerContextBuilder = $this->serializerContextBuilder;
×
107
        if ($advancedNameConverter) {
×
108
            $serializerContextBuilder = $this->buildSerializerContextBuilder($advancedNameConverter($this));
×
109
        }
110

111
        $context = $serializerContextBuilder->create($resourceClass, $operation, $resolverContext, true);
×
112

113
        unset($context['operation']);
×
114
        $this->assertEquals($expectedContext, $context);
×
115
    }
116

117
    public static function createNormalizationContextProvider(): iterable
118
    {
119
        $advancedNameConverterFactory = function (self $that): AdvancedNameConverterInterface {
×
120
            $advancedNameConverterProphecy = $that->prophesize(AdvancedNameConverterInterface::class);
×
121
            $advancedNameConverterProphecy->denormalize('field', 'myResource', null, Argument::type('array'))->willReturn('denormalizedField');
×
122

123
            return $advancedNameConverterProphecy->reveal();
×
124
        };
×
125

126
        yield 'nominal' => [
×
127
            $resourceClass = 'myResource',
×
128
            $operationName = 'item_query',
×
129
            ['_id' => 3, 'field' => 'foo'],
×
130
            false,
×
131
            false,
×
132
            false,
×
133
            [
×
134
                'groups' => ['normalization_group'],
×
135
                'resource_class' => $resourceClass,
×
136
                'operation_name' => $operationName,
×
137
                'graphql_operation_name' => $operationName,
×
138
                'input' => ['class' => 'inputClass'],
×
139
                'output' => ['class' => 'outputClass'],
×
140
                'attributes' => [
×
141
                    'id' => 3,
×
142
                    'field' => 'foo',
×
143
                ],
×
144
            ],
×
145
        ];
×
146
        yield 'nominal with advanced name converter' => [
×
147
            $resourceClass = 'myResource',
×
148
            $operationName = 'item_query',
×
149
            ['_id' => 3, 'field' => 'foo'],
×
150
            false,
×
151
            false,
×
152
            false,
×
153
            [
×
154
                'groups' => ['normalization_group'],
×
155
                'resource_class' => $resourceClass,
×
156
                'operation_name' => $operationName,
×
157
                'graphql_operation_name' => $operationName,
×
158
                'input' => ['class' => 'inputClass'],
×
159
                'output' => ['class' => 'outputClass'],
×
160
                'attributes' => [
×
161
                    'id' => 3,
×
162
                    'denormalizedField' => 'foo',
×
163
                ],
×
164
            ],
×
165
            $advancedNameConverterFactory,
×
166
        ];
×
167
        yield 'nominal collection' => [
×
168
            $resourceClass = 'myResource',
×
169
            $operationName = 'collection_query',
×
170
            ['edges' => ['node' => ['nodeField' => 'baz']]],
×
171
            false,
×
172
            false,
×
173
            false,
×
174
            [
×
175
                'groups' => ['normalization_group'],
×
176
                'resource_class' => $resourceClass,
×
177
                'operation_name' => $operationName,
×
178
                'graphql_operation_name' => $operationName,
×
179
                'input' => ['class' => 'inputClass'],
×
180
                'output' => ['class' => 'outputClass'],
×
181
                'attributes' => [
×
182
                    'nodeField' => 'baz',
×
183
                ],
×
184
            ],
×
185
        ];
×
186
        yield 'no resource class' => [
×
187
            $resourceClass = null,
×
188
            $operationName = 'item_query',
×
189
            ['related' => ['_id' => 9]],
×
190
            false,
×
191
            false,
×
192
            false,
×
193
            [
×
194
                'resource_class' => $resourceClass,
×
195
                'operation_name' => $operationName,
×
196
                'graphql_operation_name' => $operationName,
×
197
                'attributes' => [
×
198
                    'related' => ['id' => 9],
×
199
                ],
×
200
            ],
×
201
        ];
×
202
        yield 'mutation' => [
×
203
            $resourceClass = 'myResource',
×
204
            $operationName = 'create',
×
205
            ['shortName' => ['_id' => 7, 'related' => ['field' => 'bar']]],
×
206
            true,
×
207
            false,
×
208
            false,
×
209
            [
×
210
                'groups' => ['normalization_group'],
×
211
                'resource_class' => $resourceClass,
×
212
                'operation_name' => $operationName,
×
213
                'graphql_operation_name' => $operationName,
×
214
                'input' => ['class' => 'inputClass'],
×
215
                'output' => ['class' => 'outputClass'],
×
216
                'attributes' => [
×
217
                    'id' => 7,
×
218
                    'related' => ['field' => 'bar'],
×
219
                ],
×
220
            ],
×
221
        ];
×
222
        yield 'subscription (using fields in context)' => [
×
223
            $resourceClass = 'myResource',
×
224
            $operationName = 'update',
×
225
            ['shortName' => ['_id' => 7, 'related' => ['field' => 'bar']]],
×
226
            false,
×
227
            true,
×
228
            true,
×
229
            [
×
230
                'groups' => ['normalization_group'],
×
231
                'resource_class' => $resourceClass,
×
232
                'operation_name' => $operationName,
×
233
                'graphql_operation_name' => $operationName,
×
234
                'no_resolver_data' => true,
×
235
                'input' => ['class' => 'inputClass'],
×
236
                'output' => ['class' => 'outputClass'],
×
237
                'attributes' => [
×
238
                    'id' => 7,
×
239
                    'related' => ['field' => 'bar'],
×
240
                ],
×
241
            ],
×
242
        ];
×
243
    }
244

245
    /**
246
     * @dataProvider createDenormalizationContextProvider
247
     */
248
    public function testCreateDenormalizationContext(?string $resourceClass, string $operationName, array $expectedContext): void
249
    {
250
        $operation = $this->buildOperationFromContext(true, false, $expectedContext, false, $resourceClass);
×
251

252
        $context = $this->serializerContextBuilder->create($resourceClass, $operation, [], false);
×
253

254
        unset($context['operation']);
×
255
        $this->assertEquals($expectedContext, $context);
×
256
    }
257

258
    public static function createDenormalizationContextProvider(): array
259
    {
260
        return [
×
261
            'nominal' => [
×
262
                $resourceClass = 'myResource',
×
263
                $operationName = 'item_query',
×
264
                [
×
265
                    'groups' => ['denormalization_group'],
×
266
                    'resource_class' => $resourceClass,
×
267
                    'operation_name' => $operationName,
×
268
                    'graphql_operation_name' => $operationName,
×
269
                    'input' => ['class' => 'inputClass'],
×
270
                    'output' => ['class' => 'outputClass'],
×
271
                ],
×
272
            ],
×
273
            'no resource class' => [
×
274
                $resourceClass = null,
×
275
                $operationName = 'item_query',
×
276
                [
×
277
                    'resource_class' => $resourceClass,
×
278
                    'operation_name' => $operationName,
×
279
                    'graphql_operation_name' => $operationName,
×
280
                ],
×
281
            ],
×
282
        ];
×
283
    }
284
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc