diff --git a/features/graphql/input_output.feature b/features/graphql/input_output.feature index ee616ffc5fc..7956bf731e4 100644 --- a/features/graphql/input_output.feature +++ b/features/graphql/input_output.feature @@ -5,12 +5,14 @@ Feature: GraphQL DTO input and output @createSchema Scenario: Retrieve an Output with GraphQL + Given there is a RelatedDummy with 0 friends When I add "Content-Type" header equal to "application/ld+json" And I send a "POST" request to "/dummy_dto_input_outputs" with body: """ { "foo": "test", - "bar": 1 + "bar": 1, + "relatedDummies": ["/related_dummies/1"] } """ Then the response status code should be 201 @@ -22,20 +24,51 @@ Feature: GraphQL DTO input and output "hydra": "http://www.w3.org/ns/hydra/core#", "id": "OutputDto/id", "baz": "OutputDto/baz", - "bat": "OutputDto/bat" + "bat": "OutputDto/bat", + "relatedDummies": "OutputDto/relatedDummies" }, "@type": "DummyDtoInputOutput", "@id": "/dummy_dto_input_outputs/1", "id": 1, "baz": 1, - "bat": "test" + "bat": "test", + "relatedDummies": [ + { + "@context": "/contexts/RelatedDummy", + "@id": "/related_dummies/1", + "@type": "https://schema.org/Product", + "name": "RelatedDummy with friends", + "dummyDate": null, + "thirdLevel": null, + "relatedToDummyFriend": [], + "dummyBoolean": null, + "embeddedDummy": { + "dummyName": null, + "dummyBoolean": null, + "dummyDate": null, + "dummyFloat": null, + "dummyPrice": null, + "symfony": null + }, + "id": 1, + "symfony": "symfony", + "age": null + } + ] } """ When I send the following GraphQL request: """ { dummyDtoInputOutput(id: "/dummy_dto_input_outputs/1") { - _id, id, baz + _id, id, baz, + relatedDummies { + edges { + node { + name + } + } + } } } """ @@ -49,7 +82,16 @@ Feature: GraphQL DTO input and output "dummyDtoInputOutput": { "_id": 1, "id": "/dummy_dto_input_outputs/1", - "baz": 1 + "baz": 1, + "relatedDummies": { + "edges": [ + { + "node": { + "name": "RelatedDummy with friends" + } + } + ] + } } } } diff --git a/features/jsonld/input_output.feature b/features/jsonld/input_output.feature index 256eb610a22..a4be765cead 100644 --- a/features/jsonld/input_output.feature +++ b/features/jsonld/input_output.feature @@ -151,13 +151,15 @@ Feature: JSON-LD DTO input and output "hydra": "http://www.w3.org/ns/hydra/core#", "id": "OutputDto/id", "baz": "OutputDto/baz", - "bat": "OutputDto/bat" + "bat": "OutputDto/bat", + "relatedDummies": "OutputDto/relatedDummies" }, "@type": "DummyDtoInputOutput", "@id": "/dummy_dto_input_outputs/1", "id": 1, "baz": 1, - "bat": "test" + "bat": "test", + "relatedDummies": [] } """ When I add "Accept" header equal to "application/ld+json" @@ -178,13 +180,15 @@ Feature: JSON-LD DTO input and output "hydra": "http://www.w3.org/ns/hydra/core#", "id": "OutputDto/id", "baz": "OutputDto/baz", - "bat": "OutputDto/bat" + "bat": "OutputDto/bat", + "relatedDummies": "OutputDto/relatedDummies" }, "@type": "DummyDtoInputOutput", "@id": "/dummy_dto_input_outputs/1", "id": 1, "baz": 2, - "bat": "test" + "bat": "test", + "relatedDummies": [] } """ @@ -237,13 +241,15 @@ Feature: JSON-LD DTO input and output "hydra": "http://www.w3.org/ns/hydra/core#", "id": "OutputDto/id", "baz": "OutputDto/baz", - "bat": "OutputDto/bat" + "bat": "OutputDto/bat", + "relatedDummies": "OutputDto/relatedDummies" }, "@type": "DummyDtoNoInput", "@id": "/dummy_dto_no_inputs/1", "id": 1, "baz": 1, - "bat": "test" + "bat": "test", + "relatedDummies": [] } """ @@ -260,13 +266,15 @@ Feature: JSON-LD DTO input and output "hydra": "http://www.w3.org/ns/hydra/core#", "id": "OutputDto/id", "baz": "OutputDto/baz", - "bat": "OutputDto/bat" + "bat": "OutputDto/bat", + "relatedDummies": "OutputDto/relatedDummies" }, "@type": "DummyDtoNoInput", "@id": "/dummy_dto_no_inputs/1", "id": 1, "baz": 1, - "bat": "testtest" + "bat": "testtest", + "relatedDummies": [] } """ diff --git a/src/GraphQl/Resolver/Stage/ReadStage.php b/src/GraphQl/Resolver/Stage/ReadStage.php index bfe4bde7ac1..144baa8fb0d 100644 --- a/src/GraphQl/Resolver/Stage/ReadStage.php +++ b/src/GraphQl/Resolver/Stage/ReadStage.php @@ -92,9 +92,10 @@ public function __invoke(?string $resourceClass, ?string $rootClass, string $ope $normalizationContext['filters'] = $this->getNormalizedFilters($args); $source = $context['source']; - if (isset($source[$rootProperty = $info->fieldName], $source[ItemNormalizer::ITEM_IDENTIFIERS_KEY])) { + if (isset($source[$rootProperty = $info->fieldName], $source[ItemNormalizer::ITEM_IDENTIFIERS_KEY], $source[ItemNormalizer::ITEM_RESOURCE_CLASS_KEY])) { $rootResolvedFields = $source[ItemNormalizer::ITEM_IDENTIFIERS_KEY]; - $subresourceCollection = $this->getSubresource($rootClass, $rootResolvedFields, $rootProperty, $resourceClass, $normalizationContext, $operationName); + $rootResolvedClass = $source[ItemNormalizer::ITEM_RESOURCE_CLASS_KEY]; + $subresourceCollection = $this->getSubresource($rootResolvedClass, $rootResolvedFields, $rootProperty, $resourceClass, $normalizationContext, $operationName); if (!is_iterable($subresourceCollection)) { throw new \UnexpectedValueException('Expected subresource collection to be iterable'); } @@ -158,12 +159,12 @@ private function getNormalizedFilters(array $args): array /** * @return iterable|object|null */ - private function getSubresource(string $rootClass, array $rootResolvedFields, string $rootProperty, string $subresourceClass, array $normalizationContext, string $operationName) + private function getSubresource(string $rootResolvedClass, array $rootResolvedFields, string $rootProperty, string $subresourceClass, array $normalizationContext, string $operationName) { $resolvedIdentifiers = []; $rootIdentifiers = array_keys($rootResolvedFields); foreach ($rootIdentifiers as $rootIdentifier) { - $resolvedIdentifiers[] = [$rootIdentifier, $rootClass]; + $resolvedIdentifiers[] = [$rootIdentifier, $rootResolvedClass]; } return $this->subresourceDataProvider->getSubresource($subresourceClass, $rootResolvedFields, $normalizationContext + [ diff --git a/tests/Fixtures/TestBundle/DataPersister/DummyDtoNoOutputDataPersister.php b/tests/Fixtures/TestBundle/DataPersister/DummyDtoNoOutputDataPersister.php index 8cef78df2a2..7c19abc1917 100644 --- a/tests/Fixtures/TestBundle/DataPersister/DummyDtoNoOutputDataPersister.php +++ b/tests/Fixtures/TestBundle/DataPersister/DummyDtoNoOutputDataPersister.php @@ -15,6 +15,7 @@ use ApiPlatform\Core\DataPersister\DataPersisterInterface; use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\DummyDtoNoOutput as DummyDtoNoOutputDocument; +use ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\Document\InputDto as InputDtoDocument; use ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\InputDto; use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\DummyDtoNoOutput; use Doctrine\Common\Persistence\ManagerRegistry; @@ -33,7 +34,7 @@ public function __construct(ManagerRegistry $registry) */ public function supports($data): bool { - return $data instanceof InputDto; + return $data instanceof InputDto || $data instanceof InputDtoDocument; } /** diff --git a/tests/Fixtures/TestBundle/DataProvider/DummyDtoNoInputCollectionDataProvider.php b/tests/Fixtures/TestBundle/DataProvider/DummyDtoNoInputCollectionDataProvider.php index 85d4e46327a..b426101e8b6 100644 --- a/tests/Fixtures/TestBundle/DataProvider/DummyDtoNoInputCollectionDataProvider.php +++ b/tests/Fixtures/TestBundle/DataProvider/DummyDtoNoInputCollectionDataProvider.php @@ -17,6 +17,7 @@ use ApiPlatform\Core\DataProvider\ContextAwareCollectionDataProviderInterface; use ApiPlatform\Core\DataProvider\RestrictedDataProviderInterface; use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\DummyDtoNoInput as DummyDtoNoInputDocument; +use ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\Document\OutputDto as OutputDtoDocument; use ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\OutputDto; use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\DummyDtoNoInput; use Doctrine\Common\Persistence\ManagerRegistry; @@ -50,7 +51,7 @@ public function getCollection(string $resourceClass, string $operationName = nul $dummyDtos = $this->registry->getManagerForClass($resourceClass)->getRepository($resourceClass)->findAll(); $objects = []; foreach ($dummyDtos as $dummyDto) { - $object = new OutputDto(); + $object = DummyDtoNoInput::class === $resourceClass ? new OutputDto() : new OutputDtoDocument(); $object->bat = $dummyDto->lorem; $object->baz = $dummyDto->ipsum; $objects[] = $object; diff --git a/tests/Fixtures/TestBundle/DataProvider/SerializableItemDataProvider.php b/tests/Fixtures/TestBundle/DataProvider/SerializableItemDataProvider.php index 8e677953500..6b5e8b8823a 100644 --- a/tests/Fixtures/TestBundle/DataProvider/SerializableItemDataProvider.php +++ b/tests/Fixtures/TestBundle/DataProvider/SerializableItemDataProvider.php @@ -17,8 +17,7 @@ use ApiPlatform\Core\DataProvider\RestrictedDataProviderInterface; use ApiPlatform\Core\DataProvider\SerializerAwareDataProviderInterface; use ApiPlatform\Core\DataProvider\SerializerAwareDataProviderTrait; -use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\SerializableResource as SerializableResourceDocument; -use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\SerializableResource; +use ApiPlatform\Core\Tests\Fixtures\TestBundle\Model\SerializableResource; /** * @author Vincent Chalamon @@ -47,6 +46,6 @@ public function getItem(string $resourceClass, $id, string $operationName = null */ public function supports(string $resourceClass, string $operationName = null, array $context = []): bool { - return \in_array($resourceClass, [SerializableResource::class, SerializableResourceDocument::class], true); + return SerializableResource::class === $resourceClass; } } diff --git a/tests/Fixtures/TestBundle/DataTransformer/DummyDtoNoInputToOutputDtoDataTransformer.php b/tests/Fixtures/TestBundle/DataTransformer/DummyDtoNoInputToOutputDtoDataTransformer.php index 8f70d5b519b..aa35c9c9eba 100644 --- a/tests/Fixtures/TestBundle/DataTransformer/DummyDtoNoInputToOutputDtoDataTransformer.php +++ b/tests/Fixtures/TestBundle/DataTransformer/DummyDtoNoInputToOutputDtoDataTransformer.php @@ -15,6 +15,7 @@ use ApiPlatform\Core\DataTransformer\DataTransformerInterface; use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\DummyDtoNoInput as DummyDtoNoInputDocument; +use ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\Document\OutputDto as OutputDtoDocument; use ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\OutputDto; use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\DummyDtoNoInput; @@ -29,7 +30,7 @@ public function transform($object, string $to, array $context = []) throw new \InvalidArgumentException(); } - $output = new OutputDto(); + $output = $object instanceof DummyDtoNoInput ? new OutputDto() : new OutputDtoDocument(); $output->id = $object->getId(); $output->bat = (string) $object->lorem; $output->baz = (float) $object->ipsum; @@ -42,6 +43,6 @@ public function transform($object, string $to, array $context = []) */ public function supportsTransformation($data, string $to, array $context = []): bool { - return ($data instanceof DummyDtoNoInput || $data instanceof DummyDtoNoInputDocument) && OutputDto::class === $to; + return ($data instanceof DummyDtoNoInput || $data instanceof DummyDtoNoInputDocument) && \in_array($to, [OutputDto::class, OutputDtoDocument::class], true); } } diff --git a/tests/Fixtures/TestBundle/DataTransformer/InputDtoDataTransformer.php b/tests/Fixtures/TestBundle/DataTransformer/InputDtoDataTransformer.php index 454fc45631a..ce0afcb8837 100644 --- a/tests/Fixtures/TestBundle/DataTransformer/InputDtoDataTransformer.php +++ b/tests/Fixtures/TestBundle/DataTransformer/InputDtoDataTransformer.php @@ -16,6 +16,7 @@ use ApiPlatform\Core\DataTransformer\DataTransformerInterface; use ApiPlatform\Core\Serializer\AbstractItemNormalizer; use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\DummyDtoInputOutput as DummyDtoInputOutputDocument; +use ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\Document\InputDto as InputDtoDocument; use ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\InputDto; use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\DummyDtoInputOutput; @@ -27,16 +28,17 @@ final class InputDtoDataTransformer implements DataTransformerInterface public function transform($object, string $to, array $context = []) { /** - * @var \ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\InputDto + * @var InputDtoDocument|InputDto */ $data = $object; /** - * @var \ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\DummyDtoInputOutput + * @var DummyDtoInputOutputDocument|DummyDtoInputOutput */ $resourceObject = $context[AbstractItemNormalizer::OBJECT_TO_POPULATE] ?? new $context['resource_class'](); $resourceObject->str = $data->foo; $resourceObject->num = $data->bar; + $resourceObject->relatedDummies = $data->relatedDummies; return $resourceObject; } @@ -50,6 +52,6 @@ public function supportsTransformation($object, string $to, array $context = []) return false; } - return (DummyDtoInputOutput::class === $to || DummyDtoInputOutputDocument::class === $to) && (InputDto::class === $context['input']['class']); + return \in_array($to, [DummyDtoInputOutput::class, DummyDtoInputOutputDocument::class], true) && \in_array($context['input']['class'], [InputDto::class, InputDtoDocument::class], true); } } diff --git a/tests/Fixtures/TestBundle/DataTransformer/OutputDtoDataTransformer.php b/tests/Fixtures/TestBundle/DataTransformer/OutputDtoDataTransformer.php index 6ff8ebaff0a..d4c12727a29 100644 --- a/tests/Fixtures/TestBundle/DataTransformer/OutputDtoDataTransformer.php +++ b/tests/Fixtures/TestBundle/DataTransformer/OutputDtoDataTransformer.php @@ -13,8 +13,10 @@ namespace ApiPlatform\Core\Tests\Fixtures\TestBundle\DataTransformer; +use ApiPlatform\Core\DataProvider\ArrayPaginator; use ApiPlatform\Core\DataTransformer\DataTransformerInterface; use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\DummyDtoInputOutput as DummyDtoInputOutputDocument; +use ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\Document\OutputDto as OutputDtoDocument; use ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\OutputDto; use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\DummyDtoInputOutput; @@ -29,10 +31,11 @@ public function transform($object, string $to, array $context = []) throw new \InvalidArgumentException(); } - $output = new OutputDto(); + $output = $object instanceof DummyDtoInputOutput ? new OutputDto() : new OutputDtoDocument(); $output->id = $object->id; $output->bat = (string) $object->str; $output->baz = (float) $object->num; + $output->relatedDummies = new ArrayPaginator($object->relatedDummies->toArray(), 0, count($object->relatedDummies->toArray())); return $output; } @@ -42,6 +45,6 @@ public function transform($object, string $to, array $context = []) */ public function supportsTransformation($data, string $to, array $context = []): bool { - return ($data instanceof DummyDtoInputOutput || $data instanceof DummyDtoInputOutputDocument) && OutputDto::class === $to; + return ($data instanceof DummyDtoInputOutput || $data instanceof DummyDtoInputOutputDocument) && \in_array($to, [OutputDto::class, OutputDtoDocument::class], true); } } diff --git a/tests/Fixtures/TestBundle/Document/DummyDtoInputOutput.php b/tests/Fixtures/TestBundle/Document/DummyDtoInputOutput.php index a7805171051..6af7804f41e 100644 --- a/tests/Fixtures/TestBundle/Document/DummyDtoInputOutput.php +++ b/tests/Fixtures/TestBundle/Document/DummyDtoInputOutput.php @@ -14,8 +14,10 @@ namespace ApiPlatform\Core\Tests\Fixtures\TestBundle\Document; use ApiPlatform\Core\Annotation\ApiResource; -use ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\InputDto; -use ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\OutputDto; +use ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\Document\InputDto; +use ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\Document\OutputDto; +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\Common\Collections\Collection; use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM; /** @@ -28,6 +30,11 @@ */ class DummyDtoInputOutput { + public function __construct() + { + $this->relatedDummies = new ArrayCollection(); + } + /** * @var int The id * @ODM\Id(strategy="INCREMENT", type="integer", nullable=true) @@ -45,4 +52,10 @@ class DummyDtoInputOutput * @ODM\Field(type="float") */ public $num; + + /** + * @var Collection + * @ODM\ReferenceMany(targetDocument=RelatedDummy::class, storeAs="id", nullable=true) + */ + public $relatedDummies; } diff --git a/tests/Fixtures/TestBundle/Document/DummyDtoNoInput.php b/tests/Fixtures/TestBundle/Document/DummyDtoNoInput.php index ccdf40e7e71..9a475f56575 100644 --- a/tests/Fixtures/TestBundle/Document/DummyDtoNoInput.php +++ b/tests/Fixtures/TestBundle/Document/DummyDtoNoInput.php @@ -16,7 +16,7 @@ use ApiPlatform\Core\Annotation\ApiResource; use ApiPlatform\Core\Tests\Fixtures\TestBundle\Controller\DummyDtoNoInput\CreateItemAction; use ApiPlatform\Core\Tests\Fixtures\TestBundle\Controller\DummyDtoNoInput\DoubleBatAction; -use ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\OutputDto; +use ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\Document\OutputDto; use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM; /** diff --git a/tests/Fixtures/TestBundle/Document/SerializableResource.php b/tests/Fixtures/TestBundle/Dto/Document/InputDto.php similarity index 51% rename from tests/Fixtures/TestBundle/Document/SerializableResource.php rename to tests/Fixtures/TestBundle/Dto/Document/InputDto.php index 2d00ba18fed..4fa680504cc 100644 --- a/tests/Fixtures/TestBundle/Document/SerializableResource.php +++ b/tests/Fixtures/TestBundle/Dto/Document/InputDto.php @@ -11,34 +11,27 @@ declare(strict_types=1); -namespace ApiPlatform\Core\Tests\Fixtures\TestBundle\Document; +namespace ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\Document; -use ApiPlatform\Core\Annotation\ApiProperty; -use ApiPlatform\Core\Annotation\ApiResource; +use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\RelatedDummy as DocumentRelatedDummy; /** - * Resource linked to an external API. - * - * @ApiResource - * - * @author Vincent Chalamon + * @author Kévin Dunglas */ -class SerializableResource +class InputDto { - /** - * @var int - * - * @ApiProperty(identifier=true) - */ - public $id; - /** * @var string */ public $foo; /** - * @var string + * @var int */ public $bar; + + /** + * @var DocumentRelatedDummy[] + */ + public $relatedDummies; } diff --git a/tests/Fixtures/TestBundle/Dto/Document/OutputDto.php b/tests/Fixtures/TestBundle/Dto/Document/OutputDto.php new file mode 100644 index 00000000000..9e8d3e22258 --- /dev/null +++ b/tests/Fixtures/TestBundle/Dto/Document/OutputDto.php @@ -0,0 +1,42 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\Document; + +use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\RelatedDummy as DocumentRelatedDummy; + +/** + * @author Kévin Dunglas + */ +class OutputDto +{ + /** + * @var int + */ + public $id; + + /** + * @var float + */ + public $baz; + + /** + * @var string + */ + public $bat; + + /** + * @var DocumentRelatedDummy[] + */ + public $relatedDummies = []; +} diff --git a/tests/Fixtures/TestBundle/Dto/InputDto.php b/tests/Fixtures/TestBundle/Dto/InputDto.php index 6ab35beebb0..489ff39b48a 100644 --- a/tests/Fixtures/TestBundle/Dto/InputDto.php +++ b/tests/Fixtures/TestBundle/Dto/InputDto.php @@ -13,6 +13,8 @@ namespace ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto; +use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\RelatedDummy; + /** * @author Kévin Dunglas */ @@ -27,4 +29,9 @@ class InputDto * @var int */ public $bar; + + /** + * @var RelatedDummy[] + */ + public $relatedDummies; } diff --git a/tests/Fixtures/TestBundle/Dto/OutputDto.php b/tests/Fixtures/TestBundle/Dto/OutputDto.php index 46c67caf048..0dd4cf5fe8e 100644 --- a/tests/Fixtures/TestBundle/Dto/OutputDto.php +++ b/tests/Fixtures/TestBundle/Dto/OutputDto.php @@ -13,9 +13,9 @@ namespace ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto; +use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\RelatedDummy; + /** - * OutputDto. - * * @author Kévin Dunglas */ class OutputDto @@ -34,4 +34,9 @@ class OutputDto * @var string */ public $bat; + + /** + * @var RelatedDummy[] + */ + public $relatedDummies = []; } diff --git a/tests/Fixtures/TestBundle/Entity/DummyDtoInputOutput.php b/tests/Fixtures/TestBundle/Entity/DummyDtoInputOutput.php index 9f42ba8e157..60e6a6fe634 100644 --- a/tests/Fixtures/TestBundle/Entity/DummyDtoInputOutput.php +++ b/tests/Fixtures/TestBundle/Entity/DummyDtoInputOutput.php @@ -16,6 +16,8 @@ use ApiPlatform\Core\Annotation\ApiResource; use ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\InputDto; use ApiPlatform\Core\Tests\Fixtures\TestBundle\Dto\OutputDto; +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\Common\Collections\Collection; use Doctrine\ORM\Mapping as ORM; /** @@ -28,6 +30,11 @@ */ class DummyDtoInputOutput { + public function __construct() + { + $this->relatedDummies = new ArrayCollection(); + } + /** * @var int The id * @ORM\Column(type="integer") @@ -47,4 +54,10 @@ class DummyDtoInputOutput * @ORM\Column(type="float") */ public $num; + + /** + * @var Collection + * @ORM\ManyToMany(targetEntity="RelatedDummy") + */ + public $relatedDummies; } diff --git a/tests/Fixtures/TestBundle/Entity/SerializableResource.php b/tests/Fixtures/TestBundle/Model/SerializableResource.php similarity index 92% rename from tests/Fixtures/TestBundle/Entity/SerializableResource.php rename to tests/Fixtures/TestBundle/Model/SerializableResource.php index 619e42b505b..60615c6b2ef 100644 --- a/tests/Fixtures/TestBundle/Entity/SerializableResource.php +++ b/tests/Fixtures/TestBundle/Model/SerializableResource.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity; +namespace ApiPlatform\Core\Tests\Fixtures\TestBundle\Model; use ApiPlatform\Core\Annotation\ApiProperty; use ApiPlatform\Core\Annotation\ApiResource; diff --git a/tests/Fixtures/TestBundle/Serializer/Denormalizer/SerializableResourceDenormalizer.php b/tests/Fixtures/TestBundle/Serializer/Denormalizer/SerializableResourceDenormalizer.php index 9ce4a185ad1..9d2e8f52df1 100644 --- a/tests/Fixtures/TestBundle/Serializer/Denormalizer/SerializableResourceDenormalizer.php +++ b/tests/Fixtures/TestBundle/Serializer/Denormalizer/SerializableResourceDenormalizer.php @@ -13,8 +13,7 @@ namespace ApiPlatform\Core\Tests\Fixtures\TestBundle\Serializer\Denormalizer; -use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\SerializableResource as SerializableResourceDocument; -use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\SerializableResource; +use ApiPlatform\Core\Tests\Fixtures\TestBundle\Model\SerializableResource; use Symfony\Component\Serializer\Normalizer\DenormalizerInterface; /** @@ -40,6 +39,6 @@ public function denormalize($data, $class, $format = null, array $context = []) */ public function supportsDenormalization($data, $type, $format = null) { - return 'json' === $format && \in_array($type, [SerializableResource::class, SerializableResourceDocument::class], true) && \is_array($data); + return 'json' === $format && SerializableResource::class === $type && \is_array($data); } } diff --git a/tests/GraphQl/Resolver/Stage/ReadStageTest.php b/tests/GraphQl/Resolver/Stage/ReadStageTest.php index d63e39e2fbd..ec322a610b1 100644 --- a/tests/GraphQl/Resolver/Stage/ReadStageTest.php +++ b/tests/GraphQl/Resolver/Stage/ReadStageTest.php @@ -204,7 +204,7 @@ public function testApplyCollection(array $args, ?string $rootClass, ?array $sou $this->subresourceDataProviderProphecy->getSubresource($resourceClass, ['id' => 3], $normalizationContext + ['filters' => $expectedFilters, 'property' => $fieldName, 'identifiers' => [['id', $resourceClass]], 'collection' => true], $operationName)->willReturn(['subresource']); - $this->collectionDataProviderProphecy->getCollection($resourceClass, $operationName, $normalizationContext + ['filters' => $expectedFilters])->willReturn($expectedResult); + $this->collectionDataProviderProphecy->getCollection($resourceClass, $operationName, $normalizationContext + ['filters' => $expectedFilters])->willReturn([]); $result = ($this->readStage)($resourceClass, $rootClass, $operationName, $context); @@ -225,7 +225,7 @@ public function collectionProvider(): array 'with subresource' => [ [], 'myResource', - ['subresource' => [], ItemNormalizer::ITEM_IDENTIFIERS_KEY => ['id' => 3]], + ['subresource' => [], ItemNormalizer::ITEM_IDENTIFIERS_KEY => ['id' => 3], ItemNormalizer::ITEM_RESOURCE_CLASS_KEY => 'myResource'], [], ['subresource'], ],