View source
<?php
namespace Drupal\Tests\uc_credit\Functional;
use Drupal\Tests\uc_store\Functional\UbercartBrowserTestBase;
class CreditCardTest extends UbercartBrowserTestBase {
protected static $cardTestNumbers = [
'378282246310005',
'371449635398431',
'370000000000002',
'378734493671000',
'5610591081018250',
'30569309025904',
'38520000023237',
'38000000000006',
'6011111111111117',
'6011000990139424',
'6011000000000012',
'3530111333300000',
'3566002020360505',
'3088000000000017',
'5555555555554444',
'5105105105105100',
'4111111111111111',
'4012888888881881',
'4007000000027',
'4012888818888',
];
protected $paymentMethod;
protected static $modules = [
'uc_payment',
'uc_credit',
];
protected static $adminPermissions = [
'administer credit cards',
'process credit cards',
];
protected function setUp() {
parent::setUp();
$this
->drupalLogin($this->adminUser);
$this
->configureCreditCard();
$this
->configureGateway();
}
public function testSecuritySettings() {
$assert = $this
->assertSession();
\Drupal::service('file_system')
->mkdir('sites/default/files/testkey', 0755);
$config = \Drupal::configFactory()
->getEditable('uc_credit.settings');
$temp_variable = $config
->get('encryption_path');
$config
->set('encryption_path', '')
->save();
$this
->drupalGet('admin/store');
$assert
->pageTextContains('You must review your credit card security settings and enable encryption before you can accept credit card payments.');
$this
->drupalGet('admin/store/config/payment/credit');
$this
->submitForm([], 'Save configuration');
$assert
->fieldValueEquals('uc_credit_encryption_path', 'Not configured.');
$config
->set('encryption_path', $temp_variable)
->save();
$this
->drupalGet('admin/store/config/payment/credit');
$this
->submitForm([
'uc_credit_encryption_path' => '',
], 'Save configuration');
$assert
->pageTextContains('Key path must be specified in security settings tab.');
$this
->drupalGet('admin/store/config/payment/credit');
$this
->submitForm([
'uc_credit_encryption_path' => 'sites/default/ljkh/asdfasfaaaaa',
], 'Save configuration');
$assert
->pageTextContains('You have specified a non-existent directory.');
$this
->drupalGet('admin/store/config/payment/credit');
$this
->submitForm([
'uc_credit_encryption_path' => '/dev',
], 'Save configuration');
$assert
->pageTextContains('Cannot write to directory, please verify the directory permissions.');
$this
->drupalGet('admin/store/config/payment/credit');
$this
->submitForm([
'uc_credit_encryption_path' => ' sites/default/files/testkey/ ',
], 'Save configuration');
$assert
->fieldValueEquals('uc_credit_encryption_path', 'sites/default/files/testkey');
$assert
->pageTextContains('Credit card encryption key file generated.');
$assert
->pageTextNotContains('Credit card security settings must be configured in the security settings tab.');
\Drupal::service('file_system')
->unlink('sites/default/files/testkey/' . UC_CREDIT_KEYFILE_NAME);
$this
->drupalGet('admin/store/config/payment/credit');
$this
->submitForm([
'uc_credit_encryption_path' => 'sites/default/files/testkey',
], 'Save configuration');
$assert
->pageTextContains('Credit card encryption key file generated.');
$this
->assertTrue(file_exists('sites/default/files/simpletest.keys/' . UC_CREDIT_KEYFILE_NAME), 'Key has been generated and stored.');
$this
->assertTrue(preg_match("([0-9a-fA-F]{32})", uc_credit_encryption_key()), 'Valid key detected in key file.');
\Drupal::service('file_system')
->unlink('sites/default/files/testkey/' . UC_CREDIT_KEYFILE_NAME);
\Drupal::service('file_system')
->rmdir('sites/default/files/testkey');
}
public function testCheckout() {
$assert = $this
->assertSession();
$this
->addToCart($this->product);
$edit = $this
->populateCheckoutForm([
'panes[payment][details][cc_number]' => array_rand(array_flip(self::$cardTestNumbers)),
'panes[payment][details][cc_cvv]' => mt_rand(100, 999),
'panes[payment][details][cc_exp_month]' => mt_rand(1, 12),
'panes[payment][details][cc_exp_year]' => mt_rand(date('Y') + 1, 2022),
]);
$this
->drupalGet('cart/checkout');
$this
->submitForm($edit, 'Review order');
$assert
->pageTextContains('(Last 4) ' . substr($edit['panes[payment][details][cc_number]'], -4));
$assert
->pageTextContains($edit['panes[payment][details][cc_exp_year]']);
$this
->submitForm([], 'Back');
$assert
->fieldValueEquals('panes[payment][details][cc_number]', '(Last 4) ' . substr($edit['panes[payment][details][cc_number]'], -4));
$assert
->fieldValueEquals('panes[payment][details][cc_cvv]', '---');
$assert
->fieldValueEquals('panes[payment][details][cc_exp_month]', $edit['panes[payment][details][cc_exp_month]']);
$assert
->fieldValueEquals('panes[payment][details][cc_exp_year]', $edit['panes[payment][details][cc_exp_year]']);
$edit['panes[payment][details][cc_number]'] = array_rand(array_flip(self::$cardTestNumbers));
$edit['panes[payment][details][cc_cvv]'] = '000';
$this
->submitForm($edit, 'Review order');
$assert
->pageTextContains('(Last 4) ' . substr($edit['panes[payment][details][cc_number]'], -4));
$this
->submitForm([], 'Submit order');
$assert
->pageTextContains('We were unable to process your credit card payment. Please verify your details and try again.');
$this
->submitForm([], 'Back');
$assert
->fieldValueEquals('panes[payment][details][cc_number]', '(Last 4) ' . substr($edit['panes[payment][details][cc_number]'], -4));
$assert
->fieldValueEquals('panes[payment][details][cc_cvv]', '---');
$edit['panes[payment][details][cc_cvv]'] = mt_rand(100, 999);
$this
->submitForm($edit, 'Review order');
$this
->submitForm([], 'Submit order');
$assert
->pageTextContains('Your order is complete!');
}
public function testExpiryDate() {
$assert = $this
->assertSession();
$order = $this
->createOrder([
'payment_method' => $this->paymentMethod['id'],
]);
$year = date('Y');
$month = date('n');
for ($y = $year; $y <= $year + 2; $y++) {
for ($m = 1; $m <= 12; $m++) {
$edit = [
'amount' => 1,
'cc_data[cc_number]' => '4111111111111111',
'cc_data[cc_cvv]' => '123',
'cc_data[cc_exp_month]' => $m,
'cc_data[cc_exp_year]' => $y,
];
$this
->drupalGet('admin/store/orders/' . $order
->id() . '/credit/' . $this->paymentMethod['id']);
$this
->submitForm($edit, 'Charge amount');
if ($y > $year || $m >= $month) {
$assert
->pageTextContains('The credit card was processed successfully.');
}
else {
$assert
->pageTextNotContains('The credit card was processed successfully.');
}
}
}
}
protected function configureCreditCard() {
$assert = $this
->assertSession();
\Drupal::service('file_system')
->mkdir('sites/default/files/simpletest.keys', 0755);
$this
->drupalGet('admin/store/config/payment/credit');
$this
->submitForm([
'uc_credit_encryption_path' => 'sites/default/files/simpletest.keys',
], 'Save configuration');
$assert
->fieldValueEquals('uc_credit_encryption_path', 'sites/default/files/simpletest.keys');
$this
->assertTrue(file_exists('sites/default/files/simpletest.keys/' . UC_CREDIT_KEYFILE_NAME), 'Key has been generated and stored.');
$this
->assertTrue(TRUE, 'Key = ' . uc_credit_encryption_key());
}
protected function configureGateway() {
$this->paymentMethod = $this
->createPaymentMethod('test_gateway');
}
protected function tearDown() {
\Drupal::service('file_system')
->unlink('sites/default/files/simpletest.keys/' . UC_CREDIT_KEYFILE_NAME);
\Drupal::service('file_system')
->rmdir('sites/default/files/simpletest.keys');
parent::tearDown();
}
}