require 'test_helper'

class ElavonTest < Test::Unit::TestCase
  def setup
    @gateway = ElavonGateway.new(
                 :login => 'login',
                 :user => 'user',
                 :password => 'password'
               )

    @credit_card = credit_card
    @amount = 100
    
    @options = { 
      :order_id => '1',
      :billing_address => address,
      :description => 'Store Purchase'
    }
  end
  
  def test_successful_purchase
    @gateway.expects(:ssl_post).returns(successful_purchase_response)
    
    assert response = @gateway.purchase(@amount, @credit_card, @options)
    assert_success response
    assert_equal '123456', response.authorization
    assert response.test?
  end
  
  def test_successful_authorization
    @gateway.expects(:ssl_post).returns(successful_authorization_response)
    
    assert response = @gateway.authorize(@amount, @credit_card, @options)
    assert_instance_of Response, response
    assert_success response
    
    assert_equal '123456', response.authorization
    assert_equal "APPROVED", response.message
    assert response.test?
  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
  end

  def test_unsuccessful_purchase
    @gateway.expects(:ssl_post).returns(failed_purchase_response)
    
    assert response = @gateway.purchase(@amount, @credit_card, @options)
    assert_failure response
    assert response.test?
  end
  
  def test_invalid_login
    @gateway.expects(:ssl_post).returns(invalid_login_response)
    
    assert response = @gateway.purchase(@amount, @credit_card, @options)
    
    assert_equal '7000', response.params['result']
    assert_equal 'The VirtualMerchant ID and/or User ID supplied in the authorization request is invalid.', response.message
    assert_failure response
  end

  def test_supported_countries
    assert_equal ['US', 'CA'], ElavonGateway.supported_countries
  end

  def test_supported_card_types
    assert_equal [:visa, :master, :american_express, :discover], ElavonGateway.supported_cardtypes
  end

  def test_avs_result
    @gateway.expects(:ssl_post).returns(successful_purchase_response)
    response = @gateway.purchase(@amount, @credit_card)
    assert_equal 'X', response.avs_result['code']
  end

  def test_cvv_result
    @gateway.expects(:ssl_post).returns(successful_purchase_response)
    response = @gateway.purchase(@amount, @credit_card)
    assert_equal 'P', response.cvv_result['code']
  end

  private
  def successful_purchase_response
    "ssl_card_number=42********4242
    ssl_exp_date=0910
    ssl_amount=1.00
    ssl_invoice_number=
    ssl_description=Test Transaction
    ssl_result=0
    ssl_result_message=APPROVED
    ssl_txn_id=00000000-0000-0000-0000-00000000000
    ssl_approval_code=123456
    ssl_cvv2_response=P
    ssl_avs_response=X
    ssl_account_balance=0.00
    ssl_txn_time=08/07/2009 09:54:18 PM"
  end
  
  def failed_purchase_response
    "errorCode=5000
    errorName=Credit Card Number Invalid
    errorMessage=The Credit Card Number supplied in the authorization request appears to be invalid."
  end
  
  def invalid_login_response
        <<-RESPONSE
    ssl_result=7000\r
    ssl_result_message=The VirtualMerchant ID and/or User ID supplied in the authorization request is invalid.\r
        RESPONSE
  end
  
  def successful_authorization_response
    "ssl_card_number=42********4242
    ssl_exp_date=0910
    ssl_amount=1.00
    ssl_invoice_number=
    ssl_description=Test Transaction
    ssl_result=0
    ssl_result_message=APPROVED
    ssl_txn_id=00000000-0000-0000-0000-00000000000
    ssl_approval_code=123456
    ssl_cvv2_response=P
    ssl_avs_response=X
    ssl_account_balance=0.00
    ssl_txn_time=08/07/2009 09:56:11 PM"
  end
  
  def failed_authorization_response
    "errorCode=5000
    errorName=Credit Card Number Invalid
    errorMessage=The Credit Card Number supplied in the authorization request appears to be invalid."
  end
end