require 'test_helper'

class RemoteAddCreditCardTest < 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.add_credit_card(card_deets)
    end
  end

  def test_failed_with_validation_errors
    error = assert_raises(Spreedly::TransactionCreationError) do
      @environment.add_credit_card(card_deets(last_name: '', first_name: ' '))
    end

    expected_errors = [
      { attribute: "first_name", key: "errors.blank", message: "First name can't be blank" },
      { attribute: "last_name", key: "errors.blank", message: "Last name can't be blank" }
    ]

    assert_equal expected_errors, error.errors
    assert_equal "First name can't be blank\nLast name can't be blank", error.message
  end

  def test_payment_required
    assert_raise_with_message(Spreedly::PaymentRequiredError, "Your environment (R7lHscqcYkZeDGGbthKp6GKMu15) has not been activated for real transactions with real payment methods. If you're using a Test Gateway you can *ONLY* use Test payment methods - ( https://docs.spreedly.com/test-data). All other credit card numbers are considered real credit cards; real credit cards are not allowed when using a Test Gateway.") do
      @environment.add_credit_card(card_deets(number: '343'))
    end
  end

  def test_successful_add_card
    t = @environment.add_credit_card(card_deets)

    assert t.succeeded?
    assert_equal 'Aybara', t.payment_method.last_name
    assert !t.retained
    assert_equal 'cached', t.payment_method.storage_state
    assert_equal 'occupation: Blacksmith', t.payment_method.data
  end

  def test_successfully_retain_on_create
    t = @environment.add_credit_card(card_deets(retained: true))

    assert t.succeeded?
    assert t.retained
    assert_equal 'retained', t.payment_method.storage_state
  end

  def test_successfull_add_using_full_name
    t = @environment.add_credit_card(number: '5555555555554444', month: 1, year: 2023, full_name: "Kvothe Jones")
    assert t.succeeded?
    assert_equal "Kvothe", t.payment_method.first_name
    assert_equal "Jones", t.payment_method.last_name
    assert_equal "Kvothe Jones", t.payment_method.full_name
  end


  private
  def card_deets(options = {})
    {
      email: 'perrin@wot.com', number: '5555555555554444', month: 1, year: 2023,
      last_name: 'Aybara', first_name: 'Perrin', data: "occupation: Blacksmith"
    }.merge(options)
  end

end