require 'test_helper'

class RemoteRefundTest < Test::Unit::TestCase

  def setup
    @environment = Spreedly::Environment.new(remote_test_environment_key, remote_test_access_secret)
  end

  def test_invalid_login
    assert_invalid_login do |environment|
      environment.refund_transaction('authorize_token')
    end
  end

  def test_transaction_token_found
    assert_raise_with_message(Spreedly::NotFoundError, "Unable to find the specified reference transaction.") do
      @environment.refund_transaction('unknown_transaction_token')
    end
  end

  def test_needs_succeeded_reference
    gateway_token = @environment.add_gateway(:test).token
    card_token = create_failed_card_on(@environment).token
    purchase = @environment.purchase_on_gateway(gateway_token, card_token, 144)
    assert !purchase.succeeded?

    assert_raise_with_message(Spreedly::TransactionCreationError, "The reference transaction did not succeed. Only successful reference transactions are permitted.") do
      @environment.refund_transaction(purchase.token)
    end
  end

  def test_successful_refund_full_amount
    gateway_token = @environment.add_gateway(:test).token
    card_token = create_card_on(@environment).token
    purchase = @environment.purchase_on_gateway(gateway_token, card_token, 944)

    refund = @environment.refund_transaction(purchase.token)
    assert refund.succeeded?
    assert_equal purchase.token, refund.reference_token
    assert_equal 944, refund.amount
  end

  def test_successful_refund_partial_amount
    gateway_token = @environment.add_gateway(:test).token
    card_token = create_card_on(@environment).token
    purchase = @environment.purchase_on_gateway(gateway_token, card_token, 1944)

    refund = @environment.refund_transaction(purchase.token, amount: 323)
    assert refund.succeeded?
    assert_equal 323, refund.amount
  end

  def test_failed_refund
    gateway_token = @environment.add_gateway(:test).token
    card_token = create_card_on(@environment).token
    purchase = @environment.purchase_on_gateway(gateway_token, card_token, 1944)

    refund = @environment.refund_transaction(purchase.token, amount: 44)
    assert !refund.succeeded?
    assert_equal purchase.token, refund.reference_token
    assert_equal 44, refund.amount
    assert_equal 'Unable to process the credit transaction.', refund.message
  end

end