commerce-8.x-2.8/modules/payment/tests/src/Functional/PaymentMethodTest.php
modules/payment/tests/src/Functional/PaymentMethodTest.php
<?php
namespace Drupal\Tests\commerce_payment\Functional;
use Drupal\commerce_payment\Entity\PaymentMethod;
use Drupal\Tests\commerce\Functional\CommerceBrowserTestBase;
/**
* Tests the payment method UI.
*
* @group commerce
*/
class PaymentMethodTest extends CommerceBrowserTestBase {
/**
* A normal user with minimum permissions.
*
* @var \Drupal\User\UserInterface
*/
protected $user;
/**
* The payment method collection url.
*
* @var string
*/
protected $collectionUrl;
/**
* An on-site payment gateway.
*
* @var \Drupal\commerce_payment\Entity\PaymentGatewayInterface
*/
protected $paymentGateway;
/**
* {@inheritdoc}
*/
public static $modules = [
'commerce_payment',
'commerce_payment_example',
];
/**
* {@inheritdoc}
*/
protected function setUp() {
parent::setUp();
$permissions = [
'manage own commerce_payment_method',
];
$this->user = $this->drupalCreateUser($permissions);
$this->drupalLogin($this->user);
$this->collectionUrl = 'user/' . $this->user->id() . '/payment-methods';
/** @var \Drupal\commerce_payment\Entity\PaymentGateway $payment_gateway */
$this->paymentGateway = $this->createEntity('commerce_payment_gateway', [
'id' => 'example',
'label' => 'Example',
'plugin' => 'example_onsite',
]);
}
/**
* Tests accessing another user's payment method pages.
*/
public function testDifferentUserAccess() {
$this->drupalGet('user/' . $this->adminUser->id() . '/payment-methods');
$this->assertSession()->statusCodeEquals(403);
$this->drupalGet('user/' . $this->adminUser->id() . '/payment-methods/add');
$this->assertSession()->statusCodeEquals(403);
}
/**
* Tests creating and updating a payment method.
*/
public function testPaymentMethodCreationAndUpdate() {
/** @var \Drupal\commerce_payment_example\Plugin\Commerce\PaymentGateway\OnsiteInterface $plugin */
$this->drupalGet($this->collectionUrl);
$this->getSession()->getPage()->clickLink('Add payment method');
$this->assertSession()->addressEquals($this->collectionUrl . '/add');
$form_values = [
'payment_method[payment_details][number]' => '4111111111111111',
'payment_method[payment_details][expiration][month]' => '01',
'payment_method[payment_details][expiration][year]' => date('Y') + 1,
'payment_method[payment_details][security_code]' => '111',
'payment_method[billing_information][address][0][address][given_name]' => 'Johnny',
'payment_method[billing_information][address][0][address][family_name]' => 'Appleseed',
'payment_method[billing_information][address][0][address][address_line1]' => '123 New York Drive',
'payment_method[billing_information][address][0][address][locality]' => 'New York City',
'payment_method[billing_information][address][0][address][administrative_area]' => 'NY',
'payment_method[billing_information][address][0][address][postal_code]' => '10001',
];
$this->submitForm($form_values, 'Save');
$this->assertSession()->addressEquals($this->collectionUrl);
$this->assertSession()->pageTextContains('Visa ending in 1111 saved to your payment methods.');
$payment_method = PaymentMethod::load(1);
$billing_profile = $payment_method->getBillingProfile();
$this->assertEquals($this->user->id(), $payment_method->getOwnerId());
$this->assertEquals('NY', $billing_profile->get('address')->first()->getAdministrativeArea());
$this->assertEquals(1, $payment_method->getBillingProfile()->id());
$this->drupalGet($this->collectionUrl . '/' . $payment_method->id() . '/edit');
$form_values = [
'payment_method[payment_details][expiration][month]' => '02',
'payment_method[payment_details][expiration][year]' => '2026',
'payment_method[billing_information][address][0][address][given_name]' => 'Johnny',
'payment_method[billing_information][address][0][address][family_name]' => 'Appleseed',
'payment_method[billing_information][address][0][address][address_line1]' => '123 New York Drive',
'payment_method[billing_information][address][0][address][locality]' => 'Greenville',
'payment_method[billing_information][address][0][address][administrative_area]' => 'SC',
'payment_method[billing_information][address][0][address][postal_code]' => '29615',
];
$this->submitForm($form_values, 'Save');
$this->assertSession()->addressEquals($this->collectionUrl);
$this->assertSession()->pageTextContains('2/2026');
\Drupal::entityTypeManager()->getStorage('commerce_payment_method')->resetCache([1]);
\Drupal::entityTypeManager()->getStorage('profile')->resetCache([1]);
$payment_method = PaymentMethod::load(1);
$this->assertEquals('2026', $payment_method->get('card_exp_year')->value);
$billing_profile = $payment_method->getBillingProfile();
$this->assertEquals($this->user->id(), $payment_method->getOwnerId());
$this->assertEquals('SC', $billing_profile->get('address')->first()->getAdministrativeArea());
$this->assertEquals(1, $payment_method->getBillingProfile()->id());
}
/**
* Tests deleting a payment method.
*/
public function testPaymentMethodDeletion() {
$payment_method = $this->createEntity('commerce_payment_method', [
'uid' => $this->user->id(),
'type' => 'credit_card',
'payment_gateway' => 'example',
]);
$details = [
'type' => 'visa',
'number' => '4111111111111111',
'expiration' => ['month' => '01', 'year' => date("Y") + 1],
];
$this->paymentGateway->getPlugin()->createPaymentMethod($payment_method, $details);
$this->paymentGateway->save();
$this->drupalGet($this->collectionUrl . '/' . $payment_method->id() . '/delete');
$this->getSession()->getPage()->pressButton('Delete');
$this->assertSession()->addressEquals($this->collectionUrl);
$payment_gateway = PaymentMethod::load($payment_method->id());
$this->assertNull($payment_gateway);
}
}
