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

api-platform / core / 10323369133

09 Aug 2024 05:39PM UTC coverage: 7.841%. Remained the same
10323369133

push

github

web-flow
Merge 3.4 (#6507)

* tests: remove output suffix after reverting

* cs: remove unnecessary comments (#6408)

* fix(elasticsearch): change normalize return type to compatible with other normalizers (#6493)

* style: various cs fixes (#6504)

* cs: fixes

* chore: phpstan fixes

* style: cs fixes

---------

Co-authored-by: Takashi Kanemoto <4360663+ttskch@users.noreply.github.com>
Co-authored-by: Koen Pasman <118996061+Koenstell@users.noreply.github.com>

0 of 2 new or added lines in 1 file covered. (0.0%)

21 existing lines in 7 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/Resource/Factory/AttributesResourceMetadataCollectionFactoryTest.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\Resource\Factory;
15

16
use ApiPlatform\Metadata\ApiResource;
17
use ApiPlatform\Metadata\Delete;
18
use ApiPlatform\Metadata\Get;
19
use ApiPlatform\Metadata\GetCollection;
20
use ApiPlatform\Metadata\GraphQl\DeleteMutation;
21
use ApiPlatform\Metadata\GraphQl\Mutation;
22
use ApiPlatform\Metadata\GraphQl\Query;
23
use ApiPlatform\Metadata\GraphQl\QueryCollection;
24
use ApiPlatform\Metadata\HttpOperation;
25
use ApiPlatform\Metadata\Patch;
26
use ApiPlatform\Metadata\Post;
27
use ApiPlatform\Metadata\Put;
28
use ApiPlatform\Metadata\Resource\Factory\AttributesResourceMetadataCollectionFactory;
29
use ApiPlatform\Metadata\Resource\ResourceMetadataCollection;
30
use ApiPlatform\Metadata\Tests\Fixtures\ApiResource\AttributeConfigOperations;
31
use ApiPlatform\Metadata\Tests\Fixtures\ApiResource\AttributeDefaultOperations;
32
use ApiPlatform\Metadata\Tests\Fixtures\ApiResource\AttributeOnlyOperation;
33
use ApiPlatform\Metadata\Tests\Fixtures\ApiResource\AttributeResource;
34
use ApiPlatform\Metadata\Tests\Fixtures\ApiResource\AttributeResources;
35
use ApiPlatform\Metadata\Tests\Fixtures\ApiResource\ExtraPropertiesResource;
36
use ApiPlatform\Metadata\Tests\Fixtures\ApiResource\PasswordResource;
37
use ApiPlatform\Metadata\Tests\Fixtures\ApiResource\WithParameter;
38
use ApiPlatform\Metadata\Tests\Fixtures\State\AttributeResourceProcessor;
39
use ApiPlatform\Metadata\Tests\Fixtures\State\AttributeResourceProvider;
40
use PHPUnit\Framework\TestCase;
41
use Prophecy\PhpUnit\ProphecyTrait;
42

43
/**
44
 * @author Antoine Bluchet <soyuka@gmail.com>
45
 */
46
class AttributesResourceMetadataCollectionFactoryTest extends TestCase
47
{
48
    use ProphecyTrait;
49

50
    private function getDefaultGraphqlOperations(string $shortName, string $class, mixed $provider = null): array
51
    {
52
        return [
×
53
            'collection_query' => new QueryCollection(shortName: $shortName, class: $class, normalizationContext: ['skip_null_values' => true], provider: $provider),
×
54
            'item_query' => new Query(shortName: $shortName, class: $class, normalizationContext: ['skip_null_values' => true], provider: $provider),
×
55
            'update' => new Mutation(shortName: $shortName, class: $class, normalizationContext: ['skip_null_values' => true], name: 'update', description: "Updates a $shortName.", provider: $provider),
×
56
            'delete' => new DeleteMutation(shortName: $shortName, class: $class, normalizationContext: ['skip_null_values' => true], name: 'delete', description: "Deletes a $shortName.", provider: $provider),
×
57
            'create' => new Mutation(shortName: $shortName, class: $class, normalizationContext: ['skip_null_values' => true], name: 'create', description: "Creates a $shortName.", provider: $provider),
×
58
        ];
×
59
    }
60

61
    public function testCreate(): void
62
    {
63
        $attributeResourceMetadataCollectionFactory = new AttributesResourceMetadataCollectionFactory(graphQlEnabled: true);
×
64

65
        $this->assertEquals(
×
66
            new ResourceMetadataCollection(AttributeResource::class, [
×
67
                new ApiResource(
×
68
                    shortName: 'AttributeResource',
×
69
                    normalizationContext: ['skip_null_values' => true],
×
70
                    class: AttributeResource::class,
×
71
                    provider: AttributeResourceProvider::class,
×
72
                    operations: [
×
73
                        '_api_AttributeResource_get' => new Get(
×
74
                            shortName: 'AttributeResource', class: AttributeResource::class, normalizationContext: ['skip_null_values' => true], priority: 1, provider: AttributeResourceProvider::class,
×
75
                        ),
×
76
                        '_api_AttributeResource_put' => new Put(
×
77
                            shortName: 'AttributeResource', class: AttributeResource::class, normalizationContext: ['skip_null_values' => true], priority: 2, provider: AttributeResourceProvider::class,
×
78
                        ),
×
79
                        '_api_AttributeResource_delete' => new Delete(
×
80
                            shortName: 'AttributeResource', class: AttributeResource::class, normalizationContext: ['skip_null_values' => true], priority: 3, provider: AttributeResourceProvider::class,
×
81
                        ),
×
82
                    ],
×
83
                    graphQlOperations: $this->getDefaultGraphqlOperations('AttributeResource', AttributeResource::class, AttributeResourceProvider::class)
×
84
                ),
×
85
                new ApiResource(
×
86
                    shortName: 'AttributeResource',
×
87
                    class: AttributeResource::class,
×
88
                    uriTemplate: '/dummy/{dummyId}/attribute_resources/{identifier}{._format}',
×
89
                    operations: [
×
90
                        '_api_/dummy/{dummyId}/attribute_resources/{identifier}{._format}_get' => new Get(
×
91
                            class: AttributeResource::class,
×
92
                            uriTemplate: '/dummy/{dummyId}/attribute_resources/{identifier}{._format}',
×
93
                            shortName: 'AttributeResource',
×
94
                            inputFormats: ['json' => ['application/merge-patch+json']],
×
95
                            priority: 4,
×
96
                            status: 301,
×
97
                            provider: AttributeResourceProvider::class,
×
UNCOV
98
                            processor: [AttributeResourceProcessor::class, 'process']
×
99
                        ),
×
100
                        '_api_/dummy/{dummyId}/attribute_resources/{identifier}{._format}_patch' => new Patch(
×
101
                            class: AttributeResource::class,
×
102
                            uriTemplate: '/dummy/{dummyId}/attribute_resources/{identifier}{._format}',
×
103
                            shortName: 'AttributeResource',
×
104
                            inputFormats: ['json' => ['application/merge-patch+json']],
×
105
                            priority: 5,
×
106
                            status: 301,
×
107
                            provider: AttributeResourceProvider::class,
×
UNCOV
108
                            processor: [AttributeResourceProcessor::class, 'process']
×
109
                        ),
×
110
                    ],
×
111
                    inputFormats: ['json' => ['application/merge-patch+json']],
×
112
                    status: 301,
×
113
                    provider: AttributeResourceProvider::class,
×
UNCOV
114
                    processor: [AttributeResourceProcessor::class, 'process']
×
115
                ),
×
116
            ]),
×
117
            $attributeResourceMetadataCollectionFactory->create(AttributeResource::class)
×
118
        );
×
119

120
        $this->assertEquals(
×
121
            new ResourceMetadataCollection(AttributeResources::class, [
×
122
                new ApiResource(
×
123
                    uriTemplate: '/attribute_resources{._format}',
×
124
                    shortName: 'AttributeResources',
×
125
                    normalizationContext: ['skip_null_values' => true],
×
126
                    class: AttributeResources::class,
×
127
                    provider: AttributeResourceProvider::class,
×
128
                    operations: [
×
129
                        '_api_/attribute_resources{._format}_get_collection' => new GetCollection(
×
130
                            shortName: 'AttributeResources', class: AttributeResources::class, uriTemplate: '/attribute_resources{._format}', normalizationContext: ['skip_null_values' => true], priority: 1, provider: AttributeResourceProvider::class,
×
131
                        ),
×
132
                        '_api_/attribute_resources{._format}_post' => new Post(
×
133
                            shortName: 'AttributeResources', class: AttributeResources::class, uriTemplate: '/attribute_resources{._format}', normalizationContext: ['skip_null_values' => true], priority: 2, provider: AttributeResourceProvider::class,
×
134
                        ),
×
135
                    ],
×
136
                    graphQlOperations: $this->getDefaultGraphqlOperations('AttributeResources', AttributeResources::class, AttributeResourceProvider::class)
×
137
                ),
×
138
            ]),
×
139
            $attributeResourceMetadataCollectionFactory->create(AttributeResources::class)
×
140
        );
×
141
    }
142

143
    public function testCreateWithDefaults(): void
144
    {
145
        $attributeResourceMetadataCollectionFactory = new AttributesResourceMetadataCollectionFactory(null, null, [
×
146
            'cache_headers' => [
×
147
                'max_age' => 60,
×
148
                'shared_max_age' => 120,
×
149
                'public' => true,
×
150
            ],
×
151
            'extra_properties' => ['standard_put' => true],
×
152
            'non_existing_attribute' => 'foo',
×
153
        ]);
×
154

155
        // Check the AttributeDefaultOperations it specifies a shared_max_age that should not be overridden
156
        $operation = new HttpOperation(shortName: 'AttributeDefaultOperations', class: AttributeDefaultOperations::class, cacheHeaders: ['max_age' => 60, 'shared_max_age' => 60, 'public' => true], paginationItemsPerPage: 10, extraProperties: ['non_existing_attribute' => 'foo', 'generated_operation' => true, 'standard_put' => true]);
×
157

158
        $this->assertEquals(new ResourceMetadataCollection(AttributeDefaultOperations::class, [
×
159
            new ApiResource(
×
160
                shortName: 'AttributeDefaultOperations',
×
161
                class: AttributeDefaultOperations::class,
×
162
                graphQlOperations: [],
×
163
                operations: [
×
164
                    '_api_AttributeDefaultOperations_get' => (new Get())->withOperation($operation),
×
165
                    '_api_AttributeDefaultOperations_get_collection' => (new GetCollection())->withOperation($operation),
×
166
                    '_api_AttributeDefaultOperations_post' => (new Post())->withOperation($operation),
×
167
                    '_api_AttributeDefaultOperations_put' => (new Put())->withOperation($operation),
×
168
                    '_api_AttributeDefaultOperations_patch' => (new Patch())->withOperation($operation),
×
169
                    '_api_AttributeDefaultOperations_delete' => (new Delete())->withOperation($operation),
×
170
                ],
×
171
                cacheHeaders: ['max_age' => 60, 'shared_max_age' => 60, 'public' => true],
×
172
                paginationItemsPerPage: 10,
×
173
                extraProperties: ['non_existing_attribute' => 'foo', 'standard_put' => true]
×
174
            ),
×
175
        ]), $attributeResourceMetadataCollectionFactory->create(AttributeDefaultOperations::class));
×
176
    }
177

178
    public function testCreateWithConfigOperations(): void
179
    {
180
        $attributesResourceMetadataCollectionFactory = new AttributesResourceMetadataCollectionFactory(defaults: ['operations' => [Get::class, Post::class]]);
×
181

182
        $this->assertEquals(new ResourceMetadataCollection(AttributeConfigOperations::class, [
×
183
            new ApiResource(
×
184
                shortName: 'AttributeConfigOperations',
×
185
                operations: [
×
186
                    '_api_AttributeConfigOperations_get' => new Get(shortName: 'AttributeConfigOperations', class: AttributeConfigOperations::class, priority: 0, extraProperties: ['generated_operation' => true]),
×
187
                    '_api_AttributeConfigOperations_post' => new Post(shortName: 'AttributeConfigOperations', class: AttributeConfigOperations::class, priority: 1, extraProperties: ['generated_operation' => true]),
×
188
                ],
×
189
                class: AttributeConfigOperations::class,
×
190
            ),
×
191
        ]), $attributesResourceMetadataCollectionFactory->create(AttributeConfigOperations::class));
×
192
    }
193

194
    public function testCreateShouldNotOverrideWithDefault(): void
195
    {
196
        $attributeResourceMetadataCollectionFactory = new AttributesResourceMetadataCollectionFactory(
×
197
            null, null, [
×
198
                'pagination_items_per_page' => 3,
×
199
            ]
×
200
        );
×
201

202
        $operation = new HttpOperation(shortName: 'AttributeDefaultOperations', class: AttributeDefaultOperations::class, paginationItemsPerPage: 10, cacheHeaders: ['shared_max_age' => 60], extraProperties: ['generated_operation' => true]);
×
203
        $this->assertEquals(new ResourceMetadataCollection(AttributeDefaultOperations::class, [
×
204
            new ApiResource(
×
205
                shortName: 'AttributeDefaultOperations',
×
206
                class: AttributeDefaultOperations::class,
×
207
                operations: [
×
208
                    '_api_AttributeDefaultOperations_get' => (new Get())->withOperation($operation),
×
209
                    '_api_AttributeDefaultOperations_get_collection' => (new GetCollection())->withOperation($operation),
×
210
                    '_api_AttributeDefaultOperations_post' => (new Post())->withOperation($operation),
×
211
                    '_api_AttributeDefaultOperations_put' => (new Put())->withOperation($operation),
×
212
                    '_api_AttributeDefaultOperations_patch' => (new Patch())->withOperation($operation),
×
213
                    '_api_AttributeDefaultOperations_delete' => (new Delete())->withOperation($operation),
×
214
                ],
×
215
                cacheHeaders: ['shared_max_age' => 60],
×
216
                graphQlOperations: [],
×
217
                paginationItemsPerPage: 10
×
218
            ),
×
219
        ]), $attributeResourceMetadataCollectionFactory->create(AttributeDefaultOperations::class));
×
220
    }
221

222
    public function testExtraProperties(): void
223
    {
224
        $attributeResourceMetadataCollectionFactory = new AttributesResourceMetadataCollectionFactory();
×
225
        $extraPropertiesResource = $attributeResourceMetadataCollectionFactory->create(ExtraPropertiesResource::class);
×
226

227
        $this->assertEquals($extraPropertiesResource[0]->getExtraProperties(), ['foo' => 'bar']);
×
228
        $this->assertEquals($extraPropertiesResource->getOperation('_api_ExtraPropertiesResource_get')->getExtraProperties(), ['foo' => 'bar']);
×
229
    }
230

231
    public function testOverrideNameWithoutOperations(): void
232
    {
233
        $attributeResourceMetadataCollectionFactory = new AttributesResourceMetadataCollectionFactory();
×
234

235
        $operation = new HttpOperation(shortName: 'AttributeOnlyOperation', class: AttributeOnlyOperation::class);
×
236
        $this->assertEquals(new ResourceMetadataCollection(AttributeOnlyOperation::class, [
×
237
            new ApiResource(
×
238
                shortName: 'AttributeOnlyOperation',
×
239
                class: AttributeOnlyOperation::class,
×
240
                operations: [
×
241
                    'my own name' => (new Get(name: 'my own name', priority: 1))->withOperation($operation),
×
242
                ]
×
243
            ),
×
244
        ]), $attributeResourceMetadataCollectionFactory->create(AttributeOnlyOperation::class));
×
245
    }
246

247
    /**
248
     * Tests issue #5235.
249
     */
250
    public function testNameDeclarationShouldNotBeRemoved(): void
251
    {
252
        $attributeResourceMetadataCollectionFactory = new AttributesResourceMetadataCollectionFactory();
×
253

254
        $metadataCollection = $attributeResourceMetadataCollectionFactory->create(PasswordResource::class);
×
255
        $operations = $metadataCollection[0]->getOperations();
×
256
        $this->assertTrue($operations->has('password_set'));
×
257
        $this->assertTrue($operations->has('password_reset_token'));
×
258
        $this->assertTrue($operations->has('password_reset'));
×
259
    }
260

261
    public function testWithParameters(): void
262
    {
263
        $attributeResourceMetadataCollectionFactory = new AttributesResourceMetadataCollectionFactory();
×
264

265
        $metadataCollection = $attributeResourceMetadataCollectionFactory->create(WithParameter::class);
×
266
        $parameters = $metadataCollection[0]->getParameters();
×
267
        $this->assertCount(2, $parameters);
×
268
        $parameters = $metadataCollection->getOperation('collection')->getParameters();
×
269
        $this->assertCount(3, $parameters);
×
270
    }
271
}
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