From 3ceb3bd98b43c8aabfae711302d03e7a3ceb8ec6 Mon Sep 17 00:00:00 2001 From: Mateusz Zalewski Date: Fri, 14 Jun 2024 11:43:52 +0200 Subject: [PATCH] PR review changes --- .github/workflows/build.yaml | 5 +- composer.json | 8 +-- src/Checker/PostUpdateChangesChecker.php | 18 +++++ .../PostUpdateChangesCheckerInterface.php | 12 ++++ src/Controller/EditOrderAction.php | 57 ++++++++++------ src/Exception/NewOrderWrongTotalException.php | 4 +- src/Exception/OrderUpdateException.php | 13 ++++ .../OrderPreparer.php} | 10 +-- src/Preparer/OrderPreparerInterface.php | 12 ++++ src/Processor/UpdatedOrderProcessor.php | 24 +++---- .../UpdatedOrderProcessorInterface.php | 12 ++++ src/Provider/UpdatedOrderProvider.php | 13 ++-- .../UpdatedOrderProviderInterface.php | 13 ++++ src/Resources/config/routes/admin.yaml | 4 +- src/Resources/config/services/controller.xml | 14 ++-- .../config/services/order_processing.xml | 21 ++++-- src/Resources/translations/flashes.en.yaml | 8 +-- .../admin/order/update/_order_items.html.twig | 2 +- .../routes/setono_sylius_order_edit.yaml | 2 + .../config/routes/sylius_admin.yaml | 3 - .../Order/Update/_content.html.twig | 2 +- tests/Functional/OrderUpdateTest.php | 32 ++++----- .../Checker/PostUpdateChangesCheckerTest.php | 61 +++++++++++++++++ .../Processor/UpdatedOrderProcessorTest.php | 37 +--------- ...ProviderTest.php => OrderPreparerTest.php} | 12 ++-- .../Provider/UpdatedOrderProviderTest.php | 68 ++++++++++++++++++- 26 files changed, 339 insertions(+), 128 deletions(-) create mode 100644 src/Checker/PostUpdateChangesChecker.php create mode 100644 src/Checker/PostUpdateChangesCheckerInterface.php create mode 100644 src/Exception/OrderUpdateException.php rename src/{Provider/OldOrderProvider.php => Preparer/OrderPreparer.php} (63%) create mode 100644 src/Preparer/OrderPreparerInterface.php create mode 100644 src/Processor/UpdatedOrderProcessorInterface.php create mode 100644 src/Provider/UpdatedOrderProviderInterface.php create mode 100644 tests/Application/config/routes/setono_sylius_order_edit.yaml create mode 100644 tests/Unit/Checker/PostUpdateChangesCheckerTest.php rename tests/Unit/Provider/{OldOrderProviderTest.php => OrderPreparerTest.php} (82%) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 344aa75..f67decd 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -272,6 +272,9 @@ jobs: - "highest" steps: + - name: "Start MySQL" + run: "sudo /etc/init.d/mysql start" + - name: "Checkout" uses: "actions/checkout@v4" @@ -325,7 +328,7 @@ jobs: dependency-versions: "${{ matrix.dependencies }}" - name: "Collect code coverage with pcov and phpunit/phpunit" - run: "vendor/bin/phpunit --coverage-clover=.build/logs/clover.xml" + run: "vendor/bin/phpunit tests/Unit/ --coverage-clover=.build/logs/clover.xml" - name: "Send code coverage report to Codecov.io" uses: "codecov/codecov-action@v3" diff --git a/composer.json b/composer.json index eeffadb..66dced3 100644 --- a/composer.json +++ b/composer.json @@ -19,7 +19,7 @@ "sylius/resource-bundle": "^1.6", "symfony/config": "^5.4 || ^6.4 || ^7.0", "symfony/dependency-injection": "^5.4 || ^6.4 || ^7.0", - "symfony/doctrine-bridge": "^5.4 || ^6.4 || ^7.0", + "symfony/doctrine-bridge": "^5.4 || ^6.3 || ^7.0", "symfony/event-dispatcher": "^5.4 || ^6.4 || ^7.0", "symfony/form": "^5.4 || ^6.4 || ^7.0", "symfony/http-foundation": "^5.4 || ^6.4 || ^7.0", @@ -42,7 +42,7 @@ "psalm/plugin-phpunit": "^0.18.4", "setono/code-quality-pack": "^2.7", "sylius/sylius": "~1.12.13", - "symfony/browser-kit": "^5.4", + "symfony/browser-kit": "^5.4 || ^6.4 || ^7.0", "symfony/debug-bundle": "^5.4 || ^6.4 || ^7.0", "symfony/dotenv": "^5.4 || ^6.4 || ^7.0", "symfony/intl": "^5.4 || ^6.4 || ^7.0", @@ -85,7 +85,7 @@ "analyse": "psalm", "check-style": "ecs check", "fix-style": "ecs check --fix", - "functional-tests": "vendor/bin/phpunit tests/Functional/", - "unit-tests": "vendor/bin/phpunit tests/Unit/" + "functional-tests": "phpunit tests/Functional/", + "unit-tests": "phpunit tests/Unit/" } } diff --git a/src/Checker/PostUpdateChangesChecker.php b/src/Checker/PostUpdateChangesChecker.php new file mode 100644 index 0000000..edc0430 --- /dev/null +++ b/src/Checker/PostUpdateChangesChecker.php @@ -0,0 +1,18 @@ +getTotal() > $previousOrder->getTotal()) { + throw new NewOrderWrongTotalException(); + } + } +} diff --git a/src/Checker/PostUpdateChangesCheckerInterface.php b/src/Checker/PostUpdateChangesCheckerInterface.php new file mode 100644 index 0000000..8fc2b48 --- /dev/null +++ b/src/Checker/PostUpdateChangesCheckerInterface.php @@ -0,0 +1,12 @@ +attributes->get('id'); - $order = $this->oldOrderProvider->provide($orderId); + $order = $this->oldOrderProvider->prepareToUpdate($id); - $initialTotal = $order->getTotal(); - $resource = $this->updatedOrderProvider->fromRequest($order, $request); + $oldOrder = clone $order; + $updatedOrder = $this->updatedOrderProvider->provideFromOldOrderAndRequest($order, $request); try { - $this->updatedOrderProcessor->process($initialTotal, $resource); + $this->updatedOrderProcessor->process($updatedOrder); + $this->postUpdateChangesChecker->check($oldOrder, $updatedOrder); + $this->entityManager->flush(); } catch (NewOrderWrongTotalException) { return $this->addFlashAndRedirect( 'error', - 'setono_sylius_order_edit.error.order_update', + 'setono_sylius_order_edit.order_update.total_error', 'sylius_admin_order_update', - $orderId, + $id, + ); + } catch (\Exception) { + return $this->addFlashAndRedirect( + 'error', + 'setono_sylius_order_edit.order_update.general_error', + 'sylius_admin_order_update', + $id, ); } return $this->addFlashAndRedirect( 'success', - 'setono_sylius_order_edit.success.order_update', + 'setono_sylius_order_edit.order_update.success', 'sylius_admin_order_show', - $orderId, + $id, ); } @@ -60,9 +72,10 @@ private function addFlashAndRedirect( int $orderId, ): RedirectResponse { $session = $this->requestStack->getSession(); - /** @var FlashBagInterface $flashBag */ - $flashBag = $session->getBag('flashes'); - $flashBag->add($type, $message); + + if ($session instanceof Session) { + $session->getFlashBag()->add($type, $message); + } return new RedirectResponse($this->router->generate($route, ['id' => $orderId])); } diff --git a/src/Exception/NewOrderWrongTotalException.php b/src/Exception/NewOrderWrongTotalException.php index 42a33d7..3a94b63 100644 --- a/src/Exception/NewOrderWrongTotalException.php +++ b/src/Exception/NewOrderWrongTotalException.php @@ -6,8 +6,8 @@ final class NewOrderWrongTotalException extends \RuntimeException { - public static function occur(): self + public function __construct() { - return new self('New order total is greater than the initial order total'); + parent::__construct('New order total is greater than the initial order total'); } } diff --git a/src/Exception/OrderUpdateException.php b/src/Exception/OrderUpdateException.php new file mode 100644 index 0000000..c72ea3b --- /dev/null +++ b/src/Exception/OrderUpdateException.php @@ -0,0 +1,13 @@ +orderRepository->find($orderId); diff --git a/src/Preparer/OrderPreparerInterface.php b/src/Preparer/OrderPreparerInterface.php new file mode 100644 index 0000000..46390fe --- /dev/null +++ b/src/Preparer/OrderPreparerInterface.php @@ -0,0 +1,12 @@ +setState(OrderInterface::STATE_CART); $this->orderProcessor->process($newOrder); @@ -28,10 +25,11 @@ public function process(int $initialTotal, OrderInterface $newOrder): void $newOrder->setState(OrderInterface::STATE_NEW); $this->orderInventoryOperator->hold($newOrder); - if ($initialTotal < $newOrder->getTotal()) { - throw NewOrderWrongTotalException::occur(); - } - - $this->entityManager->flush(); + return $newOrder; +// if ($initialTotal < $newOrder->getTotal()) { +// throw new NewOrderWrongTotalException(); +// } +// +// $this->entityManager->flush(); } } diff --git a/src/Processor/UpdatedOrderProcessorInterface.php b/src/Processor/UpdatedOrderProcessorInterface.php new file mode 100644 index 0000000..75d29bb --- /dev/null +++ b/src/Processor/UpdatedOrderProcessorInterface.php @@ -0,0 +1,12 @@ +formFactory->create(OrderType::class, $order, ['validation_groups' => 'sylius']); + $form = $this->formFactory->create(OrderType::class, $oldOrder, ['validation_groups' => 'sylius']); $form->handleRequest($request); + if (!$form->isSubmitted() || !$form->isValid()) { + throw new OrderUpdateException(); + } + $data = $form->getData(); Assert::isInstanceOf($data, OrderInterface::class); diff --git a/src/Provider/UpdatedOrderProviderInterface.php b/src/Provider/UpdatedOrderProviderInterface.php new file mode 100644 index 0000000..b0f6113 --- /dev/null +++ b/src/Provider/UpdatedOrderProviderInterface.php @@ -0,0 +1,13 @@ + - - + + + + + - - + diff --git a/src/Resources/config/services/order_processing.xml b/src/Resources/config/services/order_processing.xml index c34d103..b31b99b 100644 --- a/src/Resources/config/services/order_processing.xml +++ b/src/Resources/config/services/order_processing.xml @@ -9,20 +9,33 @@ - + + + - + - + - diff --git a/src/Resources/translations/flashes.en.yaml b/src/Resources/translations/flashes.en.yaml index 9ea2a2d..aa7c27d 100644 --- a/src/Resources/translations/flashes.en.yaml +++ b/src/Resources/translations/flashes.en.yaml @@ -1,5 +1,5 @@ setono_sylius_order_edit: - error: - order_update: 'Order should not have bigger total than before editing' - success: - order_update: 'Order has been successfully updated' + order_update: + general_error: 'An error occurred while updating the order' + total_error: 'Order should not have bigger total than before editing' + success: 'Order has been successfully updated' diff --git a/src/Resources/views/admin/order/update/_order_items.html.twig b/src/Resources/views/admin/order/update/_order_items.html.twig index 234911d..5863d0a 100644 --- a/src/Resources/views/admin/order/update/_order_items.html.twig +++ b/src/Resources/views/admin/order/update/_order_items.html.twig @@ -28,7 +28,7 @@ {% set orderItem = itemForm.vars.data %} {{ form_row(itemForm.quantity) }} - {{ form_widget(itemForm.variant) }} + {{ orderItem.productName }} {{ money.format(orderItem.unitPrice, order.currencyCode) }} {{ money.format(orderItem.total, order.currencyCode) }} diff --git a/tests/Application/config/routes/setono_sylius_order_edit.yaml b/tests/Application/config/routes/setono_sylius_order_edit.yaml new file mode 100644 index 0000000..3dab0fb --- /dev/null +++ b/tests/Application/config/routes/setono_sylius_order_edit.yaml @@ -0,0 +1,2 @@ +setono_sylius_edit_order: + resource: "@SetonoSyliusOrderEditPlugin/Resources/config/routes.yaml" diff --git a/tests/Application/config/routes/sylius_admin.yaml b/tests/Application/config/routes/sylius_admin.yaml index 6223cf6..b9c12c2 100644 --- a/tests/Application/config/routes/sylius_admin.yaml +++ b/tests/Application/config/routes/sylius_admin.yaml @@ -1,6 +1,3 @@ sylius_admin: resource: "@SyliusAdminBundle/Resources/config/routing.yml" prefix: '/%sylius_admin.path_name%' - -setono_edit_order: - resource: "@SetonoSyliusOrderEditPlugin/Resources/config/routes.yaml" diff --git a/tests/Application/templates/bundles/SyliusAdminBundle/Order/Update/_content.html.twig b/tests/Application/templates/bundles/SyliusAdminBundle/Order/Update/_content.html.twig index 31e870b..aed304b 100644 --- a/tests/Application/templates/bundles/SyliusAdminBundle/Order/Update/_content.html.twig +++ b/tests/Application/templates/bundles/SyliusAdminBundle/Order/Update/_content.html.twig @@ -2,7 +2,7 @@ {{ form_start(form, {'action': path('setono_sylius_order_edit_admin_update', {'id': order.id}), 'attr': {'class': 'ui loadable form', 'novalidate': 'novalidate'}}) }}
- + {{ include('@SetonoSyliusOrderEditPlugin/admin/order/update/_order_items.html.twig') }} diff --git a/tests/Functional/OrderUpdateTest.php b/tests/Functional/OrderUpdateTest.php index 1fdcbdf..040b13d 100644 --- a/tests/Functional/OrderUpdateTest.php +++ b/tests/Functional/OrderUpdateTest.php @@ -41,22 +41,7 @@ public function testItUpdatesOrder(): void $initialHold = $variant->getOnHold(); $this->loginAsAdmin(); - - $content = json_encode(['sylius_order' => ['items' => [ - [ - 'variant' => '000F_office_grey_jeans-variant-0', - 'quantity' => 3, - ], - ]]]); - - self::$client->request( - 'PATCH', - sprintf('/admin/orders/%d/update-and-processs', (int) $order->getId()), - [], - [], - ['CONTENT_TYPE' => 'application/json'], - $content, - ); + $this->updateOrder($order->getId()); self::assertResponseStatusCodeSame(302); @@ -123,6 +108,7 @@ private function makeVariantTrackedWithStock(string $code = '000F_office_grey_je $variant = $variantRepository->findOneBy(['code' => $code]); $variant->setTracked(true); $variant->setOnHand($stock); + $variant->getOnHold(0); self::getContainer()->get('sylius.manager.product_variant')->flush(); } @@ -146,6 +132,20 @@ private function loginAsAdmin(): void static::$client->submit($form); } + private function updateOrder(int $orderId): void + { + $crawler = static::$client->request('GET', sprintf('/admin/orders/%d/edit', $orderId)); + $form = $crawler->selectButton('Save changes')->form([ + 'sylius_order' => [ + 'items' => [ + ['quantity' => 3], + ], + ], + ]); + + static::$client->submit($form); + } + private function getOrderRepository(): OrderRepositoryInterface { return self::getContainer()->get('sylius.repository.order'); diff --git a/tests/Unit/Checker/PostUpdateChangesCheckerTest.php b/tests/Unit/Checker/PostUpdateChangesCheckerTest.php new file mode 100644 index 0000000..3d0538d --- /dev/null +++ b/tests/Unit/Checker/PostUpdateChangesCheckerTest.php @@ -0,0 +1,61 @@ +expectException(NewOrderWrongTotalException::class); + + $validator = new PostUpdateChangesChecker(); + + $newOrder = $this->prophesize(OrderInterface::class); + $newOrder->getTotal()->willReturn(1000); + + $previousOrder = $this->prophesize(OrderInterface::class); + $previousOrder->getTotal()->willReturn(500); + + $validator->check($previousOrder->reveal(), $newOrder->reveal()); + } + + public function testItDoesNothingIfNewOrderTotalIsSmallerThanThePreviousOne(): void + { + $validator = new PostUpdateChangesChecker(); + + $newOrder = $this->prophesize(OrderInterface::class); + $newOrder->getTotal()->willReturn(500); + + $previousOrder = $this->prophesize(OrderInterface::class); + $previousOrder->getTotal()->willReturn(1000); + + $this->expectNotToPerformAssertions(); + + $validator->check($previousOrder->reveal(), $newOrder->reveal()); + } + + public function testItDoesNothingIfNewOrderTotalIsEqualToThePreviousOne(): void + { + $validator = new PostUpdateChangesChecker(); + + $newOrder = $this->prophesize(OrderInterface::class); + $newOrder->getTotal()->willReturn(500); + + $previousOrder = $this->prophesize(OrderInterface::class); + $previousOrder->getTotal()->willReturn(500); + + $this->expectNotToPerformAssertions(); + + $validator->check($previousOrder->reveal(), $newOrder->reveal()); + } +} diff --git a/tests/Unit/Processor/UpdatedOrderProcessorTest.php b/tests/Unit/Processor/UpdatedOrderProcessorTest.php index b9c5967..62449ea 100644 --- a/tests/Unit/Processor/UpdatedOrderProcessorTest.php +++ b/tests/Unit/Processor/UpdatedOrderProcessorTest.php @@ -4,10 +4,8 @@ namespace Setono\SyliusOrderEditPlugin\Tests\Unit\Processor; -use Doctrine\ORM\EntityManagerInterface; use PHPUnit\Framework\TestCase; use Prophecy\PhpUnit\ProphecyTrait; -use Setono\SyliusOrderEditPlugin\Exception\NewOrderWrongTotalException; use Setono\SyliusOrderEditPlugin\Processor\UpdatedOrderProcessor; use Sylius\Component\Core\Inventory\Operator\OrderInventoryOperatorInterface; use Sylius\Component\Core\Model\OrderInterface; @@ -22,13 +20,11 @@ public function testItProcessesAndUpdatedTheOrder(): void $orderProcessor = $this->prophesize(OrderProcessorInterface::class); $orderInventoryOperator = $this->prophesize(OrderInventoryOperatorInterface::class); $afterCheckoutOrderPaymentProcessor = $this->prophesize(OrderProcessorInterface::class); - $entityManager = $this->prophesize(EntityManagerInterface::class); $processor = new UpdatedOrderProcessor( $orderProcessor->reveal(), $orderInventoryOperator->reveal(), $afterCheckoutOrderPaymentProcessor->reveal(), - $entityManager->reveal(), ); $newOrder = $this->prophesize(OrderInterface::class); @@ -39,37 +35,6 @@ public function testItProcessesAndUpdatedTheOrder(): void $newOrder->setState('new')->shouldBeCalled(); $orderInventoryOperator->hold($newOrder)->shouldBeCalled(); - $newOrder->getTotal()->willReturn(500); - - $processor->process(1000, $newOrder->reveal()); - } - - public function testItThrowsExceptionIfNewOrderTotalIsBiggerThanTheOldOne(): void - { - $orderProcessor = $this->prophesize(OrderProcessorInterface::class); - $orderInventoryOperator = $this->prophesize(OrderInventoryOperatorInterface::class); - $afterCheckoutOrderPaymentProcessor = $this->prophesize(OrderProcessorInterface::class); - $entityManager = $this->prophesize(EntityManagerInterface::class); - - $processor = new UpdatedOrderProcessor( - $orderProcessor->reveal(), - $orderInventoryOperator->reveal(), - $afterCheckoutOrderPaymentProcessor->reveal(), - $entityManager->reveal(), - ); - - $newOrder = $this->prophesize(OrderInterface::class); - - $newOrder->setState('cart')->shouldBeCalled(); - $orderProcessor->process($newOrder)->shouldBeCalled(); - $afterCheckoutOrderPaymentProcessor->process($newOrder)->shouldBeCalled(); - $newOrder->setState('new')->shouldBeCalled(); - $orderInventoryOperator->hold($newOrder)->shouldBeCalled(); - - $newOrder->getTotal()->willReturn(1500); - - $this->expectException(NewOrderWrongTotalException::class); - - $processor->process(1000, $newOrder->reveal()); + self::assertSame($newOrder->reveal(), $processor->process($newOrder->reveal())); } } diff --git a/tests/Unit/Provider/OldOrderProviderTest.php b/tests/Unit/Provider/OrderPreparerTest.php similarity index 82% rename from tests/Unit/Provider/OldOrderProviderTest.php rename to tests/Unit/Provider/OrderPreparerTest.php index ba8039e..70607ca 100644 --- a/tests/Unit/Provider/OldOrderProviderTest.php +++ b/tests/Unit/Provider/OrderPreparerTest.php @@ -6,12 +6,12 @@ use PHPUnit\Framework\TestCase; use Prophecy\PhpUnit\ProphecyTrait; -use Setono\SyliusOrderEditPlugin\Provider\OldOrderProvider; +use Setono\SyliusOrderEditPlugin\Preparer\OrderPreparer; use Sylius\Component\Core\Inventory\Operator\OrderInventoryOperatorInterface; use Sylius\Component\Core\Model\Order; use Sylius\Component\Core\Repository\OrderRepositoryInterface; -final class OldOrderProviderTest extends TestCase +final class OrderPreparerTest extends TestCase { use ProphecyTrait; @@ -20,7 +20,7 @@ public function testItProvidesOrderAndCancelsItsStock(): void $orderRepository = $this->prophesize(OrderRepositoryInterface::class); $inventoryOperator = $this->prophesize(OrderInventoryOperatorInterface::class); - $provider = new OldOrderProvider( + $provider = new OrderPreparer( $orderRepository->reveal(), $inventoryOperator->reveal(), ); @@ -29,7 +29,7 @@ public function testItProvidesOrderAndCancelsItsStock(): void $orderRepository->find(1)->willReturn($order); $inventoryOperator->cancel($order)->shouldBeCalled(); - self::assertSame($order, $provider->provide(1)); + self::assertSame($order, $provider->prepareToUpdate(1)); } public function testItThrowsExceptionIfOrderWithGivenIdDoesNotExist(): void @@ -37,7 +37,7 @@ public function testItThrowsExceptionIfOrderWithGivenIdDoesNotExist(): void $orderRepository = $this->prophesize(OrderRepositoryInterface::class); $inventoryOperator = $this->prophesize(OrderInventoryOperatorInterface::class); - $provider = new OldOrderProvider( + $provider = new OrderPreparer( $orderRepository->reveal(), $inventoryOperator->reveal(), ); @@ -46,6 +46,6 @@ public function testItThrowsExceptionIfOrderWithGivenIdDoesNotExist(): void $this->expectException(\InvalidArgumentException::class); - $provider->provide(1); + $provider->prepareToUpdate(1); } } diff --git a/tests/Unit/Provider/UpdatedOrderProviderTest.php b/tests/Unit/Provider/UpdatedOrderProviderTest.php index 47edfe0..8d87ab2 100644 --- a/tests/Unit/Provider/UpdatedOrderProviderTest.php +++ b/tests/Unit/Provider/UpdatedOrderProviderTest.php @@ -6,6 +6,7 @@ use PHPUnit\Framework\TestCase; use Prophecy\PhpUnit\ProphecyTrait; +use Setono\SyliusOrderEditPlugin\Exception\OrderUpdateException; use Setono\SyliusOrderEditPlugin\Provider\UpdatedOrderProvider; use Sylius\Bundle\OrderBundle\Form\Type\OrderType; use Sylius\Component\Core\Model\Order; @@ -29,8 +30,73 @@ public function testItProvidesUpdateOrderFromRequest(): void $formFactory->create(OrderType::class, $order, ['validation_groups' => 'sylius'])->willReturn($form); $form->handleRequest($request)->shouldBeCalled()->willReturn($form); + + $form->isSubmitted()->willReturn(true); + $form->isValid()->willReturn(true); + $form->getData()->willReturn($newOrder); - self::assertSame($newOrder, $provider->fromRequest($order, $request)); + self::assertSame($newOrder, $provider->provideFromOldOrderAndRequest($order, $request)); + } + + public function testItThrowsExceptionIfFormIsNotSubmitted(): void + { + $formFactory = $this->prophesize(FormFactoryInterface::class); + $form = $this->prophesize(FormInterface::class); + + $provider = new UpdatedOrderProvider($formFactory->reveal()); + $order = new Order(); + $request = new Request(); + + $formFactory->create(OrderType::class, $order, ['validation_groups' => 'sylius'])->willReturn($form); + $form->handleRequest($request)->shouldBeCalled()->willReturn($form); + + $form->isSubmitted()->willReturn(false); + + $this->expectException(OrderUpdateException::class); + + $provider->provideFromOldOrderAndRequest($order, $request); + } + + public function testItThrowsExceptionIfFormIsNotValid(): void + { + $formFactory = $this->prophesize(FormFactoryInterface::class); + $form = $this->prophesize(FormInterface::class); + + $provider = new UpdatedOrderProvider($formFactory->reveal()); + $order = new Order(); + $request = new Request(); + + $formFactory->create(OrderType::class, $order, ['validation_groups' => 'sylius'])->willReturn($form); + $form->handleRequest($request)->shouldBeCalled()->willReturn($form); + + $form->isSubmitted()->willReturn(true); + $form->isValid()->willReturn(false); + + $this->expectException(OrderUpdateException::class); + + $provider->provideFromOldOrderAndRequest($order, $request); + } + + public function testItThrowsExceptionIfFormDataIsNotOrder(): void + { + $formFactory = $this->prophesize(FormFactoryInterface::class); + $form = $this->prophesize(FormInterface::class); + + $provider = new UpdatedOrderProvider($formFactory->reveal()); + $order = new Order(); + $request = new Request(); + + $formFactory->create(OrderType::class, $order, ['validation_groups' => 'sylius'])->willReturn($form); + $form->handleRequest($request)->shouldBeCalled()->willReturn($form); + + $form->isSubmitted()->willReturn(true); + $form->isValid()->willReturn(true); + + $form->getData()->willReturn(new \stdClass()); + + $this->expectException(\InvalidArgumentException::class); + + $provider->provideFromOldOrderAndRequest($order, $request); } }