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

api-platform / core / 14500959057

16 Apr 2025 07:29PM UTC coverage: 8.532% (+0.3%) from 8.189%
14500959057

push

github

web-flow
feat: Use `Type` of `TypeInfo` instead of `PropertyInfo` (#6979)

Co-authored-by: soyuka <soyuka@users.noreply.github.com>

scopes: metadata, doctrine, json-schema

300 of 616 new or added lines in 25 files covered. (48.7%)

285 existing lines in 18 files now uncovered.

13513 of 158381 relevant lines covered (8.53%)

22.97 hits per line

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

0.0
/src/Metadata/Tests/Property/Factory/SerializerPropertyMetadataFactoryTest.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\Property\Factory;
15

16
use ApiPlatform\Metadata\ApiProperty;
17
use ApiPlatform\Metadata\Property\Factory\PropertyMetadataFactoryInterface;
18
use ApiPlatform\Metadata\Property\Factory\SerializerPropertyMetadataFactory;
19
use ApiPlatform\Metadata\ResourceClassResolverInterface;
20
use ApiPlatform\Metadata\Tests\Fixtures\ApiResource\Dummy;
21
use ApiPlatform\Metadata\Tests\Fixtures\ApiResource\DummyCar;
22
use ApiPlatform\Metadata\Tests\Fixtures\ApiResource\RelatedDummy;
23
use ApiPlatform\Metadata\Tests\Fixtures\DummyIgnoreProperty;
24
use PHPUnit\Framework\TestCase;
25
use Prophecy\PhpUnit\ProphecyTrait;
26
use Symfony\Component\Serializer\Mapping\AttributeMetadata as SerializerAttributeMetadata;
27
use Symfony\Component\Serializer\Mapping\ClassMetadata as SerializerClassMetadata;
28
use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactoryInterface as SerializerClassMetadataFactoryInterface;
29
use Symfony\Component\TypeInfo\Type;
30

31
class SerializerPropertyMetadataFactoryTest extends TestCase
32
{
33
    use ProphecyTrait;
34

35
    public static function groupsProvider(): array
36
    {
37
        return [
×
38
            [['dummy_read'], ['dummy_write']],
×
39
            ['dummy_read', 'dummy_write'],
×
40
        ];
×
41
    }
42

43
    #[\PHPUnit\Framework\Attributes\DataProvider('groupsProvider')]
44
    public function testCreate($readGroups, $writeGroups): void
45
    {
46
        $serializerClassMetadataFactoryProphecy = $this->prophesize(SerializerClassMetadataFactoryInterface::class);
×
47
        $dummySerializerClassMetadata = new SerializerClassMetadata(Dummy::class);
×
48
        $fooSerializerAttributeMetadata = new SerializerAttributeMetadata('foo');
×
49
        $fooSerializerAttributeMetadata->addGroup('dummy_read');
×
50
        $fooSerializerAttributeMetadata->addGroup('dummy_write');
×
51
        $dummySerializerClassMetadata->addAttributeMetadata($fooSerializerAttributeMetadata);
×
52
        $relatedDummySerializerAttributeMetadata = new SerializerAttributeMetadata('relatedDummy');
×
53
        $relatedDummySerializerAttributeMetadata->addGroup('dummy_read');
×
54
        $relatedDummySerializerAttributeMetadata->addGroup('dummy_write');
×
55
        $dummySerializerClassMetadata->addAttributeMetadata($relatedDummySerializerAttributeMetadata);
×
56
        $nameConvertedSerializerAttributeMetadata = new SerializerAttributeMetadata('nameConverted');
×
57
        $dummySerializerClassMetadata->addAttributeMetadata($nameConvertedSerializerAttributeMetadata);
×
58
        $serializerClassMetadataFactoryProphecy->getMetadataFor(Dummy::class)->willReturn($dummySerializerClassMetadata);
×
59
        $relatedDummySerializerClassMetadata = new SerializerClassMetadata(RelatedDummy::class);
×
60
        $nameSerializerAttributeMetadata = new SerializerAttributeMetadata('name');
×
61
        $nameSerializerAttributeMetadata->addGroup('dummy_read');
×
62
        $relatedDummySerializerClassMetadata->addAttributeMetadata($nameSerializerAttributeMetadata);
×
63
        $serializerClassMetadataFactoryProphecy->getMetadataFor(RelatedDummy::class)->willReturn($relatedDummySerializerClassMetadata);
×
64
        $dummyCarSerializerClassMetadata = new SerializerClassMetadata(DummyCar::class);
×
65
        $nameSerializerAttributeMetadata = new SerializerAttributeMetadata('name');
×
66
        $nameSerializerAttributeMetadata->addGroup('dummy_car_read');
×
67
        $nameSerializerAttributeMetadata->addGroup('dummy_write');
×
68
        $dummyCarSerializerClassMetadata->addAttributeMetadata($nameSerializerAttributeMetadata);
×
69
        $serializerClassMetadataFactoryProphecy->getMetadataFor(DummyCar::class)->willReturn($dummyCarSerializerClassMetadata);
×
70

71
        $context = ['normalization_groups' => $readGroups, 'denormalization_groups' => $writeGroups];
×
72

73
        $decoratedProphecy = $this->prophesize(PropertyMetadataFactoryInterface::class);
×
74
        $fooPropertyMetadata = (new ApiProperty())
×
NEW
75
            ->withNativeType(Type::nullable(Type::array())) // @phpstan-ignore-line
×
76
            ->withReadable(false)
×
77
            ->withWritable(true);
×
78
        $decoratedProphecy->create(Dummy::class, 'foo', $context)->willReturn($fooPropertyMetadata);
×
79
        $relatedDummyPropertyMetadata = (new ApiProperty())
×
NEW
80
            ->withNativeType(Type::nullable(Type::object(RelatedDummy::class)));
×
81
        $decoratedProphecy->create(Dummy::class, 'relatedDummy', $context)->willReturn($relatedDummyPropertyMetadata);
×
82
        $nameConvertedPropertyMetadata = (new ApiProperty())
×
NEW
83
            ->withNativeType(Type::nullable(Type::string())); // @phpstan-ignore-line
×
84
        $decoratedProphecy->create(Dummy::class, 'nameConverted', $context)->willReturn($nameConvertedPropertyMetadata);
×
85

86
        $resourceClassResolverProphecy = $this->prophesize(ResourceClassResolverInterface::class);
×
87
        $resourceClassResolverProphecy->isResourceClass(Dummy::class)->willReturn(true);
×
88
        $resourceClassResolverProphecy->isResourceClass(RelatedDummy::class)->willReturn(true);
×
89
        $resourceClassResolverProphecy->getResourceClass(null, RelatedDummy::class)->willReturn(RelatedDummy::class);
×
90

91
        $serializerPropertyMetadataFactory = new SerializerPropertyMetadataFactory($serializerClassMetadataFactoryProphecy->reveal(), $decoratedProphecy->reveal(), $resourceClassResolverProphecy->reveal());
×
92

93
        $actual = [];
×
94
        $actual[] = $serializerPropertyMetadataFactory->create(Dummy::class, 'foo', $context);
×
95
        $actual[] = $serializerPropertyMetadataFactory->create(Dummy::class, 'relatedDummy', $context);
×
96
        $actual[] = $serializerPropertyMetadataFactory->create(Dummy::class, 'nameConverted', $context);
×
97

98
        $this->assertInstanceOf(ApiProperty::class, $actual[0]);
×
99
        $this->assertFalse($actual[0]->isReadable());
×
100
        $this->assertTrue($actual[0]->isWritable());
×
101

102
        $this->assertInstanceOf(ApiProperty::class, $actual[1]);
×
103
        $this->assertTrue($actual[1]->isReadable());
×
104
        $this->assertTrue($actual[1]->isWritable());
×
105
        $this->assertTrue($actual[1]->isReadableLink());
×
106
        $this->assertFalse($actual[1]->isWritableLink());
×
107

108
        $this->assertInstanceOf(ApiProperty::class, $actual[2]);
×
109
        $this->assertFalse($actual[2]->isReadable());
×
110
        $this->assertFalse($actual[2]->isWritable());
×
111
    }
112

113
    public function testCreateWithIgnoredProperty(): void
114
    {
115
        $ignoredSerializerAttributeMetadata = new SerializerAttributeMetadata('ignored');
×
116
        $ignoredSerializerAttributeMetadata->addGroup('dummy');
×
117
        $ignoredSerializerAttributeMetadata->addGroup('dummy');
×
118
        $ignoredSerializerAttributeMetadata->setIgnore(true);
×
119

120
        $dummyIgnorePropertySerializerClassMetadata = new SerializerClassMetadata(DummyIgnoreProperty::class);
×
121
        $dummyIgnorePropertySerializerClassMetadata->addAttributeMetadata($ignoredSerializerAttributeMetadata);
×
122

123
        $serializerClassMetadataFactoryProphecy = $this->prophesize(SerializerClassMetadataFactoryInterface::class);
×
124
        $serializerClassMetadataFactoryProphecy->getMetadataFor(DummyIgnoreProperty::class)->willReturn($dummyIgnorePropertySerializerClassMetadata);
×
125

126
        $resourceClassResolverProphecy = $this->prophesize(ResourceClassResolverInterface::class);
×
127
        $resourceClassResolverProphecy->isResourceClass(DummyIgnoreProperty::class)->willReturn(true);
×
128

NEW
129
        $ignoredPropertyMetadata = (new ApiProperty())->withNativeType(Type::nullable(Type::string())); // @phpstan-ignore-line
×
130

131
        $options = [
×
132
            'normalization_groups' => ['dummy'],
×
133
            'denormalization_groups' => ['dummy'],
×
134
        ];
×
135

136
        $decoratedProphecy = $this->prophesize(PropertyMetadataFactoryInterface::class);
×
137
        $decoratedProphecy->create(DummyIgnoreProperty::class, 'ignored', $options)->willReturn($ignoredPropertyMetadata);
×
138

139
        $serializerPropertyMetadataFactory = new SerializerPropertyMetadataFactory(
×
140
            $serializerClassMetadataFactoryProphecy->reveal(),
×
141
            $decoratedProphecy->reveal(),
×
142
            $resourceClassResolverProphecy->reveal()
×
143
        );
×
144

145
        $result = $serializerPropertyMetadataFactory->create(DummyIgnoreProperty::class, 'ignored', $options);
×
146

147
        self::assertFalse($result->isReadable());
×
148
        self::assertFalse($result->isWritable());
×
149
    }
150
}
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