Skip to content

Commit 8c8a91b

Browse files
GregoireHebertGrégoire Hébert
andauthored
feat(jsonschema): serialization context on JsonSchema (#4860)
Co-authored-by: Grégoire Hébert <contact@gheb.dev>
1 parent 6ad683c commit 8c8a91b

File tree

3 files changed

+28
-5
lines changed

3 files changed

+28
-5
lines changed

src/Symfony/Bundle/Test/ApiTestAssertionsTrait.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ public static function assertMatchesJsonSchema(object|array|string $jsonSchema,
105105
static::assertThat(self::getHttpResponse()->toArray(false), $constraint, $message);
106106
}
107107

108-
public static function assertMatchesResourceCollectionJsonSchema(string $resourceClass, ?string $operationName = null, string $format = 'jsonld'): void
108+
public static function assertMatchesResourceCollectionJsonSchema(string $resourceClass, ?string $operationName = null, string $format = 'jsonld', ?array $serializationContext = null): void
109109
{
110110
$schemaFactory = self::getSchemaFactory();
111111

@@ -115,12 +115,12 @@ public static function assertMatchesResourceCollectionJsonSchema(string $resourc
115115
$operation = $operationName ? (new GetCollection())->withName($operationName) : new GetCollection();
116116
}
117117

118-
$schema = $schemaFactory->buildSchema($resourceClass, $format, Schema::TYPE_OUTPUT, $operation, null);
118+
$schema = $schemaFactory->buildSchema($resourceClass, $format, Schema::TYPE_OUTPUT, $operation, null, $serializationContext);
119119

120120
static::assertMatchesJsonSchema($schema->getArrayCopy());
121121
}
122122

123-
public static function assertMatchesResourceItemJsonSchema(string $resourceClass, ?string $operationName = null, string $format = 'jsonld'): void
123+
public static function assertMatchesResourceItemJsonSchema(string $resourceClass, ?string $operationName = null, string $format = 'jsonld', ?array $serializationContext = null): void
124124
{
125125
$schemaFactory = self::getSchemaFactory();
126126

@@ -130,7 +130,7 @@ public static function assertMatchesResourceItemJsonSchema(string $resourceClass
130130
$operation = $operationName ? (new Get())->withName($operationName) : new Get();
131131
}
132132

133-
$schema = $schemaFactory->buildSchema($resourceClass, $format, Schema::TYPE_OUTPUT, $operation, null);
133+
$schema = $schemaFactory->buildSchema($resourceClass, $format, Schema::TYPE_OUTPUT, $operation, null, $serializationContext);
134134

135135
static::assertMatchesJsonSchema($schema->getArrayCopy());
136136
}

tests/Fixtures/TestBundle/Entity/User.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@
5050
normalizationContext: ['groups' => ['user_password_reset_request']],
5151
denormalizationContext: ['groups' => ['user_password_reset_request']]
5252
),
53+
new Get('users-with-groups/{id}', normalizationContext: ['groups' => ['api-test-case-group']]),
54+
new GetCollection('users-with-groups', normalizationContext: ['groups' => ['api-test-case-group']]),
5355
], normalizationContext: ['groups' => ['user', 'user-read']], denormalizationContext: ['groups' => ['user', 'user-write']])]
5456
#[ORM\Entity]
5557
#[ORM\Table(name: 'user_test')]
@@ -62,7 +64,7 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface
6264
#[Groups(['user'])]
6365
private ?string $email = null;
6466
#[ORM\Column(type: 'string', length: 255, nullable: true)]
65-
#[Groups(['user'])]
67+
#[Groups(['user', 'api-test-case-group'])]
6668
private ?string $fullname = null;
6769
#[Groups(['user-write'])]
6870
private ?string $plainPassword = null;

tests/Symfony/Bundle/Test/ApiTestCaseTest.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use ApiPlatform\Tests\Fixtures\TestBundle\Entity\Dummy;
1919
use ApiPlatform\Tests\Fixtures\TestBundle\Entity\DummyDtoInputOutput;
2020
use ApiPlatform\Tests\Fixtures\TestBundle\Entity\JsonSchemaContextDummy;
21+
use ApiPlatform\Tests\Fixtures\TestBundle\Entity\User;
2122
use ApiPlatform\Tests\Fixtures\TestBundle\Model\ResourceInterface;
2223
use Doctrine\ORM\EntityManagerInterface;
2324
use Doctrine\ORM\Mapping\ClassMetadata;
@@ -156,6 +157,26 @@ public function testAssertMatchesResourceItemJsonSchemaOutput(): void
156157
$this->assertMatchesResourceItemJsonSchema(DummyDtoInputOutput::class);
157158
}
158159

160+
public function testAssertMatchesResourceItemAndCollectionJsonSchemaOutputWithContext(): void
161+
{
162+
$this->recreateSchema();
163+
164+
/** @var EntityManagerInterface $manager */
165+
$manager = static::getContainer()->get('doctrine')->getManager();
166+
$user = new User();
167+
$user->setFullname('Grégoire');
168+
$user->setPlainPassword('password');
169+
170+
$manager->persist($user);
171+
$manager->flush();
172+
173+
self::createClient()->request('GET', "/users-with-groups/{$user->getId()}");
174+
$this->assertMatchesResourceItemJsonSchema(User::class, null, 'jsonld', ['groups' => ['api-test-case-group']]);
175+
176+
self::createClient()->request('GET', '/users-with-groups');
177+
$this->assertMatchesResourceCollectionJsonSchema(User::class, null, 'jsonld', ['groups' => ['api-test-case-group']]);
178+
}
179+
159180
// Next tests have been imported from dms/phpunit-arraysubset-asserts, because the original constraint has been deprecated.
160181

161182
public function testAssertArraySubsetPassesStrictConfig(): void

0 commit comments

Comments
 (0)