From 0836d0c2c189d0b8ff7c4f641c9a6782c001530d Mon Sep 17 00:00:00 2001 From: Shay Frendt Date: Fri, 15 Jun 2012 15:34:49 -0400 Subject: [PATCH] Always pass CVV on card update for Braintree Blue Always passing the CVV allows for "updating a credit card and explicitly verifying the card" at the same time: https://www.braintreepayments.com/docs/ruby/general/card_verification#credit_card_api --- .../billing/gateways/braintree_blue.rb | 1 + test/unit/gateways/braintree_blue_test.rb | 30 +++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/lib/active_merchant/billing/gateways/braintree_blue.rb b/lib/active_merchant/billing/gateways/braintree_blue.rb index bae1fae814f..e23c5569a56 100644 --- a/lib/active_merchant/billing/gateways/braintree_blue.rb +++ b/lib/active_merchant/billing/gateways/braintree_blue.rb @@ -105,6 +105,7 @@ def update(vault_id, creditcard, options = {}) credit_card_params = merge_credit_card_options({ :credit_card => { :number => creditcard.number, + :cvv => creditcard.verification_value, :expiration_month => creditcard.month.to_s.rjust(2, "0"), :expiration_year => creditcard.year.to_s } diff --git a/test/unit/gateways/braintree_blue_test.rb b/test/unit/gateways/braintree_blue_test.rb index 0bf3e9e8205..4ca4d58383f 100644 --- a/test/unit/gateways/braintree_blue_test.rb +++ b/test/unit/gateways/braintree_blue_test.rb @@ -150,6 +150,36 @@ def test_store_with_billing_address_options @gateway.store(credit_card("41111111111111111111"), :billing_address => billing_address) end + def test_update_with_cvv + stored_credit_card = mock(:token => "token", :default? => true) + customer = mock(:credit_cards => [stored_credit_card], :id => '123') + Braintree::Customer.stubs(:find).with('vault_id').returns(customer) + BraintreeBlueGateway.any_instance.stubs(:customer_hash) + + result = Braintree::SuccessfulResult.new(:customer => customer) + Braintree::Customer.expects(:update).with do |vault, params| + assert_equal "567", params[:credit_card][:cvv] + [vault, params] + end.returns(result) + + @gateway.update('vault_id', credit_card("41111111111111111111", :verification_value => "567")) + end + + def test_update_with_verify_card_true + stored_credit_card = mock(:token => "token", :default? => true) + customer = mock(:credit_cards => [stored_credit_card], :id => '123') + Braintree::Customer.stubs(:find).with('vault_id').returns(customer) + BraintreeBlueGateway.any_instance.stubs(:customer_hash) + + result = Braintree::SuccessfulResult.new(:customer => customer) + Braintree::Customer.expects(:update).with do |vault, params| + assert_equal true, params[:credit_card][:options][:verify_card] + [vault, params] + end.returns(result) + + @gateway.update('vault_id', credit_card("41111111111111111111"), :verify_card => true) + end + def test_merge_credit_card_options_ignores_bad_option params = {:first_name => 'John', :credit_card => {:cvv => '123'}} options = {:verify_card => true, :bogus => 'ignore me'}