require File.dirname(__FILE__) + '/../../test_helper'
class AuthorizeNetTest < Test::Unit::TestCase
def setup
@gateway = AuthorizeNetGateway.new(
:login => 'X',
:password => 'Y'
)
@amount = 100
@credit_card = credit_card
@subscription_id = '100748'
end
def test_successful_authorization
@gateway.expects(:ssl_post).returns(successful_authorization_response)
assert response = @gateway.authorize(@amount, @credit_card)
assert_instance_of Response, response
assert_success response
assert_equal '508141794', response.authorization
end
def test_successful_purchase
@gateway.expects(:ssl_post).returns(successful_purchase_response)
assert response = @gateway.purchase(@amount, @credit_card)
assert_instance_of Response, response
assert_success response
assert_equal '508141795', response.authorization
end
def test_failed_authorization
@gateway.expects(:ssl_post).returns(failed_authorization_response)
assert response = @gateway.authorize(@amount, @credit_card)
assert_instance_of Response, response
assert_failure response
assert_equal '508141794', response.authorization
end
def test_add_address_outsite_north_america
result = {}
@gateway.send(:add_address, result, :billing_address => {:address1 => '164 Waverley Street', :country => 'DE', :state => ''} )
assert_equal ["address", "city", "company", "country", "phone", "state", "zip"], result.stringify_keys.keys.sort
assert_equal 'n/a', result[:state]
assert_equal '164 Waverley Street', result[:address]
assert_equal 'DE', result[:country]
end
def test_add_address
result = {}
@gateway.send(:add_address, result, :billing_address => {:address1 => '164 Waverley Street', :country => 'US', :state => 'CO'} )
assert_equal ["address", "city", "company", "country", "phone", "state", "zip"], result.stringify_keys.keys.sort
assert_equal 'CO', result[:state]
assert_equal '164 Waverley Street', result[:address]
assert_equal 'US', result[:country]
end
def test_add_invoice
result = {}
@gateway.send(:add_invoice, result, :order_id => '#1001')
assert_equal '#1001', result[:invoice_num]
end
def test_add_description
result = {}
@gateway.send(:add_invoice, result, :description => 'My Purchase is great')
assert_equal 'My Purchase is great', result[:description]
end
def test_add_duplicate_window_without_duplicate_window
result = {}
ActiveMerchant::Billing::AuthorizeNetGateway.duplicate_window = nil
@gateway.send(:add_duplicate_window, result)
assert_nil result[:duplicate_window]
end
def test_add_duplicate_window_with_duplicate_window
result = {}
ActiveMerchant::Billing::AuthorizeNetGateway.duplicate_window = 0
@gateway.send(:add_duplicate_window, result)
assert_equal 0, result[:duplicate_window]
end
def test_purchase_is_valid_csv
params = { :amount => '1.01' }
@gateway.send(:add_creditcard, params, @credit_card)
assert data = @gateway.send(:post_data, 'AUTH_ONLY', params)
assert_equal post_data_fixture.size, data.size
end
def test_purchase_meets_minimum_requirements
params = {
:amount => "1.01",
}
@gateway.send(:add_creditcard, params, @credit_card)
assert data = @gateway.send(:post_data, 'AUTH_ONLY', params)
minimum_requirements.each do |key|
assert_not_nil(data =~ /x_#{key}=/)
end
end
def test_successful_credit
@gateway.expects(:ssl_post).returns(successful_purchase_response)
assert response = @gateway.credit(@amount, '123456789', :card_number => @credit_card.number)
assert_success response
assert_equal 'This transaction has been approved', response.message
end
def test_failed_credit
@gateway.expects(:ssl_post).returns(failed_credit_response)
assert response = @gateway.credit(@amount, '123456789', :card_number => @credit_card.number)
assert_failure response
assert_equal 'The referenced transaction does not meet the criteria for issuing a credit', response.message
end
def test_supported_countries
assert_equal ['US'], AuthorizeNetGateway.supported_countries
end
def test_supported_card_types
assert_equal [:visa, :master, :american_express, :discover], AuthorizeNetGateway.supported_cardtypes
end
def test_failure_without_response_reason_text
assert_nothing_raised do
assert_equal '', @gateway.send(:message_from, {})
end
end
def test_response_under_review_by_fraud_service
@gateway.expects(:ssl_post).returns(fraud_review_response)
response = @gateway.purchase(@amount, @credit_card)
assert_failure response
assert response.fraud_review?
assert_equal "Thank you! For security reasons your order is currently being reviewed", response.message
end
def test_avs_result
@gateway.expects(:ssl_post).returns(fraud_review_response)
response = @gateway.purchase(@amount, @credit_card)
assert_equal 'X', response.avs_result['code']
end
def test_cvv_result
@gateway.expects(:ssl_post).returns(fraud_review_response)
response = @gateway.purchase(@amount, @credit_card)
assert_equal 'M', response.cvv_result['code']
end
# ARB Unit Tests
def test_successful_recurring
@gateway.expects(:ssl_post).returns(successful_recurring_response)
response = @gateway.recurring(@amount, @credit_card,
:billing_address => address.merge(:first_name => 'Jim', :last_name => 'Smith'),
:interval => {
:length => 10,
:unit => :days
},
:duration => {
:start_date => Time.now.strftime("%Y-%m-%d"),
:occurrences => 30
}
)
assert_instance_of Response, response
assert response.success?
assert response.test?
assert_equal @subscription_id, response.authorization
end
def test_successful_update_recurring
@gateway.expects(:ssl_post).returns(successful_update_recurring_response)
response = @gateway.update_recurring(:subscription_id => @subscription_id, :amount => @amount * 2)
assert_instance_of Response, response
assert response.success?
assert response.test?
assert_equal @subscription_id, response.authorization
end
def test_successful_cancel_recurring
@gateway.expects(:ssl_post).returns(successful_cancel_recurring_response)
response = @gateway.cancel_recurring(@subscription_id)
assert_instance_of Response, response
assert response.success?
assert response.test?
assert_equal @subscription_id, response.authorization
end
def test_expdate_formatting
assert_equal '2009-09', @gateway.send(:arb_expdate, credit_card('4111111111111111', :month => "9", :year => "2009"))
assert_equal '2013-11', @gateway.send(:arb_expdate, credit_card('4111111111111111', :month => "11", :year => "2013"))
end
private
def post_data_fixture
'x_encap_char=%24&x_card_num=4242424242424242&x_exp_date=0806&x_card_code=123&x_type=AUTH_ONLY&x_first_name=Longbob&x_version=3.1&x_login=X&x_last_name=Longsen&x_tran_key=Y&x_relay_response=FALSE&x_delim_data=TRUE&x_delim_char=%2C&x_amount=1.01'
end
def minimum_requirements
%w(version delim_data relay_response login tran_key amount card_num exp_date type)
end
def failed_credit_response
'$3$,$2$,$54$,$The referenced transaction does not meet the criteria for issuing a credit.$,$$,$P$,$0$,$$,$$,$1.00$,$CC$,$credit$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$39265D8BA0CDD4F045B5F4129B2AAA01$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$'
end
def successful_authorization_response
'$1$,$1$,$1$,$This transaction has been approved.$,$advE7f$,$Y$,$508141794$,$5b3fe66005f3da0ebe51$,$$,$1.00$,$CC$,$auth_only$,$$,$Longbob$,$Longsen$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$2860A297E0FE804BCB9EF8738599645C$,$P$,$2$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$'
end
def successful_purchase_response
'$1$,$1$,$1$,$This transaction has been approved.$,$d1GENk$,$Y$,$508141795$,$32968c18334f16525227$,$Store purchase$,$1.00$,$CC$,$auth_capture$,$$,$Longbob$,$Longsen$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$269862C030129C1173727CC10B1935ED$,$P$,$2$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$'
end
def failed_authorization_response
'$2$,$1$,$1$,$This transaction was declined.$,$advE7f$,$Y$,$508141794$,$5b3fe66005f3da0ebe51$,$$,$1.00$,$CC$,$auth_only$,$$,$Longbob$,$Longsen$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$2860A297E0FE804BCB9EF8738599645C$,$P$,$2$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$'
end
def fraud_review_response
"$4$,$$,$253$,$Thank you! For security reasons your order is currently being reviewed.$,$$,$X$,$0$,$$,$$,$1.00$,$$,$auth_capture$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$207BCBBF78E85CF174C87AE286B472D2$,$M$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$,$$"
end
def successful_recurring_response
<<-XML
Sample
Ok
I00001
Successful.
#{@subscription_id}
XML
end
def successful_update_recurring_response
<<-XML
Sample
Ok
I00001
Successful.
#{@subscription_id}
XML
end
def successful_cancel_recurring_response
<<-XML
Sample
Ok
I00001
Successful.
#{@subscription_id}
XML
end
end