123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321 |
- <?php
- /**
- * @file
- * Credit card payment method tests.
- */
- /**
- * Tests credit card payments with the test gateway.
- *
- * This class is intended to be subclassed for use in testing other credit
- * card gateways. Subclasses which test other gateways need to:
- * - Define getInfo().
- * - Override setUp(), if necessary, to enable the other gateway and any other
- * needed modules.
- * - Override configureGateway() to implement gateway-specific configuration.
- * No other overrides are necessary, although a subclass may want to add
- * additional test functions to cover cases not included in this base class.
- */
- class UbercartCreditCardTestCase extends UbercartTestHelper {
- /**
- * A selection of "test" numbers to use for testing credit card payemnts.
- * These numbers all pass the Luhn algorithm check and are reserved by
- * the card issuer for testing purposes.
- */
- protected static $test_cards = array(
- '378282246310005', // American Express
- '371449635398431',
- '370000000000002',
- '378734493671000', // American Express Corporate
- '5610591081018250', // Australian BankCard
- '30569309025904', // Diners Club
- '38520000023237',
- '38000000000006', // Carte Blanche
- '6011111111111117', // Discover
- '6011000990139424',
- '6011000000000012',
- '3530111333300000', // JCB
- '3566002020360505',
- '3088000000000017',
- '5555555555554444', // MasterCard
- '5105105105105100',
- '4111111111111111', // Visa
- '4012888888881881',
- '4007000000027',
- '4012888818888',
- );
- /**
- * Describes this test case.
- */
- public static function getInfo() {
- return array(
- 'name' => 'Credit cards with Test Gateway',
- 'description' => 'Uses the Test Gateway to ensure credit card processing is functioning.',
- 'group' => 'Ubercart',
- );
- }
- /**
- * Implements DrupalWebTestCase::setUp().
- */
- protected function setUp($modules = array(), $permissions = array()) {
- $modules += array('uc_payment', 'uc_credit', 'test_gateway');
- $permissions = array('administer credit cards', 'process credit cards');
- parent::setUp($modules, $permissions);
- // Need admin permissions in order to change credit card settings.
- $this->drupalLogin($this->adminUser);
- // Configure and enable Credit card module and Test gateway.
- $this->configureCreditCard();
- $this->configureGateway();
- }
- /**
- * Helper function to configure Credit Card payment method settings.
- */
- protected function configureCreditCard() {
- $this->drupalPost(
- 'admin/store/settings/payment',
- array('uc_payment_method_credit_checkout' => TRUE),
- t('Save configuration')
- );
- $this->assertFieldByName(
- 'uc_payment_method_credit_checkout',
- TRUE,
- t('Credit card payment method is enabled')
- );
- // Create key directory, make it readable and writeable.
- // Putting this under sites/default/files because SimpleTest needs to be
- // able to create the directory - this is NOT where you'd put the key file
- // on a live site. On a live site, it should be outside the web root.
- drupal_mkdir('sites/default/files/simpletest.keys', 0755);
- $this->drupalPost(
- 'admin/store/settings/payment/method/credit',
- array(
- 'uc_credit_encryption_path' => 'sites/default/files/simpletest.keys',
- ),
- t('Save configuration')
- );
- $this->assertFieldByName(
- 'uc_credit_encryption_path',
- 'sites/default/files/simpletest.keys',
- t('Key file path has been set.')
- );
- $this->assertTrue(
- file_exists('sites/default/files/simpletest.keys/' . UC_CREDIT_KEYFILE_NAME),
- t('Key has been generated and stored.')
- );
- $this->pass('Key = ' . uc_credit_encryption_key());
- }
- /**
- * Helper function to configure Credit Card gateway.
- */
- protected function configureGateway() {
- $this->drupalPost(
- 'admin/store/settings/payment/method/credit',
- array(
- 'uc_payment_credit_gateway' => 'test_gateway',
- 'uc_pg_test_gateway_enabled' => TRUE,
- ),
- t('Save configuration')
- );
- $this->assertFieldByName(
- 'uc_pg_test_gateway_enabled',
- TRUE,
- t('Test gateway is enabled')
- );
- }
- /**
- * Implements DrupalWebTestCase::tearDown().
- */
- protected function tearDown() {
- // Cleanup keys directory after test.
- drupal_unlink('sites/default/files/simpletest.keys/' . UC_CREDIT_KEYFILE_NAME);
- drupal_rmdir('sites/default/files/simpletest.keys');
- parent::tearDown();
- }
- /**
- * Helper function. Creates a new order.
- */
- protected function createOrder($fields = array()) {
- $order = uc_order_new();
- foreach ($fields as $key => $value) {
- $order->$key = $value;
- }
- if (empty($order->primary_email)) {
- $order->primary_email = $this->randomString() . '@example.org';
- }
- if (!isset($fields['products'])) {
- $item = clone $this->product;
- $item->qty = 1;
- $item->price = $item->sell_price;
- $item->data = array();
- $order->products = array($item);
- }
- $order->order_total = uc_order_get_total($order, TRUE);
- $order->line_items = uc_order_load_line_items($order, TRUE);
- uc_order_save($order);
- return $order;
- }
- /**
- * Tests security settings configuration.
- */
- public function testSecuritySettings() {
- // TODO: Still need tests with existing key file
- // where key file is not readable or doesn't contain a valid key
- // Create key directory, make it readable and writeable.
- drupal_mkdir('sites/default/files/testkey', 0755);
- // Try to submit settings form without a key file path.
- // Save current variable, reset to its value when first installed.
- $temp_variable = variable_get('uc_credit_encryption_path', '');
- variable_set('uc_credit_encryption_path', '');
- $this->drupalGet('admin/store/settings/payment/method/credit');
- $this->assertText(t('Credit card security settings must be configured in the security settings tab.'));
- $this->drupalPost(
- 'admin/store/settings/payment/method/credit',
- array(),
- t('Save configuration')
- );
- $this->assertFieldByName(
- 'uc_credit_encryption_path',
- t('Not configured.'),
- t('Key file has not yet been configured.')
- );
- // Restore variable setting.
- variable_set('uc_credit_encryption_path', $temp_variable);
- // Try to submit settings form with an empty key file path.
- $this->drupalPost(
- 'admin/store/settings/payment/method/credit',
- array('uc_credit_encryption_path' => ''),
- t('Save configuration')
- );
- $this->assertText('Key path must be specified in security settings tab.');
- // Specify non-existent directory
- $this->drupalPost(
- 'admin/store/settings/payment/method/credit',
- array('uc_credit_encryption_path' => 'sites/default/ljkh/asdfasfaaaaa'),
- t('Save configuration')
- );
- $this->assertText('You have specified a non-existent directory.');
- // Next, specify existing directory that's write protected.
- // Use /dev, as that should never be accessible.
- $this->drupalPost(
- 'admin/store/settings/payment/method/credit',
- array('uc_credit_encryption_path' => '/dev'),
- t('Save configuration')
- );
- $this->assertText('Cannot write to directory, please verify the directory permissions.');
- // Next, specify writeable directory, but with excess whitespace
- // and trailing /
- $this->drupalPost(
- 'admin/store/settings/payment/method/credit',
- array('uc_credit_encryption_path' => ' sites/default/files/testkey/ '),
- t('Save configuration')
- );
- // See that the directory has been properly re-written to remove
- // whitespace and trailing /
- $this->assertFieldByName(
- 'uc_credit_encryption_path',
- 'sites/default/files/testkey',
- t('Key file path has been set.')
- );
- $this->assertText('Credit card encryption key file generated.');
- // Check that warning about needing key file goes away.
- $this->assertNoText(t('Credit card security settings must be configured in the security settings tab.'));
- // Remove key file.
- drupal_unlink('sites/default/files/testkey/' . UC_CREDIT_KEYFILE_NAME);
- // Finally, specify good directory
- $this->drupalPost(
- 'admin/store/settings/payment/method/credit',
- array('uc_credit_encryption_path' => 'sites/default/files/testkey'),
- t('Save configuration')
- );
- $this->assertText('Credit card encryption key file generated.');
- // Test contents - must contain 32-character hexadecimal string.
- $this->assertTrue(
- file_exists('sites/default/files/simpletest.keys/' . UC_CREDIT_KEYFILE_NAME),
- t('Key has been generated and stored.')
- );
- $this->assertTrue(
- preg_match("([0-9a-fA-F]{32})", uc_credit_encryption_key()),
- t('Valid key detected in key file.')
- );
- // Cleanup keys directory after test.
- drupal_unlink('sites/default/files/testkey/' . UC_CREDIT_KEYFILE_NAME);
- drupal_rmdir('sites/default/files/testkey');
- }
- /**
- * Tests that an order can be placed using the test gateway.
- */
- public function testCheckout() {
- $this->drupalPost('node/' . $this->product->nid, array(), t('Add to cart'));
- $this->checkout(array(
- 'panes[payment][details][cc_number]' => array_rand(array_flip(self::$test_cards)),
- '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->assertText('Your order is complete!');
- }
- /**
- * Tests that expiry date validation functions correctly.
- */
- public function testExpiryDate() {
- $order = $this->createOrder(array('payment_method' => 'credit'));
- $year = date('Y');
- $month = date('n');
- for ($y = $year; $y <= $year + 2; $y++) {
- for ($m = 1; $m <= 12; $m++) {
- $edit = array(
- '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->drupalPost('admin/store/orders/' . $order->order_id . '/credit', $edit, 'Charge amount');
- if ($y > $year || $m >= $month) {
- $this->assertText('The credit card was processed successfully.', t('Card with expiry date @month/@year passed validation.', array('@month' => $m, '@year' => $y)));
- }
- else {
- $this->assertNoText('The credit card was processed successfully.', t('Card with expiry date @month/@year correctly failed validation.', array('@month' => $m, '@year' => $y)));
- }
- }
- }
- }
- }
|