From 968065816467226a5a09445f47759c7628b041b5 Mon Sep 17 00:00:00 2001 From: Kayue Yeung Date: Tue, 2 Feb 2021 19:03:58 +0800 Subject: [PATCH 1/4] Update resource metadata if new config is given If a resource is being defined twice, allow the later one to override the previous one. --- .../Factory/ExtractorResourceMetadataFactory.php | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/Metadata/Resource/Factory/ExtractorResourceMetadataFactory.php b/src/Metadata/Resource/Factory/ExtractorResourceMetadataFactory.php index 456fb9e5cc7..e72e42eefe1 100644 --- a/src/Metadata/Resource/Factory/ExtractorResourceMetadataFactory.php +++ b/src/Metadata/Resource/Factory/ExtractorResourceMetadataFactory.php @@ -87,16 +87,23 @@ private function handleNotFound(?ResourceMetadata $parentPropertyMetadata, strin } /** - * Creates a new instance of metadata if the property is not already set. + * Update resource metadata if new config is given */ private function update(ResourceMetadata $resourceMetadata, array $metadata): ResourceMetadata { foreach (['shortName', 'description', 'iri', 'itemOperations', 'collectionOperations', 'subresourceOperations', 'graphql', 'attributes'] as $property) { - if (null === $metadata[$property] || null !== $resourceMetadata->{'get'.ucfirst($property)}()) { + $propertyData = $metadata[$property]; + $parentPropertyData = $resourceMetadata->{'get'.ucfirst($property)}(); + + if (null === $propertyData) { continue; } - $resourceMetadata = $resourceMetadata->{'with'.ucfirst($property)}($metadata[$property]); + if (is_array($parentPropertyData) && is_array($propertyData)) { + $propertyData = array_merge($parentPropertyData, $propertyData); + } + + $resourceMetadata = $resourceMetadata->{'with'.ucfirst($property)}($propertyData); } return $resourceMetadata; From 2833de00df518944b5b30692a073f8626d4720d3 Mon Sep 17 00:00:00 2001 From: Kayue Yeung Date: Sun, 14 Feb 2021 14:29:38 +0800 Subject: [PATCH 2/4] Make the test fixture a bit more complicated for future test --- tests/Fixtures/FileConfigurations/resources.xml | 1 + tests/Fixtures/FileConfigurations/resources.yml | 1 + tests/Fixtures/FileConfigurations/single_resource.yml | 1 + .../Factory/FileConfigurationMetadataFactoryProvider.php | 2 +- 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/Fixtures/FileConfigurations/resources.xml b/tests/Fixtures/FileConfigurations/resources.xml index f12ed385eaa..872e6d4aae7 100644 --- a/tests/Fixtures/FileConfigurations/resources.xml +++ b/tests/Fixtures/FileConfigurations/resources.xml @@ -23,6 +23,7 @@ POST the/collection/path + 201 diff --git a/tests/Fixtures/FileConfigurations/resources.yml b/tests/Fixtures/FileConfigurations/resources.yml index b20ab46e982..514c760b6e0 100644 --- a/tests/Fixtures/FileConfigurations/resources.yml +++ b/tests/Fixtures/FileConfigurations/resources.yml @@ -12,6 +12,7 @@ resources: my_collection_op: method: 'POST' path: 'the/collection/path' + status: '201' subresourceOperations: my_collection_subresource: path: 'the/subresource/path' diff --git a/tests/Fixtures/FileConfigurations/single_resource.yml b/tests/Fixtures/FileConfigurations/single_resource.yml index c7c22563313..46bd3b184fc 100644 --- a/tests/Fixtures/FileConfigurations/single_resource.yml +++ b/tests/Fixtures/FileConfigurations/single_resource.yml @@ -10,6 +10,7 @@ my_collection_op: method: 'POST' path: 'the/collection/path' + status: '201' subresourceOperations: my_collection_subresource: path: 'the/subresource/path' diff --git a/tests/Metadata/Resource/Factory/FileConfigurationMetadataFactoryProvider.php b/tests/Metadata/Resource/Factory/FileConfigurationMetadataFactoryProvider.php index 39c81511c39..e515f83e3f6 100644 --- a/tests/Metadata/Resource/Factory/FileConfigurationMetadataFactoryProvider.php +++ b/tests/Metadata/Resource/Factory/FileConfigurationMetadataFactoryProvider.php @@ -36,7 +36,7 @@ public function resourceMetadataProvider() 'my_other_op_name' => ['method' => 'POST'], ], 'collectionOperations' => [ - 'my_collection_op' => ['method' => 'POST', 'path' => 'the/collection/path'], + 'my_collection_op' => ['method' => 'POST', 'path' => 'the/collection/path', 'status' => '201'], ], 'subresourceOperations' => [ 'my_collection_subresource' => ['path' => 'the/subresource/path'], From 28676e211c466e49527ee41a76247bf4c80239d3 Mon Sep 17 00:00:00 2001 From: Kayue Yeung Date: Sun, 14 Feb 2021 15:02:52 +0800 Subject: [PATCH 3/4] Add test case cover override parent resource --- .../FileConfigurations/resourcesoverride.xml | 21 ++++++++++++ .../FileConfigurations/resourcesoverride.yml | 11 ++++++ .../ExtractorResourceMetadataFactoryTest.php | 34 +++++++++++++++++++ ...leConfigurationMetadataFactoryProvider.php | 18 ++++++++++ 4 files changed, 84 insertions(+) create mode 100644 tests/Fixtures/FileConfigurations/resourcesoverride.xml create mode 100644 tests/Fixtures/FileConfigurations/resourcesoverride.yml diff --git a/tests/Fixtures/FileConfigurations/resourcesoverride.xml b/tests/Fixtures/FileConfigurations/resourcesoverride.xml new file mode 100644 index 00000000000..63554a2e64e --- /dev/null +++ b/tests/Fixtures/FileConfigurations/resourcesoverride.xml @@ -0,0 +1,21 @@ + + + + + + + GET + the/path + + + + + POST + 200 + + + + diff --git a/tests/Fixtures/FileConfigurations/resourcesoverride.yml b/tests/Fixtures/FileConfigurations/resourcesoverride.yml new file mode 100644 index 00000000000..36d021ab1d3 --- /dev/null +++ b/tests/Fixtures/FileConfigurations/resourcesoverride.yml @@ -0,0 +1,11 @@ +resources: + 'ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\FileConfigDummy': + description: New description + itemOperations: + my_op_name: + method: 'GET' + path: 'the/path' + collectionOperations: + my_collection_op: + method: 'POST' + status: '200' diff --git a/tests/Metadata/Resource/Factory/ExtractorResourceMetadataFactoryTest.php b/tests/Metadata/Resource/Factory/ExtractorResourceMetadataFactoryTest.php index 07f700a8d68..d2f20aeb9b4 100644 --- a/tests/Metadata/Resource/Factory/ExtractorResourceMetadataFactoryTest.php +++ b/tests/Metadata/Resource/Factory/ExtractorResourceMetadataFactoryTest.php @@ -163,6 +163,23 @@ public function testXmlExistingParentResourceMetadataFactory(ResourceMetadata $e $this->assertEquals($expectedResourceMetadata, $resourceMetadata); } + /** + * @dataProvider overrideOperationsResourceMetadataProvider + */ + public function testXmlOverrideExistingParentResourceMetadataFactory(ResourceMetadata $expectedResourceMetadata) + { + $configPath = __DIR__.'/../../../Fixtures/FileConfigurations/resourcesoverride.xml'; + + $decorated = $this->prophesize(ResourceMetadataFactoryInterface::class); + $decorated->create(FileConfigDummy::class)->willReturn($this->resourceMetadataProvider()[0][0])->shouldBeCalled(); + + $resourceMetadataFactory = new ExtractorResourceMetadataFactory(new XmlExtractor([$configPath]), $decorated->reveal()); + + $resourceMetadata = $resourceMetadataFactory->create(FileConfigDummy::class); + + $this->assertEquals($expectedResourceMetadata, $resourceMetadata); + } + /** * @dataProvider resourceMetadataProvider */ @@ -251,6 +268,23 @@ public function testYamlExistingParentResourceMetadataFactory(ResourceMetadata $ $this->assertEquals($expectedResourceMetadata, $resourceMetadata); } + /** + * @dataProvider overrideOperationsResourceMetadataProvider + */ + public function testYamlOverrideExistingParentResourceMetadataFactory(ResourceMetadata $expectedResourceMetadata) + { + $configPath = __DIR__.'/../../../Fixtures/FileConfigurations/resourcesoverride.yml'; + + $decorated = $this->prophesize(ResourceMetadataFactoryInterface::class); + $decorated->create(FileConfigDummy::class)->willReturn($this->resourceMetadataProvider()[0][0])->shouldBeCalled(); + + $resourceMetadataFactory = new ExtractorResourceMetadataFactory(new YamlExtractor([$configPath]), $decorated->reveal()); + + $resourceMetadata = $resourceMetadataFactory->create(FileConfigDummy::class); + + $this->assertEquals($expectedResourceMetadata, $resourceMetadata); + } + public function testCreateWithMalformedYaml() { $this->expectException(InvalidArgumentException::class); diff --git a/tests/Metadata/Resource/Factory/FileConfigurationMetadataFactoryProvider.php b/tests/Metadata/Resource/Factory/FileConfigurationMetadataFactoryProvider.php index e515f83e3f6..e96f93f1024 100644 --- a/tests/Metadata/Resource/Factory/FileConfigurationMetadataFactoryProvider.php +++ b/tests/Metadata/Resource/Factory/FileConfigurationMetadataFactoryProvider.php @@ -111,4 +111,22 @@ public function legacyOperationsResourceMetadataProvider() return [[$resourceMetadata]]; } + + public function overrideOperationsResourceMetadataProvider() + { + $resourceMetadata = $this->resourceMetadataProvider()[0][0]; + + $resourceMetadata = $resourceMetadata->withDescription('New description'); + + $resourceMetadata = $resourceMetadata->withItemOperations([ + 'my_op_name' => ['method' => 'GET', 'path' => 'the/path'], + 'my_other_op_name' => ['method' => 'POST'], + ]); + + $resourceMetadata = $resourceMetadata->withCollectionOperations([ + 'my_collection_op' => ['method' => 'POST', 'status' => '200'], + ]); + + return [[$resourceMetadata]]; + } } From b634a9921b9a81990273fc54fdeddd3f8edbc9d8 Mon Sep 17 00:00:00 2001 From: Kayue Yeung Date: Sun, 14 Feb 2021 15:08:34 +0800 Subject: [PATCH 4/4] Minor coding style fixes --- .../Factory/ExtractorResourceMetadataFactory.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Metadata/Resource/Factory/ExtractorResourceMetadataFactory.php b/src/Metadata/Resource/Factory/ExtractorResourceMetadataFactory.php index e72e42eefe1..aa267b8d7e0 100644 --- a/src/Metadata/Resource/Factory/ExtractorResourceMetadataFactory.php +++ b/src/Metadata/Resource/Factory/ExtractorResourceMetadataFactory.php @@ -87,23 +87,23 @@ private function handleNotFound(?ResourceMetadata $parentPropertyMetadata, strin } /** - * Update resource metadata if new config is given + * Update resource metadata if new config is given. */ private function update(ResourceMetadata $resourceMetadata, array $metadata): ResourceMetadata { foreach (['shortName', 'description', 'iri', 'itemOperations', 'collectionOperations', 'subresourceOperations', 'graphql', 'attributes'] as $property) { - $propertyData = $metadata[$property]; - $parentPropertyData = $resourceMetadata->{'get'.ucfirst($property)}(); + $propertyMetadata = $metadata[$property]; + $parentPropertyMetadata = $resourceMetadata->{'get'.ucfirst($property)}(); - if (null === $propertyData) { + if (null === $propertyMetadata) { continue; } - if (is_array($parentPropertyData) && is_array($propertyData)) { - $propertyData = array_merge($parentPropertyData, $propertyData); + if (\is_array($parentPropertyMetadata) && \is_array($propertyMetadata)) { + $propertyMetadata = array_merge($parentPropertyMetadata, $propertyMetadata); } - $resourceMetadata = $resourceMetadata->{'with'.ucfirst($property)}($propertyData); + $resourceMetadata = $resourceMetadata->{'with'.ucfirst($property)}($propertyMetadata); } return $resourceMetadata;