require 'test_helper'

class RemoteEfsnetTest < Test::Unit::TestCase
  def setup
    Base.mode = :test

    @gateway = EfsnetGateway.new(fixtures(:efsnet))

    @credit_card = credit_card('4000100011112224')

    @amount = 100
    @declined_amount = 156

    @options = { order_id: generate_unique_id,
                 billing_address: address }
  end

  def test_successful_purchase
    assert response = @gateway.purchase(@amount, @credit_card, @options)
    assert_success response
    assert_equal 'Approved', response.message
    assert response.test?
  end

  def test_successful_force
    assert response = @gateway.force(@amount, '123456', @credit_card, @options)
    assert_success response
    assert_equal 'Approved', response.message
  end

  def test_successful_voice_authorize
    assert response = @gateway.voice_authorize(@amount, '123456', @credit_card, @options)
    assert_success response
    assert_equal 'Accepted', response.message
  end

  def test_unsuccessful_purchase
    assert response = @gateway.purchase(@declined_amount, @credit_card, @options)
    assert_failure response
    assert_equal 'Declined', response.message
  end

  def test_authorize_and_capture
    amount = @amount
    assert auth = @gateway.authorize(amount, @credit_card, @options)
    assert_success auth
    assert_equal 'Approved', auth.message
    assert auth.authorization

    assert capture = @gateway.capture(amount, auth.authorization, @options)
    assert_success capture
  end

  def test_purchase_and_void
    amount = @amount
    assert purchase = @gateway.purchase(amount, @credit_card, @options)
    assert_success purchase
    assert_equal 'Approved', purchase.message
    assert purchase.authorization
    assert void = @gateway.void(purchase.authorization, @options)
    assert_success void
  end

  def test_failed_capture
    assert response = @gateway.capture(@amount, '1;1', @options)
    assert_failure response
    assert_equal 'Bad original transaction', response.message
  end

  def test_invalid_login
    gateway = EfsnetGateway.new(
      login: '',
      password: ''
    )
    assert response = gateway.purchase(@amount, @credit_card, @options)
    assert_equal 'Invalid credentials', response.message
    assert_failure response
  end
end
