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