From 94c9f478ed19f1814559d03ec16cae68100b7af5 Mon Sep 17 00:00:00 2001 From: Oliver Kossin Date: Wed, 19 Aug 2020 09:45:28 +0200 Subject: [PATCH] Add "contact_selection" Content Type Resolver (#44) --- .../ContactSelectionResolver.php | 63 +++++ Resources/config/content-type-resolvers.xml | 11 + .../ContactSelectionResolverTest.php | 228 ++++++++++++++++++ 3 files changed, 302 insertions(+) create mode 100644 Content/ContentTypeResolver/ContactSelectionResolver.php create mode 100644 Tests/Unit/Content/ContentTypeResolver/ContactSelectionResolverTest.php diff --git a/Content/ContentTypeResolver/ContactSelectionResolver.php b/Content/ContentTypeResolver/ContactSelectionResolver.php new file mode 100644 index 0000000..4fc4e37 --- /dev/null +++ b/Content/ContentTypeResolver/ContactSelectionResolver.php @@ -0,0 +1,63 @@ +contactManager = $contactManager; + $this->contactSerializer = $contactSerializer; + } + + public function resolve($data, PropertyInterface $property, string $locale, array $attributes = []): ContentView + { + if (null === $data) { + return new ContentView(null); + } + + $content = []; + foreach ($this->contactManager->getByIds($data, $locale) as $contact) { + $serializationContext = new SerializationContext(); + $serializationContext->setGroups(['partialContact']); + + $content[] = $this->contactSerializer->serialize($contact->getEntity(), $locale, $serializationContext); + } + + return new ContentView($content, $data ?: []); + } +} diff --git a/Resources/config/content-type-resolvers.xml b/Resources/config/content-type-resolvers.xml index cffc866..41d4db1 100644 --- a/Resources/config/content-type-resolvers.xml +++ b/Resources/config/content-type-resolvers.xml @@ -49,6 +49,17 @@ + + + + + + + contactManager = $this->prophesize(ContactManager::class); + $this->contactSerializer = $this->prophesize(ContactSerializerInterface::class); + + $this->contactSelectionResolver = new ContactSelectionResolver( + $this->contactManager->reveal(), + $this->contactSerializer->reveal() + ); + } + + public function testGetContentType(): void + { + self::assertSame('contact_selection', $this->contactSelectionResolver::getContentType()); + } + + public function testResolveWithOneContact(): void + { + $locale = 'en'; + + $contact = $this->prophesize(ContactInterface::class); + $apiContact = $this->prophesize(Contact::class); + $apiContact->getEntity()->willReturn($contact->reveal()); + + $data = [2]; + + $this->contactManager->getByIds($data, $locale)->willReturn([$apiContact->reveal()]); + $this->contactSerializer->serialize($contact, $locale, Argument::type(SerializationContext::class))->willReturn( + [ + 'id' => 2, + 'firstName' => 'John', + 'lastName' => 'Doe', + 'fullName' => 'John Doe', + 'title' => 'fancyTitle', + 'position' => 'CEO', + 'avatar' => [ + 'id' => 2, + 'formatUri' => '/media/2/{format}/media-2.jpg?v=1-0', + ], + ] + ); + + $property = $this->prophesize(PropertyInterface::class); + $result = $this->contactSelectionResolver->resolve($data, $property->reveal(), $locale); + + $this->assertInstanceOf(ContentView::class, $result); + $this->assertSame( + [ + [ + 'id' => 2, + 'firstName' => 'John', + 'lastName' => 'Doe', + 'fullName' => 'John Doe', + 'title' => 'fancyTitle', + 'position' => 'CEO', + 'avatar' => [ + 'id' => 2, + 'formatUri' => '/media/2/{format}/media-2.jpg?v=1-0', + ], + ], + ], + $result->getContent() + ); + + $this->assertSame( + [2], + $result->getView() + ); + } + + public function testResolveWithManyContacts(): void + { + $locale = 'en'; + + $contact = $this->prophesize(ContactInterface::class); + $apiContact = $this->prophesize(Contact::class); + $apiContact->getEntity()->willReturn($contact->reveal()); + + $data = [2, 3, 4]; + + $this->contactManager->getByIds($data, $locale)->willReturn([$apiContact->reveal(), $apiContact->reveal(), $apiContact->reveal()]); + $this->contactSerializer->serialize($contact, $locale, Argument::type(SerializationContext::class))->willReturn( + [ + 'id' => 2, + 'firstName' => 'John', + 'lastName' => 'Doe', + 'fullName' => 'John Doe', + 'title' => 'fancyTitle', + 'position' => 'CEO', + 'avatar' => [ + 'id' => 2, + 'formatUri' => '/media/2/{format}/media-2.jpg?v=1-0', + ], + ], + [ + 'id' => 3, + 'firstName' => 'Max', + 'lastName' => 'Mustermann', + 'fullName' => 'Max Mustermann', + 'title' => 'fancyTitle', + 'position' => 'CTO', + 'avatar' => [ + 'id' => 3, + 'formatUri' => '/media/3/{format}/media-3.jpg?v=1-0', + ], + ], + [ + 'id' => 4, + 'firstName' => 'Diana', + 'lastName' => 'Doe', + 'fullName' => 'Diana Doe', + 'title' => 'fancyTitle', + 'position' => 'CFO', + 'avatar' => [ + 'id' => 4, + 'formatUri' => '/media/4/{format}/media-2.jpg?v=1-0', + ], + ] + ); + + $property = $this->prophesize(PropertyInterface::class); + $result = $this->contactSelectionResolver->resolve($data, $property->reveal(), $locale); + + $this->assertInstanceOf(ContentView::class, $result); + $this->assertSame( + [ + [ + 'id' => 2, + 'firstName' => 'John', + 'lastName' => 'Doe', + 'fullName' => 'John Doe', + 'title' => 'fancyTitle', + 'position' => 'CEO', + 'avatar' => [ + 'id' => 2, + 'formatUri' => '/media/2/{format}/media-2.jpg?v=1-0', + ], + ], + [ + 'id' => 3, + 'firstName' => 'Max', + 'lastName' => 'Mustermann', + 'fullName' => 'Max Mustermann', + 'title' => 'fancyTitle', + 'position' => 'CTO', + 'avatar' => [ + 'id' => 3, + 'formatUri' => '/media/3/{format}/media-3.jpg?v=1-0', + ], + ], + [ + 'id' => 4, + 'firstName' => 'Diana', + 'lastName' => 'Doe', + 'fullName' => 'Diana Doe', + 'title' => 'fancyTitle', + 'position' => 'CFO', + 'avatar' => [ + 'id' => 4, + 'formatUri' => '/media/4/{format}/media-2.jpg?v=1-0', + ], + ], + ], + $result->getContent() + ); + + $this->assertSame( + [2, 3, 4], + $result->getView() + ); + } + + public function testResolveDataIsNull(): void + { + $locale = 'en'; + $property = $this->prophesize(PropertyInterface::class); + + $result = $this->contactSelectionResolver->resolve(null, $property->reveal(), $locale); + + $this->assertNull($result->getContent()); + + $this->assertSame([], $result->getView()); + } +}