Skip to content

Commit

Permalink
feat(jsonschema): serialization context on JsonSchema
Browse files Browse the repository at this point in the history
  • Loading branch information
Grégoire Hébert authored and soyuka committed Jan 12, 2023
1 parent bde59ba commit b492e58
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 5 deletions.
8 changes: 4 additions & 4 deletions src/Symfony/Bundle/Test/ApiTestAssertionsTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ public static function assertMatchesJsonSchema(object|array|string $jsonSchema,
static::assertThat(self::getHttpResponse()->toArray(false), $constraint, $message);
}

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

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

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

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

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

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

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

static::assertMatchesJsonSchema($schema->getArrayCopy());
}
Expand Down
4 changes: 3 additions & 1 deletion tests/Fixtures/TestBundle/Entity/User.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@
normalizationContext: ['groups' => ['user_password_reset_request']],
denormalizationContext: ['groups' => ['user_password_reset_request']]
),
new Get('users-with-groups/{id}', normalizationContext: ['groups' => ['api-test-case-group']]),
new GetCollection('users-with-groups', normalizationContext: ['groups' => ['api-test-case-group']]),
], normalizationContext: ['groups' => ['user', 'user-read']], denormalizationContext: ['groups' => ['user', 'user-write']])]
#[ORM\Entity]
#[ORM\Table(name: 'user_test')]
Expand All @@ -62,7 +64,7 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface
#[Groups(['user'])]
private ?string $email = null;
#[ORM\Column(type: 'string', length: 255, nullable: true)]
#[Groups(['user'])]
#[Groups(['user', 'api-test-case-group'])]
private ?string $fullname = null;
#[Groups(['user-write'])]
private ?string $plainPassword = null;
Expand Down
21 changes: 21 additions & 0 deletions tests/Symfony/Bundle/Test/ApiTestCaseTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
use ApiPlatform\Tests\Fixtures\TestBundle\Entity\Dummy;
use ApiPlatform\Tests\Fixtures\TestBundle\Entity\DummyDtoInputOutput;
use ApiPlatform\Tests\Fixtures\TestBundle\Entity\JsonSchemaContextDummy;
use ApiPlatform\Tests\Fixtures\TestBundle\Entity\User;
use ApiPlatform\Tests\Fixtures\TestBundle\Model\ResourceInterface;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Mapping\ClassMetadata;
Expand Down Expand Up @@ -156,6 +157,26 @@ public function testAssertMatchesResourceItemJsonSchemaOutput(): void
$this->assertMatchesResourceItemJsonSchema(DummyDtoInputOutput::class);
}

public function testAssertMatchesResourceItemAndCollectionJsonSchemaOutputWithContext(): void
{
$this->recreateSchema();

/** @var EntityManagerInterface $manager */
$manager = static::getContainer()->get('doctrine')->getManager();
$user = new User();
$user->setFullname('Grégoire');
$user->setPlainPassword('password');

$manager->persist($user);
$manager->flush();

self::createClient()->request('GET', "/users-with-groups/{$user->getId()}");
$this->assertMatchesResourceItemJsonSchema(User::class, null, 'jsonld', ['groups' => ['api-test-case-group']]);

self::createClient()->request('GET', '/users-with-groups');
$this->assertMatchesResourceCollectionJsonSchema(User::class, null, 'jsonld', ['groups' => ['api-test-case-group']]);
}

// Next tests have been imported from dms/phpunit-arraysubset-asserts, because the original constraint has been deprecated.

public function testAssertArraySubsetPassesStrictConfig(): void
Expand Down

0 comments on commit b492e58

Please sign in to comment.