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

api-platform / core / 10315659289

09 Aug 2024 07:49AM UTC coverage: 7.841% (-0.006%) from 7.847%
10315659289

push

github

soyuka
style: cs fixes

70 of 529 new or added lines in 176 files covered. (13.23%)

160 existing lines in 58 files now uncovered.

12688 of 161818 relevant lines covered (7.84%)

26.86 hits per line

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

0.0
/src/Metadata/Tests/Extractor/Adapter/XmlResourceAdapter.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\Metadata\Tests\Extractor\Adapter;
15

16
use ApiPlatform\Metadata\Tests\Extractor\ResourceMetadataCompatibilityTest;
17

18
/**
19
 * XML adapter for ResourceMetadataCompatibilityTest.
20
 *
21
 * @author Vincent Chalamon <vincentchalamon@gmail.com>
22
 */
23
final class XmlResourceAdapter implements ResourceAdapterInterface
24
{
25
    private const ATTRIBUTES = [
26
        'uriTemplate',
27
        'shortName',
28
        'description',
29
        'routePrefix',
30
        'stateless',
31
        'sunset',
32
        'class',
33
        'acceptPatch',
34
        'status',
35
        'host',
36
        'condition',
37
        'controller',
38
        'urlGenerationStrategy',
39
        'deprecationReason',
40
        'elasticsearch',
41
        'messenger',
42
        'input',
43
        'output',
44
        'fetchPartial',
45
        'forceEager',
46
        'paginationClientEnabled',
47
        'paginationClientItemsPerPage',
48
        'paginationClientPartial',
49
        'paginationEnabled',
50
        'paginationFetchJoinCollection',
51
        'paginationUseOutputWalkers',
52
        'paginationItemsPerPage',
53
        'paginationMaximumItemsPerPage',
54
        'paginationPartial',
55
        'paginationType',
56
        'processor',
57
        'provider',
58
        'security',
59
        'securityMessage',
60
        'securityPostDenormalize',
61
        'securityPostDenormalizeMessage',
62
        'securityPostValidation',
63
        'securityPostValidationMessage',
64
        'queryParameterValidationEnabled',
65
        'stateOptions',
66
        'collectDenormalizationErrors',
67
        'links',
68
        'parameters',
69
    ];
70

71
    /**
72
     * {@inheritdoc}
73
     */
74
    public function __invoke(string $resourceClass, array $parameters, array $fixtures): array
75
    {
76
        $xml = new \SimpleXMLElement(<<<XML_WRAP
×
77
<?xml version="1.0" encoding="UTF-8" ?>
78
<resources xmlns="https://api-platform.com/schema/metadata/resources-3.0"
79
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
80
           xsi:schemaLocation="https://api-platform.com/schema/metadata/resources-3.0
81
           https://api-platform.com/schema/metadata/resources-3.0.xsd">
82
</resources>
83
XML_WRAP
×
84
        );
×
85

86
        foreach ($fixtures as $fixture) {
×
87
            $resource = $xml->addChild('resource');
×
88

89
            if (null === $fixture) {
×
90
                $resource->addAttribute('class', $resourceClass);
×
91
                continue;
×
92
            }
93

94
            $fixture['class'] = $resourceClass;
×
95
            foreach ($parameters as $parameter) {
×
96
                $parameterName = $parameter->getName();
×
97
                $value = \array_key_exists($parameterName, $fixture) ? $fixture[$parameterName] : null;
×
98

99
                if ('compositeIdentifier' === $parameterName || 'provider' === $parameterName || 'processor' === $parameterName) {
×
100
                    continue;
×
101
                }
102

103
                if (method_exists($this, 'build'.ucfirst($parameterName))) {
×
104
                    $this->{'build'.ucfirst($parameterName)}($resource, $value);
×
105
                    continue;
×
106
                }
107

108
                if (\in_array($parameterName, self::ATTRIBUTES, true) && \is_scalar($value)) {
×
109
                    $resource->addAttribute($parameterName, $this->parse($value));
×
110
                    continue;
×
111
                }
112

NEW
113
                throw new \LogicException(\sprintf('Cannot adapt attribute or child "%s". Please add fixtures in '.ResourceMetadataCompatibilityTest::class.' and create a "%s" method in %s.', $parameterName, 'build'.ucfirst($parameterName), self::class));
×
114
            }
115
        }
116

117
        $filename = __DIR__.'/resources.xml';
×
118
        $xml->asXML($filename);
×
119

120
        return [$filename];
×
121
    }
122

123
    private function buildTypes(\SimpleXMLElement $resource, array $values): void
124
    {
125
        $node = $resource->addChild('types');
×
126
        foreach ($values as $value) {
×
127
            $node->addChild('type', $value);
×
128
        }
129
    }
130

131
    private function buildInputFormats(\SimpleXMLElement $resource, array $values): void
132
    {
133
        $this->buildFormats($resource, $values, 'inputFormats');
×
134
    }
135

136
    private function buildOutputFormats(\SimpleXMLElement $resource, array $values): void
137
    {
138
        $this->buildFormats($resource, $values, 'outputFormats');
×
139
    }
140

141
    private function buildUriVariables(\SimpleXMLElement $resource, array $values): void
142
    {
143
        $child = $resource->addChild('uriVariables');
×
144
        foreach ($values as $parameterName => $value) {
×
145
            $grandChild = $child->addChild('uriVariable');
×
146
            $grandChild->addAttribute('parameterName', $parameterName);
×
147
            if (!isset($value['fromClass'])) {
×
148
                $value['fromClass'] = $value[0];
×
149
                $value['fromProperty'] = $value[1];
×
150
                unset($value[0], $value[1]);
×
151
            }
152
            foreach ($value as $key => $data) {
×
153
                $grandChild->addAttribute($key, $this->parse($data));
×
154
            }
155
        }
156
    }
157

158
    private function buildDefaults(\SimpleXMLElement $resource, array $values): void
159
    {
160
        $this->buildValues($resource->addChild('defaults'), $values);
×
161
    }
162

163
    private function buildMercure(\SimpleXMLElement $resource, $values): void
164
    {
165
        $child = $resource->addChild('mercure');
×
166
        if (\is_array($values)) {
×
167
            foreach ($values as $key => $value) {
×
168
                if (\is_string($key)) {
×
169
                    $child->addAttribute($key, $this->parse($value));
×
170
                }
171
            }
172
        }
173
    }
174

175
    private function buildRequirements(\SimpleXMLElement $resource, array $values): void
176
    {
177
        $node = $resource->addChild('requirements');
×
178
        foreach ($values as $key => $value) {
×
179
            $node->addChild('requirement', $value)->addAttribute('property', $key);
×
180
        }
181
    }
182

183
    private function buildOptions(\SimpleXMLElement $resource, array $values): void
184
    {
185
        $this->buildValues($resource->addChild('options'), $values);
×
186
    }
187

188
    private function buildSchemes(\SimpleXMLElement $resource, array $values): void
189
    {
190
        $node = $resource->addChild('schemes');
×
191
        foreach ($values as $value) {
×
192
            $node->addChild('scheme', $value);
×
193
        }
194
    }
195

196
    private function buildCacheHeaders(\SimpleXMLElement $resource, array $values): void
197
    {
198
        $node = $resource->addChild('cacheHeaders');
×
199
        foreach ($values as $key => $value) {
×
200
            if (\is_array($value)) {
×
201
                $child = $node->addChild('cacheHeader');
×
202
                $this->buildValues($child, $value);
×
203
            } else {
204
                $child = $node->addChild('cacheHeader', $this->parse($value));
×
205
            }
206
            $child->addAttribute('name', $key);
×
207
        }
208
    }
209

210
    private function buildNormalizationContext(\SimpleXMLElement $resource, array $values): void
211
    {
212
        $this->buildValues($resource->addChild('normalizationContext'), $values);
×
213
    }
214

215
    private function buildDenormalizationContext(\SimpleXMLElement $resource, array $values): void
216
    {
217
        $this->buildValues($resource->addChild('denormalizationContext'), $values);
×
218
    }
219

220
    private function buildHydraContext(\SimpleXMLElement $resource, array $values): void
221
    {
222
        $this->buildValues($resource->addChild('hydraContext'), $values);
×
223
    }
224

225
    private function buildOpenapi(\SimpleXMLElement $resource, array $values): void
226
    {
227
        $node = $resource->openapi ?? $resource->addChild('openapi');
×
228

229
        if (isset($values['tags'])) {
×
230
            $tagsNode = $node->tags ?? $node->addChild('tags');
×
231
            foreach ($values['tags'] as $tag) {
×
232
                $tagsNode->addChild('tag', $tag);
×
233
            }
234
        }
235

236
        if (isset($values['responses'])) {
×
237
            $responsesNode = $node->responses ?? $node->addChild('responses');
×
238
            foreach ($values['responses'] as $status => $response) {
×
239
                $responseNode = $responsesNode->addChild('response');
×
240
                $responseNode->addAttribute('status', $status);
×
241
                if (isset($response['description'])) {
×
242
                    $responseNode->addAttribute('description', $response['description']);
×
243
                }
244
                if (isset($response['content'])) {
×
245
                    $this->buildValues($responseNode->addChild('content'), $response['content']);
×
246
                }
247
                if (isset($response['headers'])) {
×
248
                    $this->buildValues($responseNode->addChild('headers'), $response['headers']);
×
249
                }
250
                if (isset($response['links'])) {
×
251
                    $this->buildValues($responseNode->addChild('links'), $response['links']);
×
252
                }
253
            }
254
        }
255

256
        if (isset($values['externalDocs'])) {
×
257
            $externalDocsNode = $node->externalDocs ?? $node->addChild('externalDocs');
×
258
            if (isset($values['externalDocs']['description'])) {
×
259
                $externalDocsNode->addAttribute('description', $values['externalDocs']['description']);
×
260
            }
261
            if (isset($values['url']['description'])) {
×
262
                $externalDocsNode->addAttribute('url', $values['externalDocs']['url']);
×
263
            }
264
        }
265

266
        if (isset($values['parameters'])) {
×
267
            $parametersNode = $node->parameters ?? $node->addChild('parameters');
×
268
            foreach ($values['parameters'] as $name => $parameter) {
×
269
                $parameterNode = $parametersNode->addChild('parameter');
×
270
                $parameterNode->addAttribute('name', $name);
×
271
                if (isset($parameter['in'])) {
×
272
                    $parameterNode->addAttribute('in', $parameter['in']);
×
273
                }
274
                if (isset($parameter['description'])) {
×
275
                    $parameterNode->addAttribute('description', $parameter['description']);
×
276
                }
277
                if (isset($parameter['required'])) {
×
278
                    $parameterNode->addAttribute('required', $parameter['required']);
×
279
                }
280
                if (isset($parameter['deprecated'])) {
×
281
                    $parameterNode->addAttribute('deprecated', $parameter['deprecated']);
×
282
                }
283
                if (isset($parameter['allowEmptyValue'])) {
×
284
                    $parameterNode->addAttribute('allowEmptyValue', $parameter['allowEmptyValue']);
×
285
                }
286
                if (isset($parameter['style'])) {
×
287
                    $parameterNode->addAttribute('style', $parameter['style']);
×
288
                }
289
                if (isset($parameter['explode'])) {
×
290
                    $parameterNode->addAttribute('explode', $parameter['explode']);
×
291
                }
292
                if (isset($parameter['allowReserved'])) {
×
293
                    $parameterNode->addAttribute('allowReserved', $parameter['allowReserved']);
×
294
                }
295
                if (isset($parameter['example'])) {
×
296
                    $parameterNode->addAttribute('example', $parameter['example']);
×
297
                }
298
                if (isset($parameter['schema'])) {
×
299
                    $this->buildValues($parameterNode->addChild('schema'), $parameter['schema']);
×
300
                }
301
                if (isset($parameter['examples'])) {
×
302
                    $this->buildValues($parameterNode->addChild('examples'), $parameter['examples']);
×
303
                }
304
                if (isset($parameter['content'])) {
×
305
                    $this->buildValues($parameterNode->addChild('content'), $parameter['content']);
×
306
                }
307
            }
308
        }
309

310
        if (isset($values['requestBody'])) {
×
311
            $requestBodyNode = $node->requestBody ?? $node->addChild('requestBody');
×
312
            if (isset($values['requestBody']['content'])) {
×
313
                $this->buildValues($requestBodyNode->addChild('content'), $values['requestBody']['content']);
×
314
            }
315
            if (isset($values['requestBody']['description'])) {
×
316
                $requestBodyNode->addAttribute('description', $values['requestBody']['description']);
×
317
            }
318
            if (isset($values['requestBody']['required'])) {
×
319
                $requestBodyNode->addAttribute('required', $values['requestBody']['required']);
×
320
            }
321
        }
322

323
        if (isset($values['callbacks'])) {
×
324
            $this->buildValues($node->callbacks ?? $node->addChild('callbacks'), $values['callbacks']);
×
325
        }
326

327
        if (isset($values['security'])) {
×
328
            $this->buildValues($node->security ?? $node->addChild('security'), $values['security']);
×
329
        }
330

331
        if (isset($values['servers'])) {
×
332
            $serversNode = $node->servers ?? $node->addChild('servers');
×
333
            foreach ($values['servers'] as $server) {
×
334
                $serverNode = $serversNode->addChild('serverNode');
×
335
                if (isset($server['url'])) {
×
336
                    $serverNode->addAttribute('url', $server['url']);
×
337
                }
338
                if (isset($server['description'])) {
×
339
                    $serverNode->addAttribute('description', $server['description']);
×
340
                }
341
                if (isset($server['variables'])) {
×
342
                    $this->buildValues($serverNode->addChild('variables'), $server['variables']);
×
343
                }
344
            }
345
        }
346

347
        if (isset($values['extensionProperties'])) {
×
348
            $this->buildValues($node->extensionProperties ?? $node->addChild('extensionProperties'), $values['extensionProperties']);
×
349
        }
350
    }
351

352
    private function buildValidationContext(\SimpleXMLElement $resource, array $values): void
353
    {
354
        $this->buildValues($resource->addChild('validationContext'), $values);
×
355
    }
356

357
    private function buildFilters(\SimpleXMLElement $resource, array $values): void
358
    {
359
        $node = $resource->addChild('filters');
×
360
        foreach ($values as $value) {
×
361
            $node->addChild('filter', $value);
×
362
        }
363
    }
364

365
    private function buildOrder(\SimpleXMLElement $resource, array $values): void
366
    {
367
        $this->buildValues($resource->addChild('order'), $values);
×
368
    }
369

370
    private function buildPaginationViaCursor(\SimpleXMLElement $resource, array $values): void
371
    {
372
        $node = $resource->addChild('paginationViaCursor');
×
373
        foreach ($values as $key => $value) {
×
374
            $child = $node->addChild('paginationField');
×
375
            $child->addAttribute('field', $key);
×
376
            $child->addAttribute('direction', $value);
×
377
        }
378
    }
379

380
    private function buildExceptionToStatus(\SimpleXMLElement $resource, array $values): void
381
    {
382
        $node = $resource->addChild('exceptionToStatus');
×
383
        foreach ($values as $key => $value) {
×
384
            $child = $node->addChild('exception');
×
385
            $child->addAttribute('class', $key);
×
386
            $child->addAttribute('statusCode', $this->parse($value));
×
387
        }
388
    }
389

390
    private function buildExtraProperties(\SimpleXMLElement $resource, array $values): void
391
    {
392
        $this->buildValues($resource->addChild('extraProperties'), $values);
×
393
    }
394

395
    private function buildArgs(\SimpleXMLElement $resource, array $args): void
396
    {
397
        $child = $resource->addChild('args');
×
398
        foreach ($args as $id => $values) {
×
399
            $grandChild = $child->addChild('arg');
×
400
            $grandChild->addAttribute('id', $id);
×
401
            $this->buildValues($grandChild, $values);
×
402
        }
403
    }
404

405
    private function buildExtraArgs(\SimpleXMLElement $resource, array $args): void
406
    {
407
        $child = $resource->addChild('extraArgs');
×
408
        foreach ($args as $id => $values) {
×
409
            $grandChild = $child->addChild('arg');
×
410
            $grandChild->addAttribute('id', $id);
×
411
            $this->buildValues($grandChild, $values);
×
412
        }
413
    }
414

415
    private function buildGraphQlOperations(\SimpleXMLElement $resource, array $values): void
416
    {
417
        $node = $resource->addChild('graphQlOperations');
×
418
        foreach ($values as $value) {
×
419
            $child = $node->addChild('graphQlOperation');
×
420
            foreach ($value as $index => $data) {
×
421
                if (method_exists($this, 'build'.ucfirst($index))) {
×
422
                    $this->{'build'.ucfirst($index)}($child, $data);
×
423
                    continue;
×
424
                }
425

426
                if (\is_string($data) || null === $data || is_numeric($data) || \is_bool($data)) {
×
427
                    $child->addAttribute($index, $this->parse($data));
×
428
                    continue;
×
429
                }
430

NEW
431
                throw new \LogicException(\sprintf('Cannot adapt graphQlOperation attribute or child "%s". Please create a "%s" method in %s.', $index, 'build'.ucfirst($index), self::class));
×
432
            }
433
        }
434
    }
435

436
    private function buildOperations(\SimpleXMLElement $resource, array $values): void
437
    {
438
        $node = $resource->addChild('operations');
×
439
        foreach ($values as $value) {
×
440
            $child = $node->addChild('operation');
×
441
            foreach ($value as $index => $data) {
×
442
                if (method_exists($this, 'build'.ucfirst($index))) {
×
443
                    $this->{'build'.ucfirst($index)}($child, $data);
×
444
                    continue;
×
445
                }
446

447
                if (\is_string($data) || null === $data || is_numeric($data) || \is_bool($data)) {
×
448
                    $child->addAttribute($index, $this->parse($data));
×
449
                    continue;
×
450
                }
451

NEW
452
                throw new \LogicException(\sprintf('Cannot adapt operation attribute or child "%s". Please create a "%s" method in %s.', $index, 'build'.ucfirst($index), self::class));
×
453
            }
454
        }
455
    }
456

457
    private function buildFormats(\SimpleXMLElement $resource, array $values, string $name = 'formats'): void
458
    {
459
        $node = $resource->addChild($name);
×
460
        foreach ($values as $key => $value) {
×
461
            $node->addChild('format', $value)->addAttribute('name', $key);
×
462
        }
463
    }
464

465
    private function buildStateOptions(\SimpleXMLElement $resource, array $values): void
466
    {
467
        $node = $resource->addChild('stateOptions');
×
468
        $childNode = $node->addChild(array_key_first($values));
×
469
        $childNode->addAttribute('index', $values[array_key_first($values)]['index']);
×
470
        $childNode->addAttribute('type', $values[array_key_first($values)]['type']);
×
471
    }
472

473
    private function buildValues(\SimpleXMLElement $resource, array $values): void
474
    {
475
        $node = $resource->addChild('values');
×
476
        foreach ($values as $key => $value) {
×
477
            if (\is_array($value)) {
×
478
                $child = $node->addChild('value');
×
479
                $this->buildValues($child, $value);
×
480
            } else {
481
                $child = $node->addChild('value', $value);
×
482
            }
483
            if (\is_string($key)) {
×
484
                $child->addAttribute('name', $key);
×
485
            }
486
        }
487
    }
488

489
    private function buildLinks(\SimpleXMLElement $resource, ?array $values = null): void
490
    {
491
        if (!$values) {
×
492
            return;
×
493
        }
494

495
        $node = $resource->addChild('links');
×
496
        $childNode = $node->addChild('link');
×
497
        $childNode->addAttribute('rel', $values[0]['rel']);
×
498
        $childNode->addAttribute('href', $values[0]['href']);
×
499
    }
500

501
    private function buildRules(\SimpleXMLElement $resource, ?array $values = null): void
502
    {
503
    }
×
504

505
    private function buildHeaders(\SimpleXMLElement $resource, ?array $values = null): void
506
    {
507
        if (!$values) {
×
508
            return;
×
509
        }
510

511
        $node = $resource->addChild('headers');
×
512
        foreach ($values as $key => $value) {
×
513
            $childNode = $node->addChild('header');
×
514
            $childNode->addAttribute('key', $key);
×
515
            $childNode->addAttribute('value', $value);
×
516
        }
517
    }
518

519
    private function buildParameters(\SimpleXMLElement $resource, ?array $values = null): void
520
    {
521
        if (!$values) {
×
522
            return;
×
523
        }
524

525
        $node = $resource->addChild('parameters');
×
526
        foreach ($values as $key => $value) {
×
527
            $childNode = $node->addChild('parameter');
×
528
            $childNode->addAttribute('in', 'query');
×
529
            $childNode->addAttribute('key', $key);
×
530
            $childNode->addAttribute('required', $this->parse($value['required']));
×
531
            $this->buildValues($childNode->addChild('schema'), $value['schema']);
×
532
        }
533
    }
534

535
    private function parse($value): ?string
536
    {
537
        if (null === $value) {
×
538
            return null;
×
539
        }
540

541
        return \is_bool($value) ? (true === $value ? 'true' : 'false') : (string) $value;
×
542
    }
543
}
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

© 2025 Coveralls, Inc