Skip to content

Commit

Permalink
ACP-3652 Do not change is active flag when payment method already exi…
Browse files Browse the repository at this point in the history
…sts. (#11039)

ACP-3652 [Stripe] Updating app configuration causes payment method to be deactivated
  • Loading branch information
stereomon authored Aug 7, 2024
1 parent 274e646 commit 328939e
Show file tree
Hide file tree
Showing 4 changed files with 93 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,8 @@ public function addPaymentMethod(AddPaymentMethodTransfer $addPaymentMethodTrans
new PaymentMethodTransfer(),
);

$paymentMethodTransfer->setPaymentMethodKey($this->getPaymentMethodKey($paymentMethodTransfer));

$messageAttributes = $addPaymentMethodTransfer->getMessageAttributesOrFail();
$existingPaymentMethodTransfer = $this->findExistentPaymentMethod($paymentMethodTransfer);

Expand Down Expand Up @@ -352,12 +354,12 @@ protected function preparePaymentMethodToSave(
$paymentMethodTransfer
->setName($paymentMethodTransfer->getLabelName())
->setIdPaymentProvider($paymentProviderTransfer->getIdPaymentProvider())
->setPaymentMethodKey($paymentMethodKey);
->setPaymentMethodKey($paymentMethodKey)
->setIsActive(false)
->setIsForeign(true);
}

$paymentMethodTransfer
->setIsActive(false)
->setIsForeign(true)
->setLastMessageTimestamp($messageTimestamp);

return $paymentMethodTransfer;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,9 @@ public function havePaymentMethod(array $override = []): PaymentMethodTransfer
}

$paymentMethodEntity->setFkPaymentProvider($paymentMethodTransfer->getIdPaymentProvider());
if ($paymentMethodTransfer->getPaymentProvider()) {
$paymentMethodEntity->setGroupName($paymentMethodTransfer->getPaymentProvider()->getName());
}
$paymentMethodEntity->fromArray($modifiedPaymentMethodData);

$paymentMethodEntity->save();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,10 @@
use Spryker\Zed\Kernel\Container;
use Spryker\Zed\Payment\Business\Method\PaymentMethodReader;
use Spryker\Zed\Payment\Business\PaymentBusinessFactory;
use Spryker\Zed\Payment\Business\PaymentFacade;
use Spryker\Zed\Payment\PaymentConfig;
use Spryker\Zed\Payment\PaymentDependencyProvider;
use SprykerTest\Zed\Payment\PaymentBusinessTester;

/**
* Auto-generated group annotations
Expand Down Expand Up @@ -80,7 +82,7 @@ class PaymentFacadeTest extends Unit
/**
* @var \SprykerTest\Zed\Payment\PaymentBusinessTester
*/
protected $tester;
protected PaymentBusinessTester $tester;

/**
* @var \Spryker\Zed\Payment\Business\PaymentFacadeInterface|\Spryker\Zed\Kernel\Business\AbstractFacade
Expand Down Expand Up @@ -821,6 +823,86 @@ public function testAddPaymentMethodReturnsSavedPaymentMethodTransferWithCorrect
$this->assertSame($addPaymentMethodTransfer->getPaymentAuthorizationEndpoint(), $createdAddPaymentMethodTransfer->getPaymentAuthorizationEndpoint());
}

/**
* Reflecting an Update of a PaymentMethod.
*
* @return void
*/
public function testGivenThePaymentMethodAlreadyExistsAndIsActiveWhenTheAddPaymentMethodMessageIsHandledThenThePaymentMethodIsUpdatedAndIsStillActive(): void
{
// Arrange
$paymentMethodName = 'MethodName' . Uuid::uuid4()->toString();
$paymentProviderKey = 'ProviderKey' . Uuid::uuid4()->toString();

$paymentProviderTransfer = $this->tester->havePaymentProvider([PaymentProviderTransfer::PAYMENT_PROVIDER_KEY => $paymentProviderKey]);

$this->tester->havePaymentMethod([
PaymentMethodTransfer::IS_ACTIVE => true,
PaymentMethodTransfer::PAYMENT_METHOD_KEY => (new PaymentFacade())->generatePaymentMethodKey($paymentProviderKey, $paymentMethodName),
PaymentMethodTransfer::NAME => $paymentMethodName,
PaymentMethodTransfer::PAYMENT_PROVIDER => $paymentProviderTransfer,
PaymentMethodTransfer::ID_PAYMENT_PROVIDER => $paymentProviderTransfer->getIdPaymentProvider(),
PaymentMethodTransfer::IS_FOREIGN => true,
]);

$addPaymentMethodTransfer = $this->tester->haveAddPaymentMethodTransfer(
[
AddPaymentMethodTransfer::NAME => $paymentMethodName,
AddPaymentMethodTransfer::PROVIDER_NAME => $paymentProviderKey,
AddPaymentMethodTransfer::PAYMENT_AUTHORIZATION_ENDPOINT => 'redirect-url',
],
);

// Act
$createdPaymentMethodTransfer = $this->tester->getFacade()->addPaymentMethod($addPaymentMethodTransfer);

// Assert
$this->assertNotNull($createdPaymentMethodTransfer->getIdPaymentMethod());
$this->assertNotNull($createdPaymentMethodTransfer->getIdPaymentProvider());
$this->assertFalse($createdPaymentMethodTransfer->getIsHidden(), 'Expected that the payment method is visible but it is hidden');
$this->assertTrue($createdPaymentMethodTransfer->getIsActive(), 'Expected that the payment method is active but it is inactive');
}

/**
* Reflecting an Update of a PaymentMethod.
*
* @return void
*/
public function testGivenThePaymentMethodAlreadyExistsAndIsInactiveWhenTheAddPaymentMethodMessageIsHandledThenThePaymentMethodIsUpdatedAndIsStillInctive(): void
{
// Arrange
$paymentMethodName = 'MethodName' . Uuid::uuid4()->toString();
$paymentProviderKey = 'ProviderKey' . Uuid::uuid4()->toString();

$paymentProviderTransfer = $this->tester->havePaymentProvider([PaymentProviderTransfer::PAYMENT_PROVIDER_KEY => $paymentProviderKey]);

$this->tester->havePaymentMethod([
PaymentMethodTransfer::IS_ACTIVE => false,
PaymentMethodTransfer::PAYMENT_METHOD_KEY => (new PaymentFacade())->generatePaymentMethodKey($paymentProviderKey, $paymentMethodName),
PaymentMethodTransfer::NAME => $paymentMethodName,
PaymentMethodTransfer::PAYMENT_PROVIDER => $paymentProviderTransfer,
PaymentMethodTransfer::ID_PAYMENT_PROVIDER => $paymentProviderTransfer->getIdPaymentProvider(),
PaymentMethodTransfer::IS_FOREIGN => true,
]);

$addPaymentMethodTransfer = $this->tester->haveAddPaymentMethodTransfer(
[
AddPaymentMethodTransfer::NAME => $paymentMethodName,
AddPaymentMethodTransfer::PROVIDER_NAME => $paymentProviderKey,
AddPaymentMethodTransfer::PAYMENT_AUTHORIZATION_ENDPOINT => 'redirect-url',
],
);

// Act
$createdPaymentMethodTransfer = $this->tester->getFacade()->addPaymentMethod($addPaymentMethodTransfer);

// Assert
$this->assertNotNull($createdPaymentMethodTransfer->getIdPaymentMethod());
$this->assertNotNull($createdPaymentMethodTransfer->getIdPaymentProvider());
$this->assertFalse($createdPaymentMethodTransfer->getIsHidden(), 'Expected that the payment method is visible but it is hidden');
$this->assertFalse($createdPaymentMethodTransfer->getIsActive(), 'Expected that the payment method is inactive but it is active');
}

/**
* @return void
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@
* @method \Codeception\Lib\Friend haveFriend($name, $actorClass = null)
*
* @SuppressWarnings(\SprykerTest\Zed\Payment\PHPMD)
*
* @method \Spryker\Zed\Payment\Business\PaymentFacadeInterface getFacade(?string $moduleName = NULL)
*/
class PaymentBusinessTester extends Actor
{
Expand Down

0 comments on commit 328939e

Please sign in to comment.