From b1cb314352d5cf3e15e935478af52d5df867b465 Mon Sep 17 00:00:00 2001 From: Thibaut Cholley Date: Sun, 5 Oct 2025 11:25:32 +0200 Subject: [PATCH] fix(openapi): allow assertMatchesJsonSchema with custom output dto --- src/Hydra/JsonSchema/SchemaFactory.php | 6 ++---- tests/Fixtures/TestBundle/Entity/DummyDtoCustom.php | 2 +- tests/Symfony/Bundle/Test/ApiTestCaseTest.php | 8 ++++++++ 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/Hydra/JsonSchema/SchemaFactory.php b/src/Hydra/JsonSchema/SchemaFactory.php index 476667c5812..4328d52f476 100644 --- a/src/Hydra/JsonSchema/SchemaFactory.php +++ b/src/Hydra/JsonSchema/SchemaFactory.php @@ -142,10 +142,8 @@ public function buildSchema(string $className, string $format = 'jsonld', string $baseName = Schema::TYPE_OUTPUT === $type ? self::ITEM_BASE_SCHEMA_NAME : self::ITEM_BASE_SCHEMA_OUTPUT_NAME; - if ($this->isResourceClass($inputOrOutputClass)) { - if (!isset($definitions[$baseName])) { - $definitions[$baseName] = Schema::TYPE_OUTPUT === $type ? self::ITEM_BASE_SCHEMA_OUTPUT : self::ITEM_BASE_SCHEMA; - } + if (!isset($definitions[$baseName])) { + $definitions[$baseName] = Schema::TYPE_OUTPUT === $type ? self::ITEM_BASE_SCHEMA_OUTPUT : self::ITEM_BASE_SCHEMA; } $allOf = new \ArrayObject(['allOf' => [ diff --git a/tests/Fixtures/TestBundle/Entity/DummyDtoCustom.php b/tests/Fixtures/TestBundle/Entity/DummyDtoCustom.php index ec705a76189..8b3946e007f 100644 --- a/tests/Fixtures/TestBundle/Entity/DummyDtoCustom.php +++ b/tests/Fixtures/TestBundle/Entity/DummyDtoCustom.php @@ -35,7 +35,7 @@ new Delete(), new Post(input: CustomInputDto::class, processor: CustomInputDtoProcessor::class), new GetCollection(), - new GetCollection(output: CustomOutputDto::class, uriTemplate: 'dummy_dto_custom_output', provider: CustomOutputDtoProvider::class), + new GetCollection(output: CustomOutputDto::class, uriTemplate: 'dummy_dto_custom_output', provider: CustomOutputDtoProvider::class, name: 'dummy_dto_custom_output_collection'), new Get(output: CustomOutputDto::class, uriTemplate: 'dummy_dto_custom_output/{id}', provider: CustomOutputDtoProvider::class), new Post(output: false, uriTemplate: 'dummy_dto_custom_post_without_output'), ] diff --git a/tests/Symfony/Bundle/Test/ApiTestCaseTest.php b/tests/Symfony/Bundle/Test/ApiTestCaseTest.php index 8e48db6a294..c0d656597af 100644 --- a/tests/Symfony/Bundle/Test/ApiTestCaseTest.php +++ b/tests/Symfony/Bundle/Test/ApiTestCaseTest.php @@ -20,6 +20,7 @@ use ApiPlatform\Tests\Fixtures\TestBundle\Entity\Address; use ApiPlatform\Tests\Fixtures\TestBundle\Entity\DirectMercure; use ApiPlatform\Tests\Fixtures\TestBundle\Entity\Dummy; +use ApiPlatform\Tests\Fixtures\TestBundle\Entity\DummyDtoCustom; use ApiPlatform\Tests\Fixtures\TestBundle\Entity\DummyDtoInputOutput; use ApiPlatform\Tests\Fixtures\TestBundle\Entity\Issue6041\NumericValidated; use ApiPlatform\Tests\Fixtures\TestBundle\Entity\Issue6146\Issue6146Child; @@ -193,6 +194,13 @@ public function testAssertMatchesResourceItemJsonSchema(string $format, string $ $this->assertMatchesResourceItemJsonSchema(ResourceInterface::class, format: $format); } + #[\PHPUnit\Framework\Attributes\DataProvider('providerFormats')] + public function testAssertMatchesResourceItemJsonSchemaWithCustomOutput(string $format, string $mimeType): void + { + self::createClient()->request('GET', '/dummy_dto_custom_output/some-id', ['headers' => ['Accept' => $mimeType]]); + $this->assertMatchesResourceItemJsonSchema(DummyDtoCustom::class, operationName: 'dummy_dto_custom_output_collection', format: $format); + } + #[\PHPUnit\Framework\Attributes\DataProvider('providerFormats')] #[\PHPUnit\Framework\Attributes\Group('orm')] public function testAssertMatchesResourceItemJsonSchemaWithCustomJson(string $format, string $mimeType): void