require File.dirname(__FILE__) + '/../../test_helper'

class EwayTest < Test::Unit::TestCase
  def setup
    @gateway = EwayGateway.new(
      :login => '87654321'
    )

    @creditcard = credit_card('4646464646464646')
    
    @test_params_success = {
      :order_id => '1230123',
      :email => 'bob@testbob.com',
      :address => {
        :address1 => '1234 First St.',
        :address2 => 'Apt. 1',
        :city     => 'Melbourne',
        :state    => 'ACT',
        :country  => 'AU',
        :zip      => '12345'
      },
      :description => 'purchased items'
    }
   
    @xml_test_parameters = {
      :CustomerID => @test_params_success[:login],
      :CustomerInvoiceRef => @test_params_success[:order_id],
      :TotalAmount => 100,
      :CardNumber => @creditcard.number,
      :CardExpiryMonth => sprintf("%.2i", @creditcard.month),
      :CardExpiryYear => sprintf("%.4i", @creditcard.year)[-2..-1],
      :CustomerFirstName => @creditcard.first_name,
      :CustomerLastName => @creditcard.last_name,
      :CustomerEmail => @test_params_success[:email],
      :CustomerAddress => @test_params_success[:address][:address1],
      :CustomerPostcode => @test_params_success[:address][:zip],
      :CustomerInvoiceDescription => @test_params_success[:description],
      :CardHoldersName => @creditcard.name,
      :TrxnNumber => @test_params_success[:order_id],
      :Option1 => '',
      :Option2 => '',
      :Option3 => ''        
    }
  end

  def test_purchase_exceptions
    @creditcard.number = 3 
    
    assert_raise(Error) do
      assert response = @gateway.purchase(100, @creditcard, @test_params_success)    
    end
  end
       
  def test_amount_style
   assert_equal '1034', @gateway.send(:amount, 1034)
                                                      
   assert_raise(ArgumentError) do
     @gateway.send(:amount, '10.34')
   end
  end
  
  def test_purchase_is_valid_xml
   assert data = @gateway.send(:post_data, @xml_test_parameters)
   assert REXML::Document.new(data)
  end  

  def test_ensure_does_not_respond_to_authorize
    assert !@gateway.respond_to?(:authorize)
  end
  
  def test_ensure_does_not_respond_to_capture
    assert !@gateway.respond_to?(:capture)
  end
  
  def test_test_url_without_cvn
    assert_equal EwayGateway::TEST_URL, @gateway.send(:gateway_url, false, true)
  end
  
  def test_test_url_with_cvn
    assert_equal EwayGateway::TEST_CVN_URL, @gateway.send(:gateway_url, true, true)
  end
  
  def test_live_url_without_cvn
    assert_equal EwayGateway::LIVE_URL, @gateway.send(:gateway_url, false, false)
  end
  
  def test_live_url_with_cvn
    assert_equal EwayGateway::LIVE_CVN_URL, @gateway.send(:gateway_url, true, false)
  end
  
  def test_add_address
    post = {}
    @gateway.send(:add_address, post, @test_params_success)
    assert_equal '1234 First St., Apt. 1, Melbourne, ACT, AU', post[:CustomerAddress]
    assert_equal @test_params_success[:address][:zip], post[:CustomerPostcode]
  end

  private

  def xml_purchase_fixture
    %q{<ewaygateway><ewayCustomerID>87654321</ewayCustomerID><ewayOption3></ewayOption3><ewayCustomerFirstName>Longbob</ewayCustomerFirstName><ewayCustomerAddress>47 Bobway, Bobville, WA, Australia</ewayCustomerAddress><ewayCustomerInvoiceRef>1230123</ewayCustomerInvoiceRef><ewayCardHoldersName>Longbob Longsen</ewayCardHoldersName><ewayTotalAmount>100</ewayTotalAmount><ewayTrxnNumber>1230123</ewayTrxnNumber><ewayCustomerLastName>Longsen</ewayCustomerLastName><ewayCustomerPostcode>2000</ewayCustomerPostcode><ewayCardNumber>4646464646464646</ewayCardNumber><ewayOption1></ewayOption1><ewayCardExpiryMonth>08</ewayCardExpiryMonth><ewayOption2></ewayOption2><ewayCustomerEmail>bob@testbob.com</ewayCustomerEmail><ewayCustomerInvoiceDescription>purchased items</ewayCustomerInvoiceDescription><ewayCardExpiryYear>07</ewayCardExpiryYear></ewaygateway>}
  end
end