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

api-platform / core / 5936124107

22 Aug 2023 08:06AM UTC coverage: 58.84% (-0.004%) from 58.844%
5936124107

push

github

web-flow
fix(metadata): notexposed no urivariables inheritance (#5765)

* fix(metadata): notexposed no urivariables inheritance

* use named arguments

Co-authored-by: Vincent <407859+vincentchalamon@users.noreply.github.com>

* fix tests

---------

Co-authored-by: Vincent <407859+vincentchalamon@users.noreply.github.com>

8 of 8 new or added lines in 3 files covered. (100.0%)

10856 of 18450 relevant lines covered (58.84%)

19.81 hits per line

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

0.0
/src/Metadata/Tests/Resource/Factory/NotExposedOperationResourceMetadataCollectionFactoryTest.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\Get;
18
use ApiPlatform\Metadata\GetCollection;
19
use ApiPlatform\Metadata\HttpOperation;
20
use ApiPlatform\Metadata\Link;
21
use ApiPlatform\Metadata\NotExposed;
22
use ApiPlatform\Metadata\Resource\Factory\LinkFactoryInterface;
23
use ApiPlatform\Metadata\Resource\Factory\NotExposedOperationResourceMetadataCollectionFactory;
24
use ApiPlatform\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface;
25
use ApiPlatform\Metadata\Resource\ResourceMetadataCollection;
26
use ApiPlatform\Metadata\Tests\Fixtures\ApiResource\AttributeResource;
27
use ApiPlatform\Metadata\Tests\Fixtures\Metadata\Get as CustomGet;
28
use PHPUnit\Framework\TestCase;
29
use Prophecy\Argument;
30
use Prophecy\PhpUnit\ProphecyTrait;
31

32
/**
33
 * @author Vincent Chalamon <vincentchalamon@gmail.com>
34
 */
35
class NotExposedOperationResourceMetadataCollectionFactoryTest extends TestCase
36
{
37
    use ProphecyTrait;
38

39
    public function testItIgnoresClassesWithoutResources(): void
40
    {
41
        $linkFactoryProphecy = $this->prophesize(LinkFactoryInterface::class);
×
42
        $linkFactoryProphecy->createLinksFromIdentifiers(Argument::type(HttpOperation::class))->shouldNotBeCalled();
×
43

44
        $resourceCollectionMetadataFactoryProphecy = $this->prophesize(ResourceMetadataCollectionFactoryInterface::class);
×
45
        $resourceCollectionMetadataFactoryProphecy->create(AttributeResource::class)->willReturn(
×
46
            new ResourceMetadataCollection(AttributeResource::class, []),
×
47
        );
×
48

49
        $factory = new NotExposedOperationResourceMetadataCollectionFactory($linkFactoryProphecy->reveal(), $resourceCollectionMetadataFactoryProphecy->reveal());
×
50
        $this->assertEquals(
×
51
            new ResourceMetadataCollection(AttributeResource::class, []),
×
52
            $factory->create(AttributeResource::class)
×
53
        );
×
54
    }
55

56
    public function testItIgnoresResourcesWithAnItemOperation(): void
57
    {
58
        $linkFactoryProphecy = $this->prophesize(LinkFactoryInterface::class);
×
59
        $linkFactoryProphecy->createLinksFromIdentifiers(Argument::type(HttpOperation::class))->shouldNotBeCalled();
×
60

61
        $resourceCollectionMetadataFactoryProphecy = $this->prophesize(ResourceMetadataCollectionFactoryInterface::class);
×
62
        $resourceCollectionMetadataFactoryProphecy->create(AttributeResource::class)->willReturn(
×
63
            new ResourceMetadataCollection(AttributeResource::class, [
×
64
                new ApiResource(
×
65
                    shortName: 'AttributeResource',
×
66
                    operations: [],
×
67
                    class: AttributeResource::class
×
68
                ),
×
69
                new ApiResource(
×
70
                    shortName: 'AttributeResource',
×
71
                    operations: [
×
72
                        '_api_AttributeResource_get_collection' => new GetCollection(controller: 'api_platform.action.placeholder', shortName: 'AttributeResource', class: AttributeResource::class),
×
73
                        '_api_AttributeResource_get' => new Get(uriVariables: ['id' => new Link(fromClass: AttributeResource::class, identifiers: ['id'])], controller: 'api_platform.action.placeholder', shortName: 'AttributeResource', class: AttributeResource::class),
×
74
                    ],
×
75
                    uriVariables: ['id' => new Link(fromClass: AttributeResource::class, identifiers: ['id'])],
×
76
                    class: AttributeResource::class
×
77
                ),
×
78
            ]),
×
79
        );
×
80

81
        $factory = new NotExposedOperationResourceMetadataCollectionFactory($linkFactoryProphecy->reveal(), $resourceCollectionMetadataFactoryProphecy->reveal());
×
82
        $this->assertEquals(
×
83
            new ResourceMetadataCollection(AttributeResource::class, [
×
84
                new ApiResource(
×
85
                    shortName: 'AttributeResource',
×
86
                    operations: [],
×
87
                    class: AttributeResource::class
×
88
                ),
×
89
                new ApiResource(
×
90
                    shortName: 'AttributeResource',
×
91
                    operations: [
×
92
                        '_api_AttributeResource_get_collection' => new GetCollection(controller: 'api_platform.action.placeholder', shortName: 'AttributeResource', class: AttributeResource::class),
×
93
                        '_api_AttributeResource_get' => new Get(uriVariables: ['id' => new Link(fromClass: AttributeResource::class, identifiers: ['id'])], controller: 'api_platform.action.placeholder', shortName: 'AttributeResource', class: AttributeResource::class),
×
94
                    ],
×
95
                    uriVariables: ['id' => new Link(fromClass: AttributeResource::class, identifiers: ['id'])],
×
96
                    class: AttributeResource::class
×
97
                ),
×
98
            ]),
×
99
            $factory->create(AttributeResource::class)
×
100
        );
×
101
    }
102

103
    public function testItIgnoresResourcesWithAnItemOperationUsingCustomClass(): void
104
    {
105
        $linkFactoryProphecy = $this->prophesize(LinkFactoryInterface::class);
×
106
        $linkFactoryProphecy->createLinksFromIdentifiers(Argument::type(HttpOperation::class))->shouldNotBeCalled();
×
107

108
        $resourceCollectionMetadataFactoryProphecy = $this->prophesize(ResourceMetadataCollectionFactoryInterface::class);
×
109
        $resourceCollectionMetadataFactoryProphecy->create(AttributeResource::class)->willReturn(
×
110
            new ResourceMetadataCollection(AttributeResource::class, [
×
111
                new ApiResource(
×
112
                    shortName: 'AttributeResource',
×
113
                    operations: [],
×
114
                    class: AttributeResource::class
×
115
                ),
×
116
                new ApiResource(
×
117
                    shortName: 'AttributeResource',
×
118
                    operations: [
×
119
                        '_api_AttributeResource_get_collection' => new GetCollection(controller: 'api_platform.action.placeholder', shortName: 'AttributeResource', class: AttributeResource::class),
×
120
                        '_api_AttributeResource_get' => new CustomGet(uriVariables: ['id' => new Link(fromClass: AttributeResource::class, identifiers: ['id'])], controller: 'api_platform.action.placeholder', shortName: 'AttributeResource', class: AttributeResource::class),
×
121
                    ],
×
122
                    uriVariables: ['id' => new Link(fromClass: AttributeResource::class, identifiers: ['id'])],
×
123
                    class: AttributeResource::class
×
124
                ),
×
125
            ]),
×
126
        );
×
127

128
        $factory = new NotExposedOperationResourceMetadataCollectionFactory($linkFactoryProphecy->reveal(), $resourceCollectionMetadataFactoryProphecy->reveal());
×
129
        $this->assertEquals(
×
130
            new ResourceMetadataCollection(AttributeResource::class, [
×
131
                new ApiResource(
×
132
                    shortName: 'AttributeResource',
×
133
                    operations: [],
×
134
                    class: AttributeResource::class
×
135
                ),
×
136
                new ApiResource(
×
137
                    shortName: 'AttributeResource',
×
138
                    operations: [
×
139
                        '_api_AttributeResource_get_collection' => new GetCollection(controller: 'api_platform.action.placeholder', shortName: 'AttributeResource', class: AttributeResource::class),
×
140
                        '_api_AttributeResource_get' => new CustomGet(uriVariables: ['id' => new Link(fromClass: AttributeResource::class, identifiers: ['id'])], controller: 'api_platform.action.placeholder', shortName: 'AttributeResource', class: AttributeResource::class),
×
141
                    ],
×
142
                    uriVariables: ['id' => new Link(fromClass: AttributeResource::class, identifiers: ['id'])],
×
143
                    class: AttributeResource::class
×
144
                ),
×
145
            ]),
×
146
            $factory->create(AttributeResource::class)
×
147
        );
×
148
    }
149

150
    public function testItAddsANotExposedOperationWithoutRouteNameOnTheLastResource(): void
151
    {
152
        $linkFactoryProphecy = $this->prophesize(LinkFactoryInterface::class);
×
153
        $linkFactoryProphecy->createLinksFromIdentifiers(Argument::type(HttpOperation::class))->willReturn([new Link()])->shouldBeCalled();
×
154

155
        $resourceCollectionMetadataFactoryProphecy = $this->prophesize(ResourceMetadataCollectionFactoryInterface::class);
×
156
        $resourceCollectionMetadataFactoryProphecy->create(AttributeResource::class)->willReturn(
×
157
            new ResourceMetadataCollection(AttributeResource::class, [
×
158
                new ApiResource(
×
159
                    shortName: 'AttributeResource',
×
160
                    operations: [],
×
161
                    class: AttributeResource::class
×
162
                ),
×
163
                new ApiResource(
×
164
                    shortName: 'AttributeResource',
×
165
                    operations: [
×
166
                        '_api_AttributeResource_get_collection' => new GetCollection(controller: 'api_platform.action.placeholder', shortName: 'AttributeResource', class: AttributeResource::class),
×
167
                    ],
×
168
                    class: AttributeResource::class
×
169
                ),
×
170
            ]),
×
171
        );
×
172

173
        $factory = new NotExposedOperationResourceMetadataCollectionFactory($linkFactoryProphecy->reveal(), $resourceCollectionMetadataFactoryProphecy->reveal());
×
174
        $this->assertEquals(
×
175
            new ResourceMetadataCollection(AttributeResource::class, [
×
176
                new ApiResource(
×
177
                    shortName: 'AttributeResource',
×
178
                    operations: [],
×
179
                    class: AttributeResource::class
×
180
                ),
×
181
                new ApiResource(
×
182
                    shortName: 'AttributeResource',
×
183
                    operations: [
×
184
                        '_api_AttributeResource_get_collection' => new GetCollection(controller: 'api_platform.action.placeholder', shortName: 'AttributeResource', class: AttributeResource::class),
×
185
                        '_api_AttributeResource_get' => new NotExposed(controller: 'api_platform.action.not_exposed', shortName: 'AttributeResource', class: AttributeResource::class, output: false, read: false, extraProperties: ['generated_operation' => true]),
×
186
                    ],
×
187
                    class: AttributeResource::class
×
188
                ),
×
189
            ]),
×
190
            $factory->create(AttributeResource::class)
×
191
        );
×
192
    }
193

194
    public function testItAddsANotExposedOperationWithRouteNameOnTheLastResource(): void
195
    {
196
        $linkFactoryProphecy = $this->prophesize(LinkFactoryInterface::class);
×
197
        $linkFactoryProphecy->createLinksFromIdentifiers(Argument::type(HttpOperation::class))->willReturn([])->shouldBeCalled();
×
198

199
        $resourceCollectionMetadataFactoryProphecy = $this->prophesize(ResourceMetadataCollectionFactoryInterface::class);
×
200
        $resourceCollectionMetadataFactoryProphecy->create(AttributeResource::class)->willReturn(
×
201
            new ResourceMetadataCollection(AttributeResource::class, [
×
202
                new ApiResource(
×
203
                    shortName: 'AttributeResource',
×
204
                    operations: [],
×
205
                    class: AttributeResource::class
×
206
                ),
×
207
                new ApiResource(
×
208
                    shortName: 'AttributeResource',
×
209
                    types: ['https://schema.org/Book'],
×
210
                    uriTemplate: '/custom_api_resources', // uriTemplate should not be inherited on NotExposed operation
×
211
                    uriVariables: ['slug'], // same as it is used to generate the uriTemplate of our NotExposed operation
×
212
                    operations: [
×
213
                        '_api_AttributeResource_get_collection' => new GetCollection(controller: 'api_platform.action.placeholder', shortName: 'AttributeResource', class: AttributeResource::class),
×
214
                    ],
×
215
                    class: AttributeResource::class
×
216
                ),
×
217
            ]),
×
218
        );
×
219

220
        $factory = new NotExposedOperationResourceMetadataCollectionFactory($linkFactoryProphecy->reveal(), $resourceCollectionMetadataFactoryProphecy->reveal());
×
221
        $this->assertEquals(
×
222
            new ResourceMetadataCollection(AttributeResource::class, [
×
223
                new ApiResource(
×
224
                    shortName: 'AttributeResource',
×
225
                    operations: [],
×
226
                    class: AttributeResource::class
×
227
                ),
×
228
                new ApiResource(
×
229
                    shortName: 'AttributeResource',
×
230
                    uriTemplate: '/custom_api_resources',
×
231
                    uriVariables: ['slug'],
×
232
                    types: ['https://schema.org/Book'],
×
233
                    operations: [
×
234
                        '_api_AttributeResource_get_collection' => new GetCollection(controller: 'api_platform.action.placeholder', shortName: 'AttributeResource', class: AttributeResource::class),
×
235
                        '_api_AttributeResource_get' => new NotExposed(uriTemplate: '/.well-known/genid/{id}', controller: 'api_platform.action.not_exposed', shortName: 'AttributeResource', class: AttributeResource::class, output: false, read: false, extraProperties: ['generated_operation' => true], types: ['https://schema.org/Book']),
×
236
                    ],
×
237
                    class: AttributeResource::class
×
238
                ),
×
239
            ]),
×
240
            $factory->create(AttributeResource::class)
×
241
        );
×
242
    }
243
}
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