From 3916ddf56940177050b423169ac58d95586893cd Mon Sep 17 00:00:00 2001 From: Jonas Date: Mon, 22 Aug 2022 16:33:12 +0200 Subject: [PATCH 01/15] Create CommandHandler for UpdateAddress --- .../Place/UpdateAddressRequestHandler.php | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 src/Http/Place/UpdateAddressRequestHandler.php diff --git a/src/Http/Place/UpdateAddressRequestHandler.php b/src/Http/Place/UpdateAddressRequestHandler.php new file mode 100644 index 0000000000..78195750b5 --- /dev/null +++ b/src/Http/Place/UpdateAddressRequestHandler.php @@ -0,0 +1,57 @@ +commandBus = $commandBus; + $this->placeDocumentRepository = $placeDocumentRepository; + } + + public function handle(ServerRequestInterface $request): ResponseInterface + { + $routeParameters = new RouteParameters($request); + $placeId = $routeParameters->getPlaceId(); + $language = $routeParameters->getLanguage(); + + $address = (new AddressJSONDeserializer())->deserialize( + new StringLiteral($request->getBody()->getContents()) + ); + + try { + $this->placeDocumentRepository->fetch($placeId); + } catch (DocumentDoesNotExist $e) { + throw new EntityNotFoundException( + sprintf('Place with id: %s not found.', $placeId) + ); + } + + $this->commandBus->dispatch( + new UpdateAddress($placeId, $address, Language::fromUdb3ModelLanguage($language)) + ); + + return new NoContentResponse(); + } +} From 120adce1345333b34261f135ee2531482adfa10e Mon Sep 17 00:00:00 2001 From: Jonas Date: Mon, 22 Aug 2022 16:34:54 +0200 Subject: [PATCH 02/15] make PlaceControllerProvider use CommandHandler for updateAddress --- app/Place/PlaceControllerProvider.php | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/app/Place/PlaceControllerProvider.php b/app/Place/PlaceControllerProvider.php index 15133367ca..8a4f668ad3 100644 --- a/app/Place/PlaceControllerProvider.php +++ b/app/Place/PlaceControllerProvider.php @@ -10,6 +10,7 @@ use CultuurNet\UDB3\Http\Import\RemoveEmptyArraysRequestBodyParser; use CultuurNet\UDB3\Http\Place\ImportPlaceRequestHandler; use CultuurNet\UDB3\Http\Place\LegacyPlaceRequestBodyParser; +use CultuurNet\UDB3\Http\Place\UpdateAddressRequestHandler; use CultuurNet\UDB3\Http\Place\UpdateMajorInfoRequestHandler; use CultuurNet\UDB3\Http\Place\EditPlaceRestController; use CultuurNet\UDB3\Http\Request\Body\CombinedRequestBodyParser; @@ -31,7 +32,7 @@ public function connect(Application $app): ControllerCollection $controllers->post('/', ImportPlaceRequestHandler::class); $controllers->put('/{placeId}', ImportPlaceRequestHandler::class); - $controllers->put('/{cdbid}/address/{lang}/', 'place_editing_controller:updateAddress'); + $controllers->put('/{placeId}/address/{language}/', UpdateAddressRequestHandler::class); $controllers->put('/{cdbid}/booking-info/', 'place_editing_controller:updateBookingInfo'); $controllers->put('/{cdbid}/contact-point/', 'place_editing_controller:updateContactPoint'); $controllers->put('/{placeId}/major-info/', UpdateMajorInfoRequestHandler::class); @@ -51,7 +52,7 @@ public function connect(Application $app): ControllerCollection $controllers->get('/{cdbid}/events/', 'place_editing_controller:getEvents'); $controllers->post('/{itemId}/images/main/', 'place_editing_controller:selectMainImage'); $controllers->post('/{itemId}/images/{mediaObjectId}/', 'place_editing_controller:updateImage'); - $controllers->post('/{cdbid}/address/{lang}/', 'place_editing_controller:updateAddress'); + $controllers->post('/{placeId}/address/{language}/', UpdateAddressRequestHandler::class); $controllers->post('/{cdbid}/typical-age-range/', 'place_editing_controller:updateTypicalAgeRange'); $controllers->post('/{placeId}/major-info/', UpdateMajorInfoRequestHandler::class); $controllers->post('/{cdbid}/booking-info/', 'place_editing_controller:updateBookingInfo'); @@ -73,6 +74,13 @@ function (Application $app) { } ); + $app[UpdateAddressRequestHandler::class] = $app->share( + fn (Application $app) => new UpdateAddressRequestHandler( + $app['event_command_bus'], + $app['place_jsonld_repository'] + ) + ); + $app[ImportPlaceRequestHandler::class] = $app->share( fn (Application $application) => new ImportPlaceRequestHandler( $app['place_repository'], From adda4d9a702528e3493c5418962d1b200131768a Mon Sep 17 00:00:00 2001 From: Jonas Date: Mon, 22 Aug 2022 16:37:20 +0200 Subject: [PATCH 03/15] remove updateAddress from PlaceEditingServiceInterface --- src/Place/PlaceEditingServiceInterface.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Place/PlaceEditingServiceInterface.php b/src/Place/PlaceEditingServiceInterface.php index 2b62260183..1e5ec84580 100644 --- a/src/Place/PlaceEditingServiceInterface.php +++ b/src/Place/PlaceEditingServiceInterface.php @@ -4,7 +4,6 @@ namespace CultuurNet\UDB3\Place; -use CultuurNet\UDB3\Address\Address; use CultuurNet\UDB3\ContactPoint; use CultuurNet\UDB3\Description; use CultuurNet\UDB3\Language; @@ -14,7 +13,6 @@ interface PlaceEditingServiceInterface { - public function updateAddress(string $id, Address $address, Language $language): void; public function updateDescription(string $id, Language $language, Description $description): void; public function updateTypicalAgeRange(string $id, AgeRange $ageRange): void; public function deleteTypicalAgeRange(string $id): void; From 6496617786b5cebcfb1e4bf964298d9411f55c0a Mon Sep 17 00:00:00 2001 From: Jonas Date: Mon, 22 Aug 2022 16:38:52 +0200 Subject: [PATCH 04/15] remove tests for DefaultPlaceEditingService --- .../Place/DefaultPlaceEditingServiceTest.php | 102 ------------------ 1 file changed, 102 deletions(-) delete mode 100644 tests/Place/DefaultPlaceEditingServiceTest.php diff --git a/tests/Place/DefaultPlaceEditingServiceTest.php b/tests/Place/DefaultPlaceEditingServiceTest.php deleted file mode 100644 index e58b2e5611..0000000000 --- a/tests/Place/DefaultPlaceEditingServiceTest.php +++ /dev/null @@ -1,102 +0,0 @@ -commandBus = $this->createMock(CommandBus::class); - - $this->uuidGenerator = $this->createMock( - UuidGeneratorInterface::class - ); - - $this->commandFactory = $this->createMock(OfferCommandFactoryInterface::class); - - $this->readRepository = $this->createMock(DocumentRepository::class); - - $organizerDocumentRepository = $this->createMock(DocumentRepository::class); - - $this->eventStore = new TraceableEventStore( - new InMemoryEventStore() - ); - - $this->readRepository->expects($this->any()) - ->method('fetch') - ->with('ad93103d-1395-4af7-a52a-2829d466c232') - ->willReturn(new JsonDocument('ad93103d-1395-4af7-a52a-2829d466c232')); - - $this->placeEditingService = new DefaultPlaceEditingService( - $this->commandBus, - $this->uuidGenerator, - $this->readRepository, - $organizerDocumentRepository, - $this->commandFactory - ); - } - - /** - * @test - */ - public function it_should_update_the_address_of_a_place_by_dispatching_a_relevant_command(): void - { - $id = 'ad93103d-1395-4af7-a52a-2829d466c232'; - $address = new Address( - new Street('Eenmeilaan 35'), - new PostalCode('3010'), - new Locality('Kessel-Lo'), - new CountryCode('BE') - ); - $language = new Language('nl'); - - $this->commandBus->expects($this->once()) - ->method('dispatch') - ->with(new UpdateAddress($id, $address, $language)); - - $this->placeEditingService->updateAddress($id, $address, $language); - } -} From b873a3f68170dbbaa53cc6a1b6e257b1d080e57f Mon Sep 17 00:00:00 2001 From: Jonas Date: Mon, 22 Aug 2022 16:39:27 +0200 Subject: [PATCH 05/15] remove DefaultPlaceEditingService --- src/Place/DefaultPlaceEditingService.php | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 src/Place/DefaultPlaceEditingService.php diff --git a/src/Place/DefaultPlaceEditingService.php b/src/Place/DefaultPlaceEditingService.php deleted file mode 100644 index 2435cadad4..0000000000 --- a/src/Place/DefaultPlaceEditingService.php +++ /dev/null @@ -1,22 +0,0 @@ -guardId($id); - - $this->commandBus->dispatch( - new UpdateAddress($id, $address, $language) - ); - } -} From 6df20d58b995cce3d208d81453626fb0ae530ce3 Mon Sep 17 00:00:00 2001 From: Jonas Date: Mon, 22 Aug 2022 16:40:39 +0200 Subject: [PATCH 06/15] remove usages of DefaultPlaceEditingService --- app/Place/PlaceEditingServiceProvider.php | 4 ++-- src/Place/PlaceOrganizerRelationService.php | 8 +++----- tests/Place/PlaceOrganizerRelationServiceTest.php | 6 ++++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/Place/PlaceEditingServiceProvider.php b/app/Place/PlaceEditingServiceProvider.php index 46a6be2bc9..4e21e6ed85 100644 --- a/app/Place/PlaceEditingServiceProvider.php +++ b/app/Place/PlaceEditingServiceProvider.php @@ -5,8 +5,8 @@ namespace CultuurNet\UDB3\Silex\Place; use Broadway\UuidGenerator\Rfc4122\Version4Generator; +use CultuurNet\UDB3\Offer\DefaultOfferEditingService; use CultuurNet\UDB3\Place\Commands\PlaceCommandFactory; -use CultuurNet\UDB3\Place\DefaultPlaceEditingService; use CultuurNet\UDB3\Place\PlaceOrganizerRelationService; use CultuurNet\UDB3\Place\ReadModel\Relations\PlaceRelationsRepository; use Silex\Application; @@ -21,7 +21,7 @@ public function register(Application $app) { $app['place_editing_service'] = $app->share( function ($app) { - return new DefaultPlaceEditingService( + return new DefaultOfferEditingService( $app['event_command_bus'], new Version4Generator(), $app['place_jsonld_repository'], diff --git a/src/Place/PlaceOrganizerRelationService.php b/src/Place/PlaceOrganizerRelationService.php index 9d9d6f022c..eadc1bc5ce 100644 --- a/src/Place/PlaceOrganizerRelationService.php +++ b/src/Place/PlaceOrganizerRelationService.php @@ -4,15 +4,13 @@ namespace CultuurNet\UDB3\Place; +use CultuurNet\UDB3\Offer\OfferEditingServiceInterface; use CultuurNet\UDB3\Organizer\OrganizerRelationServiceInterface; use CultuurNet\UDB3\Place\ReadModel\Relations\PlaceRelationsRepository; class PlaceOrganizerRelationService implements OrganizerRelationServiceInterface { - /** - * @var PlaceEditingServiceInterface - */ - private $editingService; + private OfferEditingServiceInterface $editingService; /** * @var PlaceRelationsRepository @@ -21,7 +19,7 @@ class PlaceOrganizerRelationService implements OrganizerRelationServiceInterface public function __construct( - PlaceEditingServiceInterface $editingService, + OfferEditingServiceInterface $editingService, PlaceRelationsRepository $relationsRepository ) { $this->editingService = $editingService; diff --git a/tests/Place/PlaceOrganizerRelationServiceTest.php b/tests/Place/PlaceOrganizerRelationServiceTest.php index a938585fc0..4b071c9d8a 100644 --- a/tests/Place/PlaceOrganizerRelationServiceTest.php +++ b/tests/Place/PlaceOrganizerRelationServiceTest.php @@ -4,6 +4,8 @@ namespace CultuurNet\UDB3\Place; +use CultuurNet\UDB3\Offer\DefaultOfferEditingService; +use CultuurNet\UDB3\Offer\OfferEditingServiceInterface; use CultuurNet\UDB3\Place\ReadModel\Relations\PlaceRelationsRepository; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; @@ -11,7 +13,7 @@ class PlaceOrganizerRelationServiceTest extends TestCase { /** - * @var PlaceEditingServiceInterface|MockObject + * @var OfferEditingServiceInterface|MockObject */ private $editService; @@ -27,7 +29,7 @@ class PlaceOrganizerRelationServiceTest extends TestCase public function setUp() { - $this->editService = $this->createMock(PlaceEditingServiceInterface::class); + $this->editService = $this->createMock(DefaultOfferEditingService::class); $this->relationRepository = $this->createMock(PlaceRelationsRepository::class); $this->organizerRelationService = new PlaceOrganizerRelationService( From da6d2a99e0d22bcf1b8fd1eca7c5bf6208beca8d Mon Sep 17 00:00:00 2001 From: Jonas Date: Mon, 22 Aug 2022 16:41:11 +0200 Subject: [PATCH 07/15] remove test for updateAddress in EditPlaceRestController --- .../Place/EditPlaceRestControllerTest.php | 142 ------------------ 1 file changed, 142 deletions(-) delete mode 100644 tests/Http/Place/EditPlaceRestControllerTest.php diff --git a/tests/Http/Place/EditPlaceRestControllerTest.php b/tests/Http/Place/EditPlaceRestControllerTest.php deleted file mode 100644 index 177bc4fcc9..0000000000 --- a/tests/Http/Place/EditPlaceRestControllerTest.php +++ /dev/null @@ -1,142 +0,0 @@ -placeEditingService = $this->createMock(PlaceEditingServiceInterface::class); - $this->relationsRepository = $this->createMock(EventRelationsRepository::class); - $this->mediaManager = $this->createMock(MediaManagerInterface::class); - $this->iriGenerator = $this->createMock(IriGeneratorInterface::class); - $this->consumerRepository = new InMemoryConsumerRepository(); - $this->shouldApprove = $this->createMock(ConsumerSpecification::class); - - $this->apiKey = new ApiKey('f5278146-3133-48b8-ace4-7e3f0a49328a'); - $this->consumer = $this->createMock(Consumer::class); - $this->consumerRepository->setConsumer($this->apiKey, $this->consumer); - - $this->shouldApprove->expects($this->any()) - ->method('satisfiedBy') - ->with($this->consumer) - ->willReturn(true); - - $this->placeRestController = new EditPlaceRestController( - $this->placeEditingService, - $this->relationsRepository, - $this->mediaManager - ); - - $this->iriGenerator - ->expects($this->any()) - ->method('iri') - ->willReturnCallback( - function ($placeId) { - return 'http://du.de/place/' . $placeId; - } - ); - } - - /** - * @test - */ - public function it_should_update_the_address_of_a_place_for_a_given_language() - { - $json = json_encode( - [ - 'streetAddress' => 'Eenmeilaan 35', - 'postalCode' => '3010', - 'addressLocality' => 'Kessel-Lo', - 'addressCountry' => 'BE', - ] - ); - - $request = new Request([], [], [], [], [], [], $json); - - $placeId = '6645274f-d969-4d70-865e-3ec799db9624'; - $lang = 'nl'; - - $this->placeEditingService->expects($this->once()) - ->method('updateAddress') - ->with( - $placeId, - new Address( - new Street('Eenmeilaan 35'), - new PostalCode('3010'), - new Locality('Kessel-Lo'), - new CountryCode('BE') - ), - new Language($lang) - ); - - $response = $this->placeRestController->updateAddress($request, $placeId, $lang); - - $this->assertEquals(204, $response->getStatusCode()); - } -} From 6400a1ed101bf1874a83471048cb6e8a92d6444c Mon Sep 17 00:00:00 2001 From: Jonas Date: Mon, 22 Aug 2022 16:41:38 +0200 Subject: [PATCH 08/15] remove updateAddress() & placeContext() from EditPlaceRestController --- src/Http/Place/EditPlaceRestController.php | 37 ---------------------- 1 file changed, 37 deletions(-) diff --git a/src/Http/Place/EditPlaceRestController.php b/src/Http/Place/EditPlaceRestController.php index b2833010b7..553bbd7ada 100644 --- a/src/Http/Place/EditPlaceRestController.php +++ b/src/Http/Place/EditPlaceRestController.php @@ -5,17 +5,10 @@ namespace CultuurNet\UDB3\Http\Place; use CultuurNet\UDB3\Event\ReadModel\Relations\EventRelationsRepository; -use CultuurNet\UDB3\Language; use CultuurNet\UDB3\Media\MediaManagerInterface; use CultuurNet\UDB3\Place\PlaceEditingServiceInterface; -use CultuurNet\UDB3\Http\Deserializer\Address\AddressJSONDeserializer; -use CultuurNet\UDB3\HttpFoundation\Response\NoContent; use CultuurNet\UDB3\Http\OfferRestBaseController; -use Symfony\Component\HttpFoundation\BinaryFileResponse; use Symfony\Component\HttpFoundation\JsonResponse; -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\Response; -use CultuurNet\UDB3\StringLiteral; class EditPlaceRestController extends OfferRestBaseController { @@ -26,11 +19,6 @@ class EditPlaceRestController extends OfferRestBaseController */ private $eventRelationsRepository; - /** - * @var AddressJSONDeserializer - */ - private $addressDeserializer; - /** * Constructs a RestController. * @@ -42,31 +30,6 @@ public function __construct( ) { parent::__construct($placeEditor, $mediaManager); $this->eventRelationsRepository = $eventRelationsRepository; - - - $this->addressDeserializer = new AddressJSONDeserializer(); - } - - public function placeContext(): BinaryFileResponse - { - $response = new BinaryFileResponse('/udb3/api/1.0/place.jsonld'); - $response->headers->set('Content-Type', 'application/ld+json'); - return $response; - } - - public function updateAddress(Request $request, string $cdbid, string $lang): Response - { - $address = $this->addressDeserializer->deserialize( - new StringLiteral($request->getContent()) - ); - - $this->editor->updateAddress( - $cdbid, - $address, - new Language($lang) - ); - - return new NoContent(); } public function getEvents(string $cdbid): JsonResponse From 0c0d20bc20e258f367676819f5a7618228d6347e Mon Sep 17 00:00:00 2001 From: Jonas Date: Mon, 22 Aug 2022 17:16:04 +0200 Subject: [PATCH 09/15] set tests for UpdateAddressRequestHandler --- .../Place/UpdateAddressRequestHandlerTest.php | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 tests/Http/Place/UpdateAddressRequestHandlerTest.php diff --git a/tests/Http/Place/UpdateAddressRequestHandlerTest.php b/tests/Http/Place/UpdateAddressRequestHandlerTest.php new file mode 100644 index 0000000000..072331374e --- /dev/null +++ b/tests/Http/Place/UpdateAddressRequestHandlerTest.php @@ -0,0 +1,92 @@ +commandBus = new TraceableCommandBus(); + + $this->placeDocumentRepository = new InMemoryDocumentRepository(); + + $this->placeDocumentRepository->save( + new JsonDocument(self::PLACE_ID, '{}') + ); + + $this->updateAddressRequestHandler = new UpdateAddressRequestHandler( + $this->commandBus, + $this->placeDocumentRepository + ); + + $this->psr7RequestBuilder = new Psr7RequestBuilder(); + + $this->commandBus->record(); + } + + /** + * @test + */ + public function it_handles_updating_the_address(): void + { + $updateAddressRequest = $this->psr7RequestBuilder + ->withRouteParameter('placeId', self::PLACE_ID) + ->withRouteParameter('language', 'nl') + ->withBodyFromString( + '{ + "streetAddress": "Veldstraat 11", + "postalCode": "9000", + "addressLocality": "Gent", + "addressCountry": "BE" + }' + ) + ->build('PUT'); + + $this->updateAddressRequestHandler->handle($updateAddressRequest); + + $this->assertEquals( + [ + new UpdateAddress( + self::PLACE_ID, + new Address( + new Street('Veldstraat 11'), + new PostalCode('9000'), + new Locality('Gent'), + new CountryCode('BE') + ), + new Language('nl') + ), + ], + $this->commandBus->getRecordedCommands() + ); + } +} From 69695a903d51ec179e8f993c75d431d64c6f5651 Mon Sep 17 00:00:00 2001 From: Jonas Date: Tue, 23 Aug 2022 09:28:54 +0200 Subject: [PATCH 10/15] Add tests for UpdateAddressRequestHandler --- .../Place/UpdateAddressRequestHandlerTest.php | 175 +++++++++++++++++- 1 file changed, 169 insertions(+), 6 deletions(-) diff --git a/tests/Http/Place/UpdateAddressRequestHandlerTest.php b/tests/Http/Place/UpdateAddressRequestHandlerTest.php index 072331374e..dc52dce1ed 100644 --- a/tests/Http/Place/UpdateAddressRequestHandlerTest.php +++ b/tests/Http/Place/UpdateAddressRequestHandlerTest.php @@ -14,9 +14,9 @@ use CultuurNet\UDB3\Language; use CultuurNet\UDB3\Model\ValueObject\Geography\CountryCode; use CultuurNet\UDB3\Place\Commands\UpdateAddress; -use CultuurNet\UDB3\ReadModel\DocumentRepository; use CultuurNet\UDB3\ReadModel\InMemoryDocumentRepository; use CultuurNet\UDB3\ReadModel\JsonDocument; +use InvalidArgumentException; use PHPUnit\Framework\TestCase; class UpdateAddressRequestHandlerTest extends TestCase @@ -29,23 +29,21 @@ class UpdateAddressRequestHandlerTest extends TestCase private UpdateAddressRequestHandler $updateAddressRequestHandler; - private DocumentRepository $placeDocumentRepository; - private Psr7RequestBuilder $psr7RequestBuilder; protected function setUp(): void { $this->commandBus = new TraceableCommandBus(); - $this->placeDocumentRepository = new InMemoryDocumentRepository(); + $placeDocumentRepository = new InMemoryDocumentRepository(); - $this->placeDocumentRepository->save( + $placeDocumentRepository->save( new JsonDocument(self::PLACE_ID, '{}') ); $this->updateAddressRequestHandler = new UpdateAddressRequestHandler( $this->commandBus, - $this->placeDocumentRepository + $placeDocumentRepository ); $this->psr7RequestBuilder = new Psr7RequestBuilder(); @@ -89,4 +87,169 @@ public function it_handles_updating_the_address(): void $this->commandBus->getRecordedCommands() ); } + + /** + * @test + */ + public function it_handles_changing_the_address(): void + { + $updateAddressRequest = $this->psr7RequestBuilder + ->withRouteParameter('placeId', self::PLACE_ID) + ->withRouteParameter('language', 'nl') + ->withBodyFromString( + '{ + "streetAddress": "Veldstraat 11", + "postalCode": "9000", + "addressLocality": "Gent", + "addressCountry": "BE" + }' + ) + ->build('PUT'); + + $updateAddressRequest2 = $this->psr7RequestBuilder + ->withRouteParameter('placeId', self::PLACE_ID) + ->withRouteParameter('language', 'nl') + ->withBodyFromString( + '{ + "streetAddress": "Meir 12", + "postalCode": "2000", + "addressLocality": "Antwerpen", + "addressCountry": "BE" + }' + ) + ->build('PUT'); + + $this->updateAddressRequestHandler->handle($updateAddressRequest); + $this->updateAddressRequestHandler->handle($updateAddressRequest2); + + $this->assertEquals( + [ + new UpdateAddress( + self::PLACE_ID, + new Address( + new Street('Veldstraat 11'), + new PostalCode('9000'), + new Locality('Gent'), + new CountryCode('BE') + ), + new Language('nl') + ), + new UpdateAddress( + self::PLACE_ID, + new Address( + new Street('Meir 12'), + new PostalCode('2000'), + new Locality('Antwerpen'), + new CountryCode('BE') + ), + new Language('nl') + ), + ], + $this->commandBus->getRecordedCommands() + ); + } + + /** + * @test + */ + public function it_supports_multiple_languages(): void + { + $updateAddressRequest = $this->psr7RequestBuilder + ->withRouteParameter('placeId', self::PLACE_ID) + ->withRouteParameter('language', 'nl') + ->withBodyFromString( + '{ + "streetAddress": "Veldstraat 11", + "postalCode": "9000", + "addressLocality": "Gent", + "addressCountry": "BE" + }' + ) + ->build('PUT'); + + $updateAddressRequest2 = $this->psr7RequestBuilder + ->withRouteParameter('placeId', self::PLACE_ID) + ->withRouteParameter('language', 'fr') + ->withBodyFromString( + '{ + "streetAddress": "Rue du champ 11", + "postalCode": "9000", + "addressLocality": "Gand", + "addressCountry": "BE" + }' + ) + ->build('PUT'); + + $this->updateAddressRequestHandler->handle($updateAddressRequest); + $this->updateAddressRequestHandler->handle($updateAddressRequest2); + + $this->assertEquals( + [ + new UpdateAddress( + self::PLACE_ID, + new Address( + new Street('Veldstraat 11'), + new PostalCode('9000'), + new Locality('Gent'), + new CountryCode('BE') + ), + new Language('nl') + ), + new UpdateAddress( + self::PLACE_ID, + new Address( + new Street('Rue du champ 11'), + new PostalCode('9000'), + new Locality('Gand'), + new CountryCode('BE') + ), + new Language('fr') + ), + ], + $this->commandBus->getRecordedCommands() + ); + } + + /** + * @test + */ + public function it_throws_on_invalid_country(): void + { + $updateAddressRequest = $this->psr7RequestBuilder + ->withRouteParameter('placeId', self::PLACE_ID) + ->withRouteParameter('language', 'nl') + ->withBodyFromString( + '{ + "streetAddress": "Veldstraat 11", + "postalCode": "9000", + "addressLocality": "Gent", + "addressCountry": "BEL" + }' + ) + ->build('PUT'); + + $this->expectException(InvalidArgumentException::class); + + $this->updateAddressRequestHandler->handle($updateAddressRequest); + } + + public function it_throws_on_empty_values(): void + { + $updateAddressRequest = $this->psr7RequestBuilder + ->withRouteParameter('placeId', self::PLACE_ID) + ->withRouteParameter('language', 'nl') + ->withBodyFromString( + '{ + "streetAddress": "", + "postalCode": "9000", + "addressLocality": "Gent", + "addressCountry": "BE" + }' + ) + ->build('PUT'); + + $this->expectException(InvalidArgumentException::class); + + $this->updateAddressRequestHandler->handle($updateAddressRequest); + } } From 81d07c48b3d03965945a5b2d39caf448fb4c51eb Mon Sep 17 00:00:00 2001 From: Jonas Date: Tue, 23 Aug 2022 10:31:14 +0200 Subject: [PATCH 11/15] Improve naming of variables --- tests/Http/Place/UpdateAddressRequestHandlerTest.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/Http/Place/UpdateAddressRequestHandlerTest.php b/tests/Http/Place/UpdateAddressRequestHandlerTest.php index dc52dce1ed..ce4e5f8a06 100644 --- a/tests/Http/Place/UpdateAddressRequestHandlerTest.php +++ b/tests/Http/Place/UpdateAddressRequestHandlerTest.php @@ -154,7 +154,7 @@ public function it_handles_changing_the_address(): void */ public function it_supports_multiple_languages(): void { - $updateAddressRequest = $this->psr7RequestBuilder + $updateAddressRequestInDutch = $this->psr7RequestBuilder ->withRouteParameter('placeId', self::PLACE_ID) ->withRouteParameter('language', 'nl') ->withBodyFromString( @@ -167,7 +167,7 @@ public function it_supports_multiple_languages(): void ) ->build('PUT'); - $updateAddressRequest2 = $this->psr7RequestBuilder + $updateAddressRequestInFrench = $this->psr7RequestBuilder ->withRouteParameter('placeId', self::PLACE_ID) ->withRouteParameter('language', 'fr') ->withBodyFromString( @@ -180,8 +180,8 @@ public function it_supports_multiple_languages(): void ) ->build('PUT'); - $this->updateAddressRequestHandler->handle($updateAddressRequest); - $this->updateAddressRequestHandler->handle($updateAddressRequest2); + $this->updateAddressRequestHandler->handle($updateAddressRequestInDutch); + $this->updateAddressRequestHandler->handle($updateAddressRequestInFrench); $this->assertEquals( [ From d8b8e065c4b67cd0155c18be3fc4cd5962ca165f Mon Sep 17 00:00:00 2001 From: Jonas Date: Tue, 23 Aug 2022 11:35:19 +0200 Subject: [PATCH 12/15] check If NoContentResponse is Returned --- tests/Http/Place/UpdateAddressRequestHandlerTest.php | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/tests/Http/Place/UpdateAddressRequestHandlerTest.php b/tests/Http/Place/UpdateAddressRequestHandlerTest.php index ce4e5f8a06..d97aff6d0a 100644 --- a/tests/Http/Place/UpdateAddressRequestHandlerTest.php +++ b/tests/Http/Place/UpdateAddressRequestHandlerTest.php @@ -9,8 +9,12 @@ use CultuurNet\UDB3\Address\Locality; use CultuurNet\UDB3\Address\PostalCode; use CultuurNet\UDB3\Address\Street; +use CultuurNet\UDB3\Deserializer\DataValidationException; use CultuurNet\UDB3\Http\ApiProblem\AssertApiProblemTrait; use CultuurNet\UDB3\Http\Request\Psr7RequestBuilder; +use CultuurNet\UDB3\Http\Response\AssertJsonResponseTrait; +use CultuurNet\UDB3\Http\Response\NoContentResponse; +use CultuurNet\UDB3\Json; use CultuurNet\UDB3\Language; use CultuurNet\UDB3\Model\ValueObject\Geography\CountryCode; use CultuurNet\UDB3\Place\Commands\UpdateAddress; @@ -22,6 +26,7 @@ class UpdateAddressRequestHandlerTest extends TestCase { use AssertApiProblemTrait; + use AssertJsonResponseTrait; private const PLACE_ID = 'd2a039e9-f4d6-4080-ae33-a106b5d3d47b'; @@ -69,7 +74,7 @@ public function it_handles_updating_the_address(): void ) ->build('PUT'); - $this->updateAddressRequestHandler->handle($updateAddressRequest); + $response = $this->updateAddressRequestHandler->handle($updateAddressRequest); $this->assertEquals( [ @@ -86,6 +91,11 @@ public function it_handles_updating_the_address(): void ], $this->commandBus->getRecordedCommands() ); + + $this->assertJsonResponse( + new NoContentResponse(), + $response + ); } /** From 201b69fd2f9beea0fb573623e78a528246917ac5 Mon Sep 17 00:00:00 2001 From: Jonas Date: Tue, 23 Aug 2022 11:35:41 +0200 Subject: [PATCH 13/15] use dataprovider to check for multiple empty values --- .../Place/UpdateAddressRequestHandlerTest.php | 54 ++++++++++++++++--- 1 file changed, 46 insertions(+), 8 deletions(-) diff --git a/tests/Http/Place/UpdateAddressRequestHandlerTest.php b/tests/Http/Place/UpdateAddressRequestHandlerTest.php index d97aff6d0a..88cba01d9e 100644 --- a/tests/Http/Place/UpdateAddressRequestHandlerTest.php +++ b/tests/Http/Place/UpdateAddressRequestHandlerTest.php @@ -243,23 +243,61 @@ public function it_throws_on_invalid_country(): void $this->updateAddressRequestHandler->handle($updateAddressRequest); } - public function it_throws_on_empty_values(): void + /** + * @test + * @dataProvider emptyValueDataProvider + */ + public function it_throws_on_empty_values(array $emptyValueAddress): void { $updateAddressRequest = $this->psr7RequestBuilder ->withRouteParameter('placeId', self::PLACE_ID) ->withRouteParameter('language', 'nl') ->withBodyFromString( - '{ - "streetAddress": "", - "postalCode": "9000", - "addressLocality": "Gent", - "addressCountry": "BE" - }' + Json::encode($emptyValueAddress) ) ->build('PUT'); - $this->expectException(InvalidArgumentException::class); + $this->expectException(DataValidationException::class); $this->updateAddressRequestHandler->handle($updateAddressRequest); } + + + public function emptyValueDataProvider(): array + { + return [ + [ + [ + 'streetAddress' => '', + 'postalCode' => '9000', + 'addressLocality' => 'Gent', + 'addressCountry' => 'BE', + ], + ], + [ + [ + 'streetAddress' => 'Veldstraat 11', + 'postalCode' => '', + 'addressLocality' => 'Gent', + 'addressCountry' => 'BE', + ], + ], + [ + [ + 'streetAddress' => 'Veldstraat 11', + 'postalCode' => '9000', + 'addressLocality' => '', + 'addressCountry' => 'BE', + ], + ], + [ + [ + 'streetAddress' => 'Veldstraat 11', + 'postalCode' => '9000', + 'addressLocality' => 'Gent', + 'addressCountry' => '', + ], + ], + ]; + } } From 928b21a4db1d95237a328ae0ac8a7246855cbce1 Mon Sep 17 00:00:00 2001 From: Jonas Date: Tue, 23 Aug 2022 14:17:48 +0200 Subject: [PATCH 14/15] remove duplicate check for DocumentNotFound --- app/Place/PlaceControllerProvider.php | 3 +-- src/Http/Place/UpdateAddressRequestHandler.php | 16 +--------------- .../Place/UpdateAddressRequestHandlerTest.php | 3 +-- 3 files changed, 3 insertions(+), 19 deletions(-) diff --git a/app/Place/PlaceControllerProvider.php b/app/Place/PlaceControllerProvider.php index 8a4f668ad3..39187b7770 100644 --- a/app/Place/PlaceControllerProvider.php +++ b/app/Place/PlaceControllerProvider.php @@ -76,8 +76,7 @@ function (Application $app) { $app[UpdateAddressRequestHandler::class] = $app->share( fn (Application $app) => new UpdateAddressRequestHandler( - $app['event_command_bus'], - $app['place_jsonld_repository'] + $app['event_command_bus'] ) ); diff --git a/src/Http/Place/UpdateAddressRequestHandler.php b/src/Http/Place/UpdateAddressRequestHandler.php index 78195750b5..8fe430c34a 100644 --- a/src/Http/Place/UpdateAddressRequestHandler.php +++ b/src/Http/Place/UpdateAddressRequestHandler.php @@ -5,14 +5,11 @@ namespace CultuurNet\UDB3\Http\Place; use Broadway\CommandHandling\CommandBus; -use CultuurNet\UDB3\EntityNotFoundException; use CultuurNet\UDB3\Http\Deserializer\Address\AddressJSONDeserializer; use CultuurNet\UDB3\Http\Request\RouteParameters; use CultuurNet\UDB3\Http\Response\NoContentResponse; use CultuurNet\UDB3\Language; use CultuurNet\UDB3\Place\Commands\UpdateAddress; -use CultuurNet\UDB3\ReadModel\DocumentDoesNotExist; -use CultuurNet\UDB3\ReadModel\DocumentRepository; use CultuurNet\UDB3\StringLiteral; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -22,12 +19,9 @@ final class UpdateAddressRequestHandler implements RequestHandlerInterface { private CommandBus $commandBus; - private DocumentRepository $placeDocumentRepository; - - public function __construct(CommandBus $commandBus, DocumentRepository $placeDocumentRepository) + public function __construct(CommandBus $commandBus) { $this->commandBus = $commandBus; - $this->placeDocumentRepository = $placeDocumentRepository; } public function handle(ServerRequestInterface $request): ResponseInterface @@ -40,14 +34,6 @@ public function handle(ServerRequestInterface $request): ResponseInterface new StringLiteral($request->getBody()->getContents()) ); - try { - $this->placeDocumentRepository->fetch($placeId); - } catch (DocumentDoesNotExist $e) { - throw new EntityNotFoundException( - sprintf('Place with id: %s not found.', $placeId) - ); - } - $this->commandBus->dispatch( new UpdateAddress($placeId, $address, Language::fromUdb3ModelLanguage($language)) ); diff --git a/tests/Http/Place/UpdateAddressRequestHandlerTest.php b/tests/Http/Place/UpdateAddressRequestHandlerTest.php index 88cba01d9e..e8c1a9b305 100644 --- a/tests/Http/Place/UpdateAddressRequestHandlerTest.php +++ b/tests/Http/Place/UpdateAddressRequestHandlerTest.php @@ -47,8 +47,7 @@ protected function setUp(): void ); $this->updateAddressRequestHandler = new UpdateAddressRequestHandler( - $this->commandBus, - $placeDocumentRepository + $this->commandBus ); $this->psr7RequestBuilder = new Psr7RequestBuilder(); From 8ababa94c4fadde4ae70bbd98e834321d1463fb7 Mon Sep 17 00:00:00 2001 From: Jonas Date: Wed, 24 Aug 2022 09:16:42 +0200 Subject: [PATCH 15/15] remove unnecessary variable --- tests/Http/Place/UpdateAddressRequestHandlerTest.php | 8 -------- 1 file changed, 8 deletions(-) diff --git a/tests/Http/Place/UpdateAddressRequestHandlerTest.php b/tests/Http/Place/UpdateAddressRequestHandlerTest.php index e8c1a9b305..409464cdd5 100644 --- a/tests/Http/Place/UpdateAddressRequestHandlerTest.php +++ b/tests/Http/Place/UpdateAddressRequestHandlerTest.php @@ -18,8 +18,6 @@ use CultuurNet\UDB3\Language; use CultuurNet\UDB3\Model\ValueObject\Geography\CountryCode; use CultuurNet\UDB3\Place\Commands\UpdateAddress; -use CultuurNet\UDB3\ReadModel\InMemoryDocumentRepository; -use CultuurNet\UDB3\ReadModel\JsonDocument; use InvalidArgumentException; use PHPUnit\Framework\TestCase; @@ -40,12 +38,6 @@ protected function setUp(): void { $this->commandBus = new TraceableCommandBus(); - $placeDocumentRepository = new InMemoryDocumentRepository(); - - $placeDocumentRepository->save( - new JsonDocument(self::PLACE_ID, '{}') - ); - $this->updateAddressRequestHandler = new UpdateAddressRequestHandler( $this->commandBus );