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

api-platform / core / 13203378522

07 Feb 2025 03:56PM UTC coverage: 8.501% (+0.7%) from 7.837%
13203378522

push

github

soyuka
Merge 4.1

111 of 490 new or added lines in 51 files covered. (22.65%)

5590 existing lines in 163 files now uncovered.

13345 of 156987 relevant lines covered (8.5%)

22.88 hits per line

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

0.0
/tests/Symfony/Validator/Metadata/Property/ValidatorPropertyMetadataFactoryTest.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\Tests\Symfony\Validator\Metadata\Property;
15

16
use ApiPlatform\Metadata\ApiProperty;
17
use ApiPlatform\Metadata\Property\Factory\PropertyMetadataFactoryInterface;
18
use ApiPlatform\Symfony\Validator\Metadata\Property\Restriction\PropertySchemaChoiceRestriction;
19
use ApiPlatform\Symfony\Validator\Metadata\Property\Restriction\PropertySchemaCollectionRestriction;
20
use ApiPlatform\Symfony\Validator\Metadata\Property\Restriction\PropertySchemaCountRestriction;
21
use ApiPlatform\Symfony\Validator\Metadata\Property\Restriction\PropertySchemaFormat;
22
use ApiPlatform\Symfony\Validator\Metadata\Property\Restriction\PropertySchemaGreaterThanOrEqualRestriction;
23
use ApiPlatform\Symfony\Validator\Metadata\Property\Restriction\PropertySchemaGreaterThanRestriction;
24
use ApiPlatform\Symfony\Validator\Metadata\Property\Restriction\PropertySchemaLengthRestriction;
25
use ApiPlatform\Symfony\Validator\Metadata\Property\Restriction\PropertySchemaLessThanOrEqualRestriction;
26
use ApiPlatform\Symfony\Validator\Metadata\Property\Restriction\PropertySchemaLessThanRestriction;
27
use ApiPlatform\Symfony\Validator\Metadata\Property\Restriction\PropertySchemaOneOfRestriction;
28
use ApiPlatform\Symfony\Validator\Metadata\Property\Restriction\PropertySchemaRangeRestriction;
29
use ApiPlatform\Symfony\Validator\Metadata\Property\Restriction\PropertySchemaRegexRestriction;
30
use ApiPlatform\Symfony\Validator\Metadata\Property\Restriction\PropertySchemaUniqueRestriction;
31
use ApiPlatform\Symfony\Validator\Metadata\Property\ValidatorPropertyMetadataFactory;
32
use ApiPlatform\Tests\Fixtures\DummyAtLeastOneOfValidatedEntity;
33
use ApiPlatform\Tests\Fixtures\DummyCollectionValidatedEntity;
34
use ApiPlatform\Tests\Fixtures\DummyCompoundValidatedEntity;
35
use ApiPlatform\Tests\Fixtures\DummyCountValidatedEntity;
36
use ApiPlatform\Tests\Fixtures\DummyIriWithValidationEntity;
37
use ApiPlatform\Tests\Fixtures\DummyNumericValidatedEntity;
38
use ApiPlatform\Tests\Fixtures\DummyRangeValidatedEntity;
39
use ApiPlatform\Tests\Fixtures\DummySequentiallyValidatedEntity;
40
use ApiPlatform\Tests\Fixtures\DummyUniqueValidatedEntity;
41
use ApiPlatform\Tests\Fixtures\DummyValidatedChoiceEntity;
42
use ApiPlatform\Tests\Fixtures\DummyValidatedEntity;
43
use ApiPlatform\Tests\Fixtures\DummyValidatedHostnameEntity;
44
use ApiPlatform\Tests\Fixtures\DummyValidatedUlidEntity;
45
use PHPUnit\Framework\TestCase;
46
use Prophecy\PhpUnit\ProphecyTrait;
47
use Symfony\Component\PropertyInfo\Type;
48
use Symfony\Component\Validator\Constraints\Hostname;
49
use Symfony\Component\Validator\Constraints\Ulid;
50
use Symfony\Component\Validator\Mapping\ClassMetadata;
51
use Symfony\Component\Validator\Mapping\Factory\MetadataFactoryInterface;
52
use Symfony\Component\Validator\Mapping\Loader\AnnotationLoader;
53
use Symfony\Component\Validator\Mapping\Loader\AttributeLoader;
54

55
/**
56
 * @author Baptiste Meyer <baptiste.meyer@gmail.com>
57
 */
58
class ValidatorPropertyMetadataFactoryTest extends TestCase
59
{
60
    use ProphecyTrait;
61

62
    private ClassMetadata $validatorClassMetadata;
63

64
    protected function setUp(): void
65
    {
66
        $this->validatorClassMetadata = new ClassMetadata(DummyValidatedEntity::class);
×
67
        (class_exists(AttributeLoader::class) ? new AttributeLoader() : new AnnotationLoader())->loadClassMetadata($this->validatorClassMetadata);
×
68
    }
69

70
    public function testCreateWithPropertyWithRequiredConstraints(): void
71
    {
72
        $dummyPropertyMetadata = (new ApiProperty())->withDescription('A dummy')->withReadable(true)->withWritable(true);
×
73
        $emailPropertyMetadata = (new ApiProperty())->withTypes(['https://schema.org/email'])->withReadable(true)->withWritable(true);
×
74

75
        $decoratedPropertyMetadataFactory = $this->prophesize(PropertyMetadataFactoryInterface::class);
×
76
        $decoratedPropertyMetadataFactory->create(DummyValidatedEntity::class, 'dummy', [])->willReturn($dummyPropertyMetadata)->shouldBeCalled();
×
77
        $decoratedPropertyMetadataFactory->create(DummyValidatedEntity::class, 'dummyEmail', [])->willReturn($emailPropertyMetadata)->shouldBeCalled();
×
78

79
        $validatorMetadataFactory = $this->prophesize(MetadataFactoryInterface::class);
×
80
        $validatorMetadataFactory->getMetadataFor(DummyValidatedEntity::class)->willReturn($this->validatorClassMetadata)->shouldBeCalled();
×
81

82
        $validatorPropertyMetadataFactory = new ValidatorPropertyMetadataFactory(
×
83
            $validatorMetadataFactory->reveal(),
×
84
            $decoratedPropertyMetadataFactory->reveal(),
×
85
            []
×
86
        );
×
87

88
        $this->assertEquals(
×
89
            $dummyPropertyMetadata->withRequired(true),
×
90
            $validatorPropertyMetadataFactory->create(DummyValidatedEntity::class, 'dummy'),
×
91
        );
×
92

93
        $this->assertEquals(
×
94
            $emailPropertyMetadata->withRequired(false),
×
95
            $validatorPropertyMetadataFactory->create(DummyValidatedEntity::class, 'dummyEmail'),
×
96
        );
×
97
    }
98

99
    public function testCreateWithPropertyWithNotRequiredConstraints(): void
100
    {
101
        $propertyMetadata = (new ApiProperty())->withDescription('A dummy')->withReadable(true)->withWritable(true);
×
102
        $expectedPropertyMetadata = $propertyMetadata->withRequired(false);
×
103
        $expectedPropertyMetadata = $expectedPropertyMetadata->withTypes(['https://schema.org/Date']);
×
104

105
        $decoratedPropertyMetadataFactory = $this->prophesize(PropertyMetadataFactoryInterface::class);
×
106
        $decoratedPropertyMetadataFactory->create(DummyValidatedEntity::class, 'dummyDate', [])->willReturn($propertyMetadata)->shouldBeCalled();
×
107

108
        $validatorMetadataFactory = $this->prophesize(MetadataFactoryInterface::class);
×
109
        $validatorMetadataFactory->getMetadataFor(DummyValidatedEntity::class)->willReturn($this->validatorClassMetadata)->shouldBeCalled();
×
110

111
        $validatorPropertyMetadataFactory = new ValidatorPropertyMetadataFactory(
×
112
            $validatorMetadataFactory->reveal(),
×
113
            $decoratedPropertyMetadataFactory->reveal(),
×
114
            []
×
115
        );
×
116
        $resultedPropertyMetadata = $validatorPropertyMetadataFactory->create(DummyValidatedEntity::class, 'dummyDate');
×
117

118
        $this->assertEquals($expectedPropertyMetadata, $resultedPropertyMetadata);
×
119
    }
120

121
    public function testCreateWithPropertyWithoutConstraints(): void
122
    {
123
        $propertyMetadata = (new ApiProperty())->withDescription('A dummy')->withReadable(true)->withWritable(true)->withIdentifier(true);
×
124
        $expectedPropertyMetadata = $propertyMetadata->withRequired(false);
×
125

126
        $decoratedPropertyMetadataFactory = $this->prophesize(PropertyMetadataFactoryInterface::class);
×
127
        $decoratedPropertyMetadataFactory->create(DummyValidatedEntity::class, 'dummyId', [])->willReturn($propertyMetadata)->shouldBeCalled();
×
128

129
        $validatorMetadataFactory = $this->prophesize(MetadataFactoryInterface::class);
×
130
        $validatorMetadataFactory->getMetadataFor(DummyValidatedEntity::class)->willReturn($this->validatorClassMetadata)->shouldBeCalled();
×
131

132
        $validatorPropertyMetadataFactory = new ValidatorPropertyMetadataFactory(
×
133
            $validatorMetadataFactory->reveal(),
×
134
            $decoratedPropertyMetadataFactory->reveal(),
×
135
            []
×
136
        );
×
137
        $resultedPropertyMetadata = $validatorPropertyMetadataFactory->create(DummyValidatedEntity::class, 'dummyId');
×
138

139
        $this->assertEquals($expectedPropertyMetadata, $resultedPropertyMetadata);
×
140
    }
141

142
    public function testCreateWithPropertyWithRightValidationGroupsAndRequiredConstraints(): void
143
    {
144
        $propertyMetadata = (new ApiProperty())->withDescription('A dummy group')->withReadable(true)->withWritable(true);
×
145
        $expectedPropertyMetadata = $propertyMetadata->withRequired(true);
×
146

147
        $decoratedPropertyMetadataFactory = $this->prophesize(PropertyMetadataFactoryInterface::class);
×
148
        $decoratedPropertyMetadataFactory->create(DummyValidatedEntity::class, 'dummyGroup', ['validation_groups' => ['dummy']])->willReturn($propertyMetadata)->shouldBeCalled();
×
149

150
        $validatorMetadataFactory = $this->prophesize(MetadataFactoryInterface::class);
×
151
        $validatorMetadataFactory->getMetadataFor(DummyValidatedEntity::class)->willReturn($this->validatorClassMetadata)->shouldBeCalled();
×
152

153
        $validatorPropertyMetadataFactory = new ValidatorPropertyMetadataFactory(
×
154
            $validatorMetadataFactory->reveal(),
×
155
            $decoratedPropertyMetadataFactory->reveal(),
×
156
            []
×
157
        );
×
158
        $resultedPropertyMetadata = $validatorPropertyMetadataFactory->create(DummyValidatedEntity::class, 'dummyGroup', ['validation_groups' => ['dummy']]);
×
159

160
        $this->assertEquals($expectedPropertyMetadata, $resultedPropertyMetadata);
×
161
    }
162

163
    public function testCreateWithPropertyWithBadValidationGroupsAndRequiredConstraints(): void
164
    {
165
        $propertyMetadata = (new ApiProperty())->withDescription('A dummy group')->withReadable(true)->withWritable(true);
×
166
        $expectedPropertyMetadata = $propertyMetadata->withRequired(false);
×
167

168
        $decoratedPropertyMetadataFactory = $this->prophesize(PropertyMetadataFactoryInterface::class);
×
169
        $decoratedPropertyMetadataFactory->create(DummyValidatedEntity::class, 'dummyGroup', ['validation_groups' => ['ymmud']])->willReturn($propertyMetadata)->shouldBeCalled();
×
170

171
        $validatorMetadataFactory = $this->prophesize(MetadataFactoryInterface::class);
×
172
        $validatorMetadataFactory->getMetadataFor(DummyValidatedEntity::class)->willReturn($this->validatorClassMetadata)->shouldBeCalled();
×
173

174
        $validatorPropertyMetadataFactory = new ValidatorPropertyMetadataFactory(
×
175
            $validatorMetadataFactory->reveal(),
×
176
            $decoratedPropertyMetadataFactory->reveal(),
×
177
            []
×
178
        );
×
179
        $resultedPropertyMetadata = $validatorPropertyMetadataFactory->create(DummyValidatedEntity::class, 'dummyGroup', ['validation_groups' => ['ymmud']]);
×
180

181
        $this->assertEquals($expectedPropertyMetadata, $resultedPropertyMetadata);
×
182
    }
183

184
    public function testCreateWithPropertyWithNonStringValidationGroupsAndRequiredConstraints(): void
185
    {
186
        $propertyMetadata = (new ApiProperty())->withDescription('A dummy group')->withReadable(true)->withWritable(true);
×
187
        $expectedPropertyMetadata = $propertyMetadata->withRequired(false);
×
188

189
        $decoratedPropertyMetadataFactory = $this->prophesize(PropertyMetadataFactoryInterface::class);
×
190
        $decoratedPropertyMetadataFactory->create(DummyValidatedEntity::class, 'dummyGroup', ['validation_groups' => [1312]])->willReturn($propertyMetadata)->shouldBeCalled();
×
191

192
        $validatorMetadataFactory = $this->prophesize(MetadataFactoryInterface::class);
×
193
        $validatorMetadataFactory->getMetadataFor(DummyValidatedEntity::class)->willReturn($this->validatorClassMetadata)->shouldBeCalled();
×
194

195
        $validatorPropertyMetadataFactory = new ValidatorPropertyMetadataFactory(
×
196
            $validatorMetadataFactory->reveal(),
×
197
            $decoratedPropertyMetadataFactory->reveal(),
×
198
            []
×
199
        );
×
200
        $resultedPropertyMetadata = $validatorPropertyMetadataFactory->create(DummyValidatedEntity::class, 'dummyGroup', ['validation_groups' => [1312]]);
×
201

202
        $this->assertEquals($expectedPropertyMetadata, $resultedPropertyMetadata);
×
203
    }
204

205
    public function testCreateWithRequiredByDecorated(): void
206
    {
207
        $propertyMetadata = (new ApiProperty())->withDescription('A dummy group')->withReadable(true)->withRequired(true)->withTypes(['foo:bar']);
×
208
        $expectedPropertyMetadata = (clone $propertyMetadata)->withTypes(['foo:bar', 'https://schema.org/Date']);
×
209

210
        $decoratedPropertyMetadataFactory = $this->prophesize(PropertyMetadataFactoryInterface::class);
×
211
        $decoratedPropertyMetadataFactory->create(DummyValidatedEntity::class, 'dummyDate', [])->willReturn($propertyMetadata)->shouldBeCalled();
×
212

213
        $validatorMetadataFactory = $this->prophesize(MetadataFactoryInterface::class);
×
214
        $validatorMetadataFactory->getMetadataFor(DummyValidatedEntity::class)->willReturn($this->validatorClassMetadata)->shouldBeCalled();
×
215

216
        $validatorPropertyMetadataFactory = new ValidatorPropertyMetadataFactory(
×
217
            $validatorMetadataFactory->reveal(),
×
218
            $decoratedPropertyMetadataFactory->reveal(),
×
219
            []
×
220
        );
×
221
        $resultedPropertyMetadata = $validatorPropertyMetadataFactory->create(DummyValidatedEntity::class, 'dummyDate');
×
222

223
        $this->assertEquals($expectedPropertyMetadata, $resultedPropertyMetadata);
×
224
    }
225

226
    public function testCreateWithPropertyWithValidationConstraints(): void
227
    {
228
        $validatorClassMetadata = new ClassMetadata(DummyIriWithValidationEntity::class);
×
229
        (class_exists(AttributeLoader::class) ? new AttributeLoader() : new AnnotationLoader())->loadClassMetadata($validatorClassMetadata);
×
230

231
        $types = [
×
232
            'dummyUrl' => 'https://schema.org/url',
×
233
            'dummyEmail' => 'https://schema.org/email',
×
234
            'dummyUuid' => 'https://schema.org/identifier',
×
235
            'dummyCardScheme' => 'https://schema.org/identifier',
×
236
            'dummyBic' => 'https://schema.org/identifier',
×
237
            'dummyIban' => 'https://schema.org/identifier',
×
238
            'dummyDate' => 'https://schema.org/Date',
×
239
            'dummyDateTime' => 'https://schema.org/DateTime',
×
240
            'dummyTime' => 'https://schema.org/Time',
×
241
            'dummyImage' => 'https://schema.org/image',
×
242
            'dummyFile' => 'https://schema.org/MediaObject',
×
243
            'dummyCurrency' => 'https://schema.org/priceCurrency',
×
244
            'dummyIsbn' => 'https://schema.org/isbn',
×
245
            'dummyIssn' => 'https://schema.org/issn',
×
246
        ];
×
247

248
        $decoratedPropertyMetadataFactory = $this->prophesize(PropertyMetadataFactoryInterface::class);
×
249
        foreach ($types as $property => $iri) {
×
250
            $decoratedPropertyMetadataFactory->create(DummyIriWithValidationEntity::class, $property, [])->willReturn(new ApiProperty())->shouldBeCalled();
×
251
        }
252

253
        $validatorMetadataFactory = $this->prophesize(MetadataFactoryInterface::class);
×
254
        $validatorMetadataFactory->getMetadataFor(DummyIriWithValidationEntity::class)->willReturn($validatorClassMetadata)->shouldBeCalled();
×
255

256
        $validatorPropertyMetadataFactory = new ValidatorPropertyMetadataFactory(
×
257
            $validatorMetadataFactory->reveal(),
×
258
            $decoratedPropertyMetadataFactory->reveal(),
×
259
            []
×
260
        );
×
261

262
        foreach ($types as $property => $iri) {
×
263
            $resultedPropertyMetadata = $validatorPropertyMetadataFactory->create(DummyIriWithValidationEntity::class, $property);
×
264
            $this->assertEquals($iri, $resultedPropertyMetadata->getTypes()[0]);
×
265
        }
266
    }
267

268
    public function testCreateWithPropertyLengthRestriction(): void
269
    {
270
        $validatorClassMetadata = new ClassMetadata(DummyValidatedEntity::class);
×
271
        (class_exists(AttributeLoader::class) ? new AttributeLoader() : new AnnotationLoader())->loadClassMetadata($validatorClassMetadata);
×
272

273
        $validatorMetadataFactory = $this->prophesize(MetadataFactoryInterface::class);
×
274
        $validatorMetadataFactory->getMetadataFor(DummyValidatedEntity::class)
×
275
            ->willReturn($validatorClassMetadata)
×
276
            ->shouldBeCalled();
×
277

278
        $decoratedPropertyMetadataFactory = $this->prophesize(PropertyMetadataFactoryInterface::class);
×
279
        $property = 'dummy';
×
280
        $decoratedPropertyMetadataFactory->create(DummyValidatedEntity::class, $property, [])->willReturn(
×
281
            (new ApiProperty())->withBuiltinTypes([new Type(Type::BUILTIN_TYPE_STRING)])
×
282
        )->shouldBeCalled();
×
283

284
        $lengthRestrictions = new PropertySchemaLengthRestriction();
×
285
        $validatorPropertyMetadataFactory = new ValidatorPropertyMetadataFactory(
×
286
            $validatorMetadataFactory->reveal(),
×
287
            $decoratedPropertyMetadataFactory->reveal(),
×
UNCOV
288
            [$lengthRestrictions]
×
289
        );
×
290

291
        $schema = $validatorPropertyMetadataFactory->create(DummyValidatedEntity::class, $property)->getSchema();
×
292
        $this->assertNotNull($schema);
×
UNCOV
293
        $this->assertArrayHasKey('minLength', $schema);
×
UNCOV
294
        $this->assertArrayHasKey('maxLength', $schema);
×
295
    }
296

297
    public function testCreateWithPropertyRegexRestriction(): void
298
    {
UNCOV
299
        $validatorClassMetadata = new ClassMetadata(DummyValidatedEntity::class);
×
300
        (class_exists(AttributeLoader::class) ? new AttributeLoader() : new AnnotationLoader())->loadClassMetadata($validatorClassMetadata);
×
301

302
        $validatorMetadataFactory = $this->prophesize(MetadataFactoryInterface::class);
×
303
        $validatorMetadataFactory->getMetadataFor(DummyValidatedEntity::class)
×
UNCOV
304
            ->willReturn($validatorClassMetadata)
×
305
            ->shouldBeCalled();
×
306

307
        $decoratedPropertyMetadataFactory = $this->prophesize(PropertyMetadataFactoryInterface::class);
×
308
        $decoratedPropertyMetadataFactory->create(DummyValidatedEntity::class, 'dummy', [])->willReturn(
×
UNCOV
309
            new ApiProperty()
×
310
        )->shouldBeCalled();
×
311

312
        $validationPropertyMetadataFactory = new ValidatorPropertyMetadataFactory(
×
313
            $validatorMetadataFactory->reveal(),
×
UNCOV
314
            $decoratedPropertyMetadataFactory->reveal(),
×
315
            [new PropertySchemaRegexRestriction()]
×
316
        );
×
317

318
        $schema = $validationPropertyMetadataFactory->create(DummyValidatedEntity::class, 'dummy')->getSchema();
×
UNCOV
319
        $this->assertNotNull($schema);
×
UNCOV
320
        $this->assertArrayHasKey('pattern', $schema);
×
UNCOV
321
        $this->assertEquals('^(dummy)$', $schema['pattern']);
×
322
    }
323

324
    #[\PHPUnit\Framework\Attributes\DataProvider('providePropertySchemaFormatCases')]
325
    public function testCreateWithPropertyFormatRestriction(string $property, string $class, array $expectedSchema): void
326
    {
327
        $validatorClassMetadata = new ClassMetadata($class);
×
328
        (class_exists(AttributeLoader::class) ? new AttributeLoader() : new AnnotationLoader())->loadClassMetadata($validatorClassMetadata);
×
329

330
        $validatorMetadataFactory = $this->prophesize(MetadataFactoryInterface::class);
×
UNCOV
331
        $validatorMetadataFactory->getMetadataFor($class)
×
332
            ->willReturn($validatorClassMetadata)
×
333
            ->shouldBeCalled();
×
334

335
        $decoratedPropertyMetadataFactory = $this->prophesize(PropertyMetadataFactoryInterface::class);
×
336
        $decoratedPropertyMetadataFactory->create($class, $property, [])->willReturn(
×
337
            new ApiProperty()
×
338
        )->shouldBeCalled();
×
339
        $validationPropertyMetadataFactory = new ValidatorPropertyMetadataFactory(
×
340
            $validatorMetadataFactory->reveal(),
×
341
            $decoratedPropertyMetadataFactory->reveal(),
×
UNCOV
342
            [new PropertySchemaFormat()]
×
343
        );
×
UNCOV
344
        $schema = $validationPropertyMetadataFactory->create($class, $property)->getSchema();
×
345

UNCOV
346
        $this->assertEquals($expectedSchema, $schema);
×
347
    }
348

349
    public static function providePropertySchemaFormatCases(): \Generator
350
    {
351
        yield ['dummyEmail', DummyValidatedEntity::class, ['format' => 'email']];
×
352
        yield ['dummyUuid', DummyValidatedEntity::class, ['format' => 'uuid']];
×
353
        yield ['dummyIpv4', DummyValidatedEntity::class, ['format' => 'ipv4']];
×
354
        yield ['dummyIpv6', DummyValidatedEntity::class, ['format' => 'ipv6']];
×
UNCOV
355
        yield ['dummyUrl', DummyValidatedEntity::class, ['format' => 'uri']];
×
356
        if (class_exists(Ulid::class)) {
×
357
            yield ['dummyUlid', DummyValidatedUlidEntity::class, ['format' => 'ulid']];
×
358
        }
UNCOV
359
        if (class_exists(Hostname::class)) {
×
UNCOV
360
            yield ['dummyHostname', DummyValidatedHostnameEntity::class, ['format' => 'hostname']];
×
361
        }
362
    }
363

364
    public function testCreateWithSequentiallyConstraint(): void
365
    {
366
        $validatorClassMetadata = new ClassMetadata(DummySequentiallyValidatedEntity::class);
×
367
        (class_exists(AttributeLoader::class) ? new AttributeLoader() : new AnnotationLoader())->loadClassMetadata($validatorClassMetadata);
×
368

369
        $validatorMetadataFactory = $this->prophesize(MetadataFactoryInterface::class);
×
UNCOV
370
        $validatorMetadataFactory->getMetadataFor(DummySequentiallyValidatedEntity::class)
×
371
            ->willReturn($validatorClassMetadata)
×
372
            ->shouldBeCalled();
×
373

374
        $decoratedPropertyMetadataFactory = $this->prophesize(PropertyMetadataFactoryInterface::class);
×
375
        $decoratedPropertyMetadataFactory->create(DummySequentiallyValidatedEntity::class, 'dummy', [])->willReturn(
×
376
            (new ApiProperty())->withBuiltinTypes([new Type(Type::BUILTIN_TYPE_STRING)])
×
377
        )->shouldBeCalled();
×
378
        $validationPropertyMetadataFactory = new ValidatorPropertyMetadataFactory(
×
379
            $validatorMetadataFactory->reveal(),
×
380
            $decoratedPropertyMetadataFactory->reveal(),
×
UNCOV
381
            [new PropertySchemaLengthRestriction(), new PropertySchemaRegexRestriction()]
×
382
        );
×
383
        $schema = $validationPropertyMetadataFactory->create(DummySequentiallyValidatedEntity::class, 'dummy')->getSchema();
×
384

385
        $this->assertNotNull($schema);
×
UNCOV
386
        $this->assertArrayHasKey('minLength', $schema);
×
UNCOV
387
        $this->assertArrayHasKey('maxLength', $schema);
×
UNCOV
388
        $this->assertArrayHasKey('pattern', $schema);
×
389
    }
390

391
    public function testCreateWithCompoundConstraint(): void
392
    {
393
        $validatorClassMetadata = new ClassMetadata(DummyCompoundValidatedEntity::class);
×
394
        (class_exists(AttributeLoader::class) ? new AttributeLoader() : new AnnotationLoader())->loadClassMetadata($validatorClassMetadata);
×
395

396
        $validatorMetadataFactory = $this->prophesize(MetadataFactoryInterface::class);
×
UNCOV
397
        $validatorMetadataFactory->getMetadataFor(DummyCompoundValidatedEntity::class)
×
398
            ->willReturn($validatorClassMetadata)
×
399
            ->shouldBeCalled();
×
400

401
        $decoratedPropertyMetadataFactory = $this->prophesize(PropertyMetadataFactoryInterface::class);
×
402
        $decoratedPropertyMetadataFactory->create(DummyCompoundValidatedEntity::class, 'dummy', [])->willReturn(
×
403
            (new ApiProperty())->withBuiltinTypes([new Type(Type::BUILTIN_TYPE_STRING)])
×
404
        )->shouldBeCalled();
×
405
        $validationPropertyMetadataFactory = new ValidatorPropertyMetadataFactory(
×
406
            $validatorMetadataFactory->reveal(),
×
407
            $decoratedPropertyMetadataFactory->reveal(),
×
UNCOV
408
            [new PropertySchemaLengthRestriction(), new PropertySchemaRegexRestriction()]
×
409
        );
×
410
        $schema = $validationPropertyMetadataFactory->create(DummyCompoundValidatedEntity::class, 'dummy')->getSchema();
×
411

412
        $this->assertNotNull($schema);
×
UNCOV
413
        $this->assertArrayHasKey('minLength', $schema);
×
UNCOV
414
        $this->assertArrayHasKey('maxLength', $schema);
×
UNCOV
415
        $this->assertArrayHasKey('pattern', $schema);
×
416
    }
417

418
    public function testCreateWithAtLeastOneOfConstraint(): void
419
    {
420
        $validatorClassMetadata = new ClassMetadata(DummyAtLeastOneOfValidatedEntity::class);
×
421
        (class_exists(AttributeLoader::class) ? new AttributeLoader() : new AnnotationLoader())->loadClassMetadata($validatorClassMetadata);
×
422

423
        $validatorMetadataFactory = $this->prophesize(MetadataFactoryInterface::class);
×
UNCOV
424
        $validatorMetadataFactory->getMetadataFor(DummyAtLeastOneOfValidatedEntity::class)
×
425
            ->willReturn($validatorClassMetadata)
×
426
            ->shouldBeCalled();
×
427

428
        $decoratedPropertyMetadataFactory = $this->prophesize(PropertyMetadataFactoryInterface::class);
×
429
        $decoratedPropertyMetadataFactory->create(DummyAtLeastOneOfValidatedEntity::class, 'dummy', [])->willReturn(
×
430
            (new ApiProperty())->withBuiltinTypes([new Type(Type::BUILTIN_TYPE_STRING)])
×
431
        )->shouldBeCalled();
×
432
        $restrictionsMetadata = [new PropertySchemaLengthRestriction(), new PropertySchemaRegexRestriction()];
×
433
        $restrictionsMetadata = [new PropertySchemaOneOfRestriction($restrictionsMetadata), new PropertySchemaLengthRestriction(), new PropertySchemaRegexRestriction()];
×
434
        $validationPropertyMetadataFactory = new ValidatorPropertyMetadataFactory(
×
435
            $validatorMetadataFactory->reveal(),
×
436
            $decoratedPropertyMetadataFactory->reveal(),
×
UNCOV
437
            $restrictionsMetadata
×
438
        );
×
439
        $schema = $validationPropertyMetadataFactory->create(DummyAtLeastOneOfValidatedEntity::class, 'dummy')->getSchema();
×
440

441
        $this->assertNotNull($schema);
×
442
        $this->assertArrayHasKey('oneOf', $schema);
×
443
        $this->assertEquals([
×
UNCOV
444
            ['pattern' => '^(.*#.*)$'],
×
UNCOV
445
            ['minLength' => 10],
×
UNCOV
446
        ], $schema['oneOf']);
×
447
    }
448

449
    public function testCreateWithPropertyUniqueRestriction(): void
450
    {
451
        $validatorClassMetadata = new ClassMetadata(DummyUniqueValidatedEntity::class);
×
452
        (class_exists(AttributeLoader::class) ? new AttributeLoader() : new AnnotationLoader())->loadClassMetadata($validatorClassMetadata);
×
453

454
        $validatorMetadataFactory = $this->prophesize(MetadataFactoryInterface::class);
×
UNCOV
455
        $validatorMetadataFactory->getMetadataFor(DummyUniqueValidatedEntity::class)
×
456
            ->willReturn($validatorClassMetadata)
×
457
            ->shouldBeCalled();
×
458

459
        $decoratedPropertyMetadataFactory = $this->prophesize(PropertyMetadataFactoryInterface::class);
×
UNCOV
460
        $decoratedPropertyMetadataFactory->create(DummyUniqueValidatedEntity::class, 'dummyItems', [])->willReturn(
×
461
            new ApiProperty()
×
462
        )->shouldBeCalled();
×
463

464
        $validationPropertyMetadataFactory = new ValidatorPropertyMetadataFactory(
×
465
            $validatorMetadataFactory->reveal(),
×
UNCOV
466
            $decoratedPropertyMetadataFactory->reveal(),
×
467
            [new PropertySchemaUniqueRestriction()]
×
UNCOV
468
        );
×
469

UNCOV
470
        $schema = $validationPropertyMetadataFactory->create(DummyUniqueValidatedEntity::class, 'dummyItems')->getSchema();
×
471

UNCOV
472
        $this->assertEquals(['uniqueItems' => true], $schema);
×
473
    }
474

475
    #[\PHPUnit\Framework\Attributes\DataProvider('provideRangeConstraintCases')]
476
    public function testCreateWithRangeConstraint(Type $type, string $property, array $expectedSchema): void
477
    {
478
        $validatorClassMetadata = new ClassMetadata(DummyRangeValidatedEntity::class);
×
479
        (class_exists(AttributeLoader::class) ? new AttributeLoader() : new AnnotationLoader())->loadClassMetadata($validatorClassMetadata);
×
480

481
        $validatorMetadataFactory = $this->prophesize(MetadataFactoryInterface::class);
×
UNCOV
482
        $validatorMetadataFactory->getMetadataFor(DummyRangeValidatedEntity::class)
×
483
            ->willReturn($validatorClassMetadata)
×
484
            ->shouldBeCalled();
×
485

486
        $decoratedPropertyMetadataFactory = $this->prophesize(PropertyMetadataFactoryInterface::class);
×
487
        $decoratedPropertyMetadataFactory->create(DummyRangeValidatedEntity::class, $property, [])->willReturn(
×
488
            (new ApiProperty())->withBuiltinTypes([$type])
×
489
        )->shouldBeCalled();
×
490
        $validationPropertyMetadataFactory = new ValidatorPropertyMetadataFactory(
×
491
            $validatorMetadataFactory->reveal(),
×
492
            $decoratedPropertyMetadataFactory->reveal(),
×
UNCOV
493
            [new PropertySchemaRangeRestriction()]
×
494
        );
×
UNCOV
495
        $schema = $validationPropertyMetadataFactory->create(DummyRangeValidatedEntity::class, $property)->getSchema();
×
496

UNCOV
497
        $this->assertEquals($expectedSchema, $schema);
×
498
    }
499

500
    public static function provideRangeConstraintCases(): \Generator
501
    {
502
        yield 'min int' => ['type' => new Type(Type::BUILTIN_TYPE_INT), 'property' => 'dummyIntMin', 'expectedSchema' => ['minimum' => 1]];
×
503
        yield 'max int' => ['type' => new Type(Type::BUILTIN_TYPE_INT), 'property' => 'dummyIntMax', 'expectedSchema' => ['maximum' => 10]];
×
504
        yield 'min/max int' => ['type' => new Type(Type::BUILTIN_TYPE_INT), 'property' => 'dummyIntMinMax', 'expectedSchema' => ['minimum' => 1, 'maximum' => 10]];
×
UNCOV
505
        yield 'min float' => ['type' => new Type(Type::BUILTIN_TYPE_FLOAT), 'property' => 'dummyFloatMin', 'expectedSchema' => ['minimum' => 1.5]];
×
UNCOV
506
        yield 'max float' => ['type' => new Type(Type::BUILTIN_TYPE_FLOAT), 'property' => 'dummyFloatMax', 'expectedSchema' => ['maximum' => 10.5]];
×
UNCOV
507
        yield 'min/max float' => ['type' => new Type(Type::BUILTIN_TYPE_FLOAT), 'property' => 'dummyFloatMinMax', 'expectedSchema' => ['minimum' => 1.5, 'maximum' => 10.5]];
×
508
    }
509

510
    #[\PHPUnit\Framework\Attributes\DataProvider('provideChoiceConstraintCases')]
511
    public function testCreateWithPropertyChoiceRestriction(ApiProperty $propertyMetadata, string $property, array $expectedSchema): void
512
    {
513
        $validatorClassMetadata = new ClassMetadata(DummyValidatedChoiceEntity::class);
×
514
        (class_exists(AttributeLoader::class) ? new AttributeLoader() : new AnnotationLoader())->loadClassMetadata($validatorClassMetadata);
×
515

516
        $validatorMetadataFactory = $this->prophesize(MetadataFactoryInterface::class);
×
UNCOV
517
        $validatorMetadataFactory->getMetadataFor(DummyValidatedChoiceEntity::class)
×
518
            ->willReturn($validatorClassMetadata)
×
519
            ->shouldBeCalled();
×
520

521
        $decoratedPropertyMetadataFactory = $this->prophesize(PropertyMetadataFactoryInterface::class);
×
UNCOV
522
        $decoratedPropertyMetadataFactory->create(DummyValidatedChoiceEntity::class, $property, [])->willReturn(
×
523
            $propertyMetadata
×
524
        )->shouldBeCalled();
×
525

526
        $validationPropertyMetadataFactory = new ValidatorPropertyMetadataFactory(
×
UNCOV
527
            $validatorMetadataFactory->reveal(),
×
528
            $decoratedPropertyMetadataFactory->reveal(),
×
UNCOV
529
            [new PropertySchemaChoiceRestriction()]
×
530
        );
×
531

UNCOV
532
        $schema = $validationPropertyMetadataFactory->create(DummyValidatedChoiceEntity::class, $property)->getSchema();
×
533

UNCOV
534
        $this->assertEquals($expectedSchema, $schema);
×
535
    }
536

537
    public static function provideChoiceConstraintCases(): \Generator
538
    {
539
        yield 'single choice' => ['propertyMetadata' => (new ApiProperty())->withBuiltinTypes([new Type(Type::BUILTIN_TYPE_STRING)]), 'property' => 'dummySingleChoice', 'expectedSchema' => ['enum' => ['a', 'b']]];
×
540
        yield 'single choice callback' => ['propertyMetadata' => (new ApiProperty())->withBuiltinTypes([new Type(Type::BUILTIN_TYPE_STRING)]), 'property' => 'dummySingleChoiceCallback', 'expectedSchema' => ['enum' => ['a', 'b', 'c', 'd']]];
×
541
        yield 'multi choice' => ['propertyMetadata' => (new ApiProperty())->withBuiltinTypes([new Type(Type::BUILTIN_TYPE_STRING)]), 'property' => 'dummyMultiChoice', 'expectedSchema' => ['type' => 'array', 'items' => ['type' => 'string', 'enum' => ['a', 'b']]]];
×
UNCOV
542
        yield 'multi choice callback' => ['propertyMetadata' => (new ApiProperty())->withBuiltinTypes([new Type(Type::BUILTIN_TYPE_STRING)]), 'property' => 'dummyMultiChoiceCallback', 'expectedSchema' => ['type' => 'array', 'items' => ['type' => 'string', 'enum' => ['a', 'b', 'c', 'd']]]];
×
UNCOV
543
        yield 'multi choice min' => ['propertyMetadata' => (new ApiProperty())->withBuiltinTypes([new Type(Type::BUILTIN_TYPE_STRING)]), 'property' => 'dummyMultiChoiceMin', 'expectedSchema' => ['type' => 'array', 'items' => ['type' => 'string', 'enum' => ['a', 'b', 'c', 'd']], 'minItems' => 2]];
×
UNCOV
544
        yield 'multi choice max' => ['propertyMetadata' => (new ApiProperty())->withBuiltinTypes([new Type(Type::BUILTIN_TYPE_STRING)]), 'property' => 'dummyMultiChoiceMax', 'expectedSchema' => ['type' => 'array', 'items' => ['type' => 'string', 'enum' => ['a', 'b', 'c', 'd']], 'maxItems' => 4]];
×
UNCOV
545
        yield 'multi choice min/max' => ['propertyMetadata' => (new ApiProperty())->withBuiltinTypes([new Type(Type::BUILTIN_TYPE_STRING)]), 'property' => 'dummyMultiChoiceMinMax', 'expectedSchema' => ['type' => 'array', 'items' => ['type' => 'string', 'enum' => ['a', 'b', 'c', 'd']], 'minItems' => 2, 'maxItems' => 4]];
×
546
    }
547

548
    #[\PHPUnit\Framework\Attributes\DataProvider('provideCountConstraintCases')]
549
    public function testCreateWithPropertyCountRestriction(string $property, array $expectedSchema): void
550
    {
551
        $validatorClassMetadata = new ClassMetadata(DummyCountValidatedEntity::class);
×
552
        (class_exists(AttributeLoader::class) ? new AttributeLoader() : new AnnotationLoader())->loadClassMetadata($validatorClassMetadata);
×
553

UNCOV
554
        $validatorMetadataFactory = $this->prophesize(MetadataFactoryInterface::class);
×
555
        $validatorMetadataFactory->getMetadataFor(DummyCountValidatedEntity::class)
×
556
            ->willReturn($validatorClassMetadata)
×
557
            ->shouldBeCalled();
×
558

UNCOV
559
        $decoratedPropertyMetadataFactory = $this->prophesize(PropertyMetadataFactoryInterface::class);
×
560
        $decoratedPropertyMetadataFactory->create(DummyCountValidatedEntity::class, $property, [])->willReturn(
×
561
            new ApiProperty()
×
562
        )->shouldBeCalled();
×
563

UNCOV
564
        $validationPropertyMetadataFactory = new ValidatorPropertyMetadataFactory(
×
565
            $validatorMetadataFactory->reveal(),
×
UNCOV
566
            $decoratedPropertyMetadataFactory->reveal(),
×
567
            [new PropertySchemaCountRestriction()]
×
UNCOV
568
        );
×
569

UNCOV
570
        $schema = $validationPropertyMetadataFactory->create(DummyCountValidatedEntity::class, $property)->getSchema();
×
571

572
        $this->assertEquals($expectedSchema, $schema);
×
573
    }
574

575
    public static function provideCountConstraintCases(): \Generator
576
    {
UNCOV
577
        yield 'min' => ['property' => 'dummyMin', 'expectedSchema' => ['minItems' => 1]];
×
UNCOV
578
        yield 'max' => ['property' => 'dummyMax', 'expectedSchema' => ['maxItems' => 10]];
×
579
        yield 'min/max' => ['property' => 'dummyMinMax', 'expectedSchema' => ['minItems' => 1, 'maxItems' => 10]];
×
580
    }
581

582
    public function testCreateWithPropertyCollectionRestriction(): void
583
    {
584
        $validatorClassMetadata = new ClassMetadata(DummyCollectionValidatedEntity::class);
×
585
        (class_exists(AttributeLoader::class) ? new AttributeLoader() : new AnnotationLoader())->loadClassMetadata($validatorClassMetadata);
×
586

587
        $validatorMetadataFactory = $this->prophesize(MetadataFactoryInterface::class);
×
588
        $validatorMetadataFactory->getMetadataFor(DummyCollectionValidatedEntity::class)
×
589
            ->willReturn($validatorClassMetadata)
×
590
            ->shouldBeCalled();
×
591

592
        $decoratedPropertyMetadataFactory = $this->prophesize(PropertyMetadataFactoryInterface::class);
×
593
        $decoratedPropertyMetadataFactory->create(DummyCollectionValidatedEntity::class, 'dummyData', [])->willReturn(
×
594
            (new ApiProperty())->withBuiltinTypes([new Type(Type::BUILTIN_TYPE_ARRAY)])
×
595
        )->shouldBeCalled();
×
596

597
        $greaterThanRestriction = new PropertySchemaGreaterThanRestriction();
×
598
        $lengthRestriction = new PropertySchemaLengthRestriction();
×
599
        $regexRestriction = new PropertySchemaRegexRestriction();
×
600
        $formatRestriction = new PropertySchemaFormat();
×
601
        $restrictionsMetadata = [
×
602
            $greaterThanRestriction,
×
603
            $lengthRestriction,
×
604
            $regexRestriction,
×
605
            $formatRestriction,
×
606
            new PropertySchemaCollectionRestriction([
×
607
                $greaterThanRestriction,
×
608
                $lengthRestriction,
×
609
                $regexRestriction,
×
610
                $formatRestriction,
×
611
                new PropertySchemaCollectionRestriction([
×
612
                    $greaterThanRestriction,
×
613
                    $lengthRestriction,
×
UNCOV
614
                    $regexRestriction,
×
615
                    $formatRestriction,
×
616
                ]),
×
617
            ]),
×
618
        ];
×
619

UNCOV
620
        $validationPropertyMetadataFactory = new ValidatorPropertyMetadataFactory(
×
621
            $validatorMetadataFactory->reveal(),
×
UNCOV
622
            $decoratedPropertyMetadataFactory->reveal(),
×
623
            $restrictionsMetadata
×
624
        );
×
625

626
        $schema = $validationPropertyMetadataFactory->create(DummyCollectionValidatedEntity::class, 'dummyData')->getSchema();
×
627

628
        $this->assertEquals([
×
629
            'type' => 'object',
×
630
            'properties' => new \ArrayObject([
×
631
                'name' => new \ArrayObject(),
×
632
                'email' => ['format' => 'email', 'minLength' => 2, 'maxLength' => 255],
×
633
                'phone' => ['pattern' => '^([+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s\./0-9]*)$'],
×
634
                'age' => [
×
635
                    'exclusiveMinimum' => 0,
×
636
                ],
×
637
                'social' => [
×
638
                    'type' => 'object',
×
639
                    'properties' => new \ArrayObject([
×
640
                        'githubUsername' => new \ArrayObject(),
×
641
                    ]),
×
642
                    'additionalProperties' => false,
×
643
                    'required' => ['githubUsername'],
×
UNCOV
644
                ],
×
UNCOV
645
            ]),
×
UNCOV
646
            'additionalProperties' => true,
×
UNCOV
647
            'required' => ['name', 'email', 'social'],
×
UNCOV
648
        ], $schema);
×
649
    }
650

651
    #[\PHPUnit\Framework\Attributes\DataProvider('provideNumericConstraintCases')]
652
    public function testCreateWithPropertyNumericRestriction(ApiProperty $propertyMetadata, string $property, array $expectedSchema): void
653
    {
654
        $validatorClassMetadata = new ClassMetadata(DummyNumericValidatedEntity::class);
×
655
        (class_exists(AttributeLoader::class) ? new AttributeLoader() : new AnnotationLoader())->loadClassMetadata($validatorClassMetadata);
×
656

657
        $validatorMetadataFactory = $this->prophesize(MetadataFactoryInterface::class);
×
658
        $validatorMetadataFactory->getMetadataFor(DummyNumericValidatedEntity::class)
×
659
            ->willReturn($validatorClassMetadata)
×
660
            ->shouldBeCalled();
×
661

662
        $decoratedPropertyMetadataFactory = $this->prophesize(PropertyMetadataFactoryInterface::class);
×
663
        $decoratedPropertyMetadataFactory->create(DummyNumericValidatedEntity::class, $property, [])->willReturn(
×
664
            $propertyMetadata
×
665
        )->shouldBeCalled();
×
666

667
        $validationPropertyMetadataFactory = new ValidatorPropertyMetadataFactory(
×
668
            $validatorMetadataFactory->reveal(),
×
669
            $decoratedPropertyMetadataFactory->reveal(),
×
670
            [
×
UNCOV
671
                new PropertySchemaGreaterThanOrEqualRestriction(),
×
672
                new PropertySchemaGreaterThanRestriction(),
×
UNCOV
673
                new PropertySchemaLessThanOrEqualRestriction(),
×
674
                new PropertySchemaLessThanRestriction(),
×
UNCOV
675
            ]
×
UNCOV
676
        );
×
677

UNCOV
678
        $schema = $validationPropertyMetadataFactory->create(DummyNumericValidatedEntity::class, $property)->getSchema();
×
679

680
        $this->assertEquals($expectedSchema, $schema);
×
681
    }
682

683
    public static function provideNumericConstraintCases(): \Generator
684
    {
685
        yield [
×
686
            'propertyMetadata' => (new ApiProperty())->withBuiltinTypes([new Type(Type::BUILTIN_TYPE_INT)]),
×
687
            'property' => 'greaterThanMe',
×
688
            'expectedSchema' => ['exclusiveMinimum' => 10],
×
689
        ];
×
690

691
        yield [
×
692
            'propertyMetadata' => (new ApiProperty())->withBuiltinTypes([new Type(Type::BUILTIN_TYPE_FLOAT)]),
×
693
            'property' => 'greaterThanOrEqualToMe',
×
694
            'expectedSchema' => ['minimum' => 10.99],
×
695
        ];
×
696

697
        yield [
×
698
            'propertyMetadata' => (new ApiProperty())->withBuiltinTypes([new Type(Type::BUILTIN_TYPE_INT)]),
×
699
            'property' => 'lessThanMe',
×
700
            'expectedSchema' => ['exclusiveMaximum' => 99],
×
701
        ];
×
702

703
        yield [
×
704
            'propertyMetadata' => (new ApiProperty())->withBuiltinTypes([new Type(Type::BUILTIN_TYPE_FLOAT)]),
×
705
            'property' => 'lessThanOrEqualToMe',
×
706
            'expectedSchema' => ['maximum' => 99.33],
×
707
        ];
×
708

709
        yield [
×
710
            'propertyMetadata' => (new ApiProperty())->withBuiltinTypes([new Type(Type::BUILTIN_TYPE_INT)]),
×
711
            'property' => 'positive',
×
712
            'expectedSchema' => ['exclusiveMinimum' => 0],
×
713
        ];
×
714

715
        yield [
×
716
            'propertyMetadata' => (new ApiProperty())->withBuiltinTypes([new Type(Type::BUILTIN_TYPE_INT)]),
×
717
            'property' => 'positiveOrZero',
×
718
            'expectedSchema' => ['minimum' => 0],
×
719
        ];
×
720

721
        yield [
×
722
            'propertyMetadata' => (new ApiProperty())->withBuiltinTypes([new Type(Type::BUILTIN_TYPE_INT)]),
×
723
            'property' => 'negative',
×
724
            'expectedSchema' => ['exclusiveMaximum' => 0],
×
725
        ];
×
726

UNCOV
727
        yield [
×
UNCOV
728
            'propertyMetadata' => (new ApiProperty())->withBuiltinTypes([new Type(Type::BUILTIN_TYPE_INT)]),
×
UNCOV
729
            'property' => 'negativeOrZero',
×
UNCOV
730
            'expectedSchema' => ['maximum' => 0],
×
UNCOV
731
        ];
×
732
    }
733

734
    public function testCallableGroup(): void
735
    {
UNCOV
736
        $propertyMetadata = (new ApiProperty())->withDescription('A dummy group')->withReadable(true)->withWritable(true);
×
737

UNCOV
738
        $decoratedPropertyMetadataFactory = $this->prophesize(PropertyMetadataFactoryInterface::class);
×
UNCOV
739
        $decoratedPropertyMetadataFactory->create(DummyValidatedEntity::class, 'dummyGroup', ['validation_groups' => [DummyValidatedEntity::class, 'getValidationGroups']])->willReturn($propertyMetadata)->shouldBeCalled();
×
740

UNCOV
741
        $validatorMetadataFactory = $this->prophesize(MetadataFactoryInterface::class);
×
UNCOV
742
        $validatorMetadataFactory->getMetadataFor(DummyValidatedEntity::class)->willReturn($this->validatorClassMetadata)->shouldBeCalled();
×
743

UNCOV
744
        $validatorPropertyMetadataFactory = new ValidatorPropertyMetadataFactory(
×
UNCOV
745
            $validatorMetadataFactory->reveal(),
×
UNCOV
746
            $decoratedPropertyMetadataFactory->reveal(),
×
UNCOV
747
            []
×
UNCOV
748
        );
×
UNCOV
749
        $validatorPropertyMetadataFactory->create(DummyValidatedEntity::class, 'dummyGroup', ['validation_groups' => [DummyValidatedEntity::class, 'getValidationGroups']]);
×
750
    }
751
}
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