diff --git a/features/checkout/paying_for_order/changing_payment_method_after_order_confirmation.feature b/features/checkout/paying_for_order/changing_offline_payment_method_after_order_confirmation.feature similarity index 52% rename from features/checkout/paying_for_order/changing_payment_method_after_order_confirmation.feature rename to features/checkout/paying_for_order/changing_offline_payment_method_after_order_confirmation.feature index f49b46b5f0d8..b499f08e1faa 100644 --- a/features/checkout/paying_for_order/changing_payment_method_after_order_confirmation.feature +++ b/features/checkout/paying_for_order/changing_offline_payment_method_after_order_confirmation.feature @@ -1,5 +1,5 @@ @paying_for_order -Feature: Changing the method after order confirmation +Feature: Changing the offline payment method after order confirmation In order to try different payment methods As a Guest I want to be able to change the method after order confirmation @@ -12,33 +12,33 @@ Feature: Changing the method after order confirmation And the store ships everywhere for free @ui - Scenario: Retrying the payment with offline payment + Scenario: Retrying the payment with different offline payment Given I added product "PHP T-Shirt" to the cart And I complete addressing step with email "john@example.com" and "United States" based billing address + And I have proceeded selecting "Free" shipping method And I have proceeded selecting "Cash on delivery" payment method And I have confirmed order - When I go to the change payment method page - And I try to pay with "Offline" payment method - Then I should see the thank you page + When I change payment method to "Offline" after checkout + Then I should have chosen "Offline" payment method @ui - Scenario: Retrying the payment with offline payment works correctly together with inventory + Scenario: Retrying the payment with different offline payment works correctly together with inventory Given there is 1 unit of product "PHP T-Shirt" available in the inventory And this product is tracked by the inventory And I added product "PHP T-Shirt" to the cart And I complete addressing step with email "john@example.com" and "United States" based billing address + And I have proceeded selecting "Free" shipping method And I have proceeded selecting "Cash on delivery" payment method And I have confirmed order - When I go to the change payment method page - And I try to pay with "Offline" payment method - Then I should see the thank you page + When I change payment method to "Offline" after checkout + Then I should have chosen "Offline" payment method @api - Scenario: Changing the payment method for placed order + Scenario: Changing chosen offline payment method to another offline payment method after checkout Given I added product "PHP T-Shirt" to the cart - When I complete addressing step with email "john@example.com" and "United States" based billing address - And I select "Free" shipping method - And I select "Cash on delivery" payment method - And I confirm my order - And I change payment method to "Offline" - Then I should have chosen "Offline" payment method for my order + And I complete addressing step with email "john@example.com" and "United States" based billing address + And I have proceeded selecting "Free" shipping method + And I have proceeded selecting "Cash on delivery" payment method + And I have confirmed order + When I change payment method to "Offline" after checkout + Then I should have chosen "Offline" payment method diff --git a/src/Sylius/Behat/Context/Api/Shop/CheckoutContext.php b/src/Sylius/Behat/Context/Api/Shop/CheckoutContext.php index 71855445b54b..d6745efff999 100644 --- a/src/Sylius/Behat/Context/Api/Shop/CheckoutContext.php +++ b/src/Sylius/Behat/Context/Api/Shop/CheckoutContext.php @@ -23,7 +23,6 @@ use Sylius\Component\Core\Model\AddressInterface; use Sylius\Component\Core\Model\CustomerInterface; use Sylius\Component\Core\Model\OrderInterface; -use Sylius\Component\Core\Model\PaymentMethod; use Sylius\Component\Core\Model\PaymentMethodInterface; use Sylius\Component\Core\Model\ProductInterface; use Sylius\Component\Core\Model\ShipmentInterface; @@ -301,6 +300,7 @@ public function iProvideAdditionalNotesLike(string $notes): void /** * @Given I confirmed my order + * @Given I have confirmed order * @When I confirm my order * @When I try to confirm my order * @When /^the (?:visitor|customer) confirm his order$/ @@ -340,6 +340,7 @@ public function iConfirmMyOrder(): void * @Given /^the (?:visitor|customer) has proceeded ("[^"]+" shipping method)$/ * @When /^the visitor try to proceed with ("[^"]+" shipping method) in the customer cart$/ * @When I try to change shipping method to :shippingMethod + * @Given I have proceeded selecting :shippingMethod shipping method */ public function iProceededWithShippingMethod(ShippingMethodInterface $shippingMethod): void { @@ -388,7 +389,7 @@ public function iCompleteTheShippingStepWithFirstShippingMethod(): void * @When /^the (?:customer|visitor) proceed with ("[^"]+" payment)$/ * @Given /^the (?:customer|visitor) has proceeded ("[^"]+" payment)$/ * @When I try to change payment method to :paymentMethod payment - * @When I change payment method to :paymentMethod + * @When I change payment method to :paymentMethod after checkout */ public function iChoosePaymentMethod(PaymentMethodInterface $paymentMethod): void { diff --git a/src/Sylius/Behat/Context/Api/Shop/OrderContext.php b/src/Sylius/Behat/Context/Api/Shop/OrderContext.php index 2a412b01456a..49f7e7035490 100644 --- a/src/Sylius/Behat/Context/Api/Shop/OrderContext.php +++ b/src/Sylius/Behat/Context/Api/Shop/OrderContext.php @@ -260,17 +260,15 @@ public function theShouldHaveUnitPriceDiscountedFor(ProductInterface $product, i } /** - * @Then I should have chosen :paymentMethod payment method for my order + * @Then I should have chosen :paymentMethod payment method */ public function iShouldHaveChosenPaymentMethodForMyOrder(PaymentMethod $paymentMethod): void { - $payment = $this->iriConverter->getItemFromIri( - $this->responseChecker->getValue($this->client->show($this->sharedStorage->get('cart_token')), 'payments')[0] - ); + $paymentIri = $this->responseChecker->getValue($this->client->show($this->sharedStorage->get('cart_token')), 'payments')[0]; Assert::same( $this->iriConverter->getIriFromItem($paymentMethod), - $this->iriConverter->getIriFromItem($payment->getMethod()) + $this->responseChecker->getValue($this->client->showByIri($this->adminToShopIriConverter->convert($paymentIri)),'method')['@id'] ); } diff --git a/src/Sylius/Behat/Context/Ui/Shop/Checkout/CheckoutOrderDetailsContext.php b/src/Sylius/Behat/Context/Ui/Shop/Checkout/CheckoutOrderDetailsContext.php index b47671abcf7a..9970c45fa06a 100644 --- a/src/Sylius/Behat/Context/Ui/Shop/Checkout/CheckoutOrderDetailsContext.php +++ b/src/Sylius/Behat/Context/Ui/Shop/Checkout/CheckoutOrderDetailsContext.php @@ -15,6 +15,7 @@ use Behat\Behat\Context\Context; use Sylius\Behat\Page\Shop\Order\ShowPageInterface; +use Sylius\Behat\Page\Shop\Order\ThankYouPageInterface; use Sylius\Component\Core\Model\OrderInterface; use Webmozart\Assert\Assert; @@ -23,15 +24,19 @@ final class CheckoutOrderDetailsContext implements Context /** @var ShowPageInterface */ private $orderDetails; - public function __construct(ShowPageInterface $orderDetails) + /** @var ThankYouPageInterface */ + private $thankYouPage; + + public function __construct(ShowPageInterface $orderDetails, ThankYouPageInterface $thankYouPage) { $this->orderDetails = $orderDetails; + $this->thankYouPage = $thankYouPage; } /** * @When /^I want to browse order details for (this order)$/ */ - public function iWantToBrowseOrderDetailsForThisOrder(OrderInterface $order) + public function iWantToBrowseOrderDetailsForThisOrder(OrderInterface $order): void { $this->orderDetails->open(['tokenValue' => $order->getTokenValue()]); } @@ -39,16 +44,26 @@ public function iWantToBrowseOrderDetailsForThisOrder(OrderInterface $order) /** * @When I try to pay with :paymentMethodName payment method */ - public function iChangePaymentMethodTo($paymentMethodName) + public function iChangePaymentMethodTo(string $paymentMethodName): void { $this->orderDetails->choosePaymentMethod($paymentMethodName); $this->orderDetails->pay(); } + /** + * @When I change payment method to :paymentMethodName after checkout + */ + public function iChoosePaymentMethod(string $paymentMethodName): void + { + $this->thankYouPage->goToTheChangePaymentMethodPage(); + $this->orderDetails->choosePaymentMethod($paymentMethodName); + $this->orderDetails->pay(); + } + /** * @Then I should be able to pay (again) */ - public function iShouldBeAbleToPay() + public function iShouldBeAbleToPay(): void { Assert::true($this->orderDetails->hasPayAction()); } @@ -56,7 +71,7 @@ public function iShouldBeAbleToPay() /** * @Then I should not be able to pay (again) */ - public function iShouldNotBeAbleToPay() + public function iShouldNotBeAbleToPay(): void { Assert::false($this->orderDetails->hasPayAction()); } @@ -68,4 +83,13 @@ public function iShouldSeeAsNumberOfItems(int $quantity): void { Assert::same($this->orderDetails->getAmountOfItems(), $quantity); } + + /** + * @Then I should have chosen :paymentMethodName payment method + */ + public function iShouldHaveChosenPaymentMethod(string $paymentMethodName): void + { + $this->thankYouPage->goToTheChangePaymentMethodPage(); + Assert::same($this->orderDetails->getChosenPaymentMethod(), $paymentMethodName); + } } diff --git a/src/Sylius/Behat/Context/Ui/Shop/Checkout/CheckoutThankYouContext.php b/src/Sylius/Behat/Context/Ui/Shop/Checkout/CheckoutThankYouContext.php index 681916c7631d..bdc70fdc0460 100644 --- a/src/Sylius/Behat/Context/Ui/Shop/Checkout/CheckoutThankYouContext.php +++ b/src/Sylius/Behat/Context/Ui/Shop/Checkout/CheckoutThankYouContext.php @@ -15,6 +15,7 @@ use Behat\Behat\Context\Context; use Sylius\Behat\Page\Shop\Account\Order\ShowPageInterface; +use Sylius\Behat\Page\Shop\Order\ShowPageInterface as OrderDetailsPage; use Sylius\Behat\Page\Shop\Order\ThankYouPageInterface; use Sylius\Component\Core\Model\PaymentMethodInterface; use Sylius\Component\Core\Repository\OrderRepositoryInterface; @@ -28,17 +29,22 @@ final class CheckoutThankYouContext implements Context /** @var ShowPageInterface */ private $orderShowPage; + /** @var OrderDetailsPage */ + private $orderDetails; + /** @var OrderRepositoryInterface */ private $orderRepository; public function __construct( ThankYouPageInterface $thankYouPage, ShowPageInterface $orderShowPage, - OrderRepositoryInterface $orderRepository + OrderRepositoryInterface $orderRepository, + OrderDetailsPage $orderDetails ) { $this->thankYouPage = $thankYouPage; $this->orderShowPage = $orderShowPage; $this->orderRepository = $orderRepository; + $this->orderDetails = $orderDetails; } /** @@ -57,6 +63,16 @@ public function iProceedToTheRegistration(): void $this->thankYouPage->createAccount(); } + /** + * @When I change payment method to :paymentMethodName + */ + public function iChoosePaymentMethod(string $paymentMethodName): void + { + $this->iGoToTheChangePaymentMethodPage(); + $this->orderDetails->choosePaymentMethod($paymentMethodName); + $this->orderDetails->pay(); + } + /** * @Then I should be able to access this order's details */ diff --git a/src/Sylius/Behat/Page/Shop/Order/ShowPage.php b/src/Sylius/Behat/Page/Shop/Order/ShowPage.php index 7c3879525a24..d267dc519873 100644 --- a/src/Sylius/Behat/Page/Shop/Order/ShowPage.php +++ b/src/Sylius/Behat/Page/Shop/Order/ShowPage.php @@ -59,6 +59,19 @@ public function getAmountOfItems(): int return count($paymentItems); } + public function getChosenPaymentMethod(): string + { + $paymentMethodItems = $this->getDocument()->findAll('css', '[data-test-payment-item]'); + + foreach ($paymentMethodItems as $method) { + if ($method->find('css', '[data-test-payment-method-select]')->hasAttribute('checked')) { + return $method->find('css', 'a')->getText(); + } + } + + return ''; + } + protected function getDefinedElements(): array { return array_merge(parent::getDefinedElements(), [ diff --git a/src/Sylius/Behat/Page/Shop/Order/ShowPageInterface.php b/src/Sylius/Behat/Page/Shop/Order/ShowPageInterface.php index 185bea6a2fbd..e5b2df8b4fa6 100644 --- a/src/Sylius/Behat/Page/Shop/Order/ShowPageInterface.php +++ b/src/Sylius/Behat/Page/Shop/Order/ShowPageInterface.php @@ -26,4 +26,6 @@ public function choosePaymentMethod(string $paymentMethodName): void; public function getNotifications(): array; public function getAmountOfItems(): int; + + public function getChosenPaymentMethod(): string; } diff --git a/src/Sylius/Behat/Resources/config/services/contexts/ui.xml b/src/Sylius/Behat/Resources/config/services/contexts/ui.xml index 6cb827514e08..5f6f24747563 100644 --- a/src/Sylius/Behat/Resources/config/services/contexts/ui.xml +++ b/src/Sylius/Behat/Resources/config/services/contexts/ui.xml @@ -319,12 +319,14 @@ - + + + diff --git a/src/Sylius/Bundle/ApiBundle/CommandHandler/Checkout/ChoosePaymentMethodHandler.php b/src/Sylius/Bundle/ApiBundle/CommandHandler/Checkout/ChoosePaymentMethodHandler.php index 372ad0481779..eb1ecd06ecdb 100644 --- a/src/Sylius/Bundle/ApiBundle/CommandHandler/Checkout/ChoosePaymentMethodHandler.php +++ b/src/Sylius/Bundle/ApiBundle/CommandHandler/Checkout/ChoosePaymentMethodHandler.php @@ -71,7 +71,8 @@ public function __invoke(ChoosePaymentMethod $choosePaymentMethod): OrderInterfa if (in_array( $cart->getCheckoutState(), [OrderCheckoutStates::STATE_SHIPPING_SELECTED, OrderCheckoutStates::STATE_SHIPPING_SKIPPED, OrderCheckoutStates::STATE_PAYMENT_SELECTED], - true)) { + true) + ) { $stateMachine = $this->stateMachineFactory->get($cart, OrderCheckoutTransitions::GRAPH); Assert::true($stateMachine->can( diff --git a/src/Sylius/Bundle/ApiBundle/Doctrine/QueryItemExtension/OrderMethodsItemExtension.php b/src/Sylius/Bundle/ApiBundle/Doctrine/QueryItemExtension/OrderMethodsItemExtension.php index 324f3a751a7b..6fd8fd30860c 100644 --- a/src/Sylius/Bundle/ApiBundle/Doctrine/QueryItemExtension/OrderMethodsItemExtension.php +++ b/src/Sylius/Bundle/ApiBundle/Doctrine/QueryItemExtension/OrderMethodsItemExtension.php @@ -67,14 +67,7 @@ private function applyUserRulesToItem( string $httpRequestMethodType, string $operationName ): void { - if ($user === null && $operationName === 'shop_select_payment_method') { - $queryBuilder - ->leftJoin(sprintf('%s.customer', $rootAlias), 'customer') - ->leftJoin('customer.user', 'user') - ->andWhere('user IS NULL') - ->orWhere(sprintf('%s.customer IS NULL', $rootAlias)) - ; - + if ($operationName === 'shop_select_payment_method') { return; } diff --git a/src/Sylius/Bundle/ApiBundle/Resources/config/api_resources/Payment.xml b/src/Sylius/Bundle/ApiBundle/Resources/config/api_resources/Payment.xml index f0aa1fa07797..874fb7f7e654 100644 --- a/src/Sylius/Bundle/ApiBundle/Resources/config/api_resources/Payment.xml +++ b/src/Sylius/Bundle/ApiBundle/Resources/config/api_resources/Payment.xml @@ -44,6 +44,11 @@ /admin/payments/{id} + + GET + /shop/payments/{id} + + PATCH false diff --git a/src/Sylius/Bundle/ApiBundle/Resources/config/serialization/PaymentMethod.xml b/src/Sylius/Bundle/ApiBundle/Resources/config/serialization/PaymentMethod.xml index d453a2118fe6..439bdc0aaafd 100644 --- a/src/Sylius/Bundle/ApiBundle/Resources/config/serialization/PaymentMethod.xml +++ b/src/Sylius/Bundle/ApiBundle/Resources/config/serialization/PaymentMethod.xml @@ -21,6 +21,7 @@ payment_method:read + payment:read checkout:read