require 'test/unit'
require 'test_helper'

# To run these tests, set the variables at the top of the class
# definition.
#
# Note that NetRegistry does not provide any sort of test
# server/account, so you'll probably want to refund any uncredited
# purchases through the NetRegistry console at www.netregistry.com .
# All purchases made in these tests are $1, so hopefully you won't be
# sent broke if you forget...
class NetRegistryTest < Test::Unit::TestCase
  def setup
    @gateway = NetRegistryGateway.new(fixtures(:net_registry))

    @amount = 100
    @valid_creditcard = credit_card
    @invalid_creditcard = credit_card('41111111111111111')
    @expired_creditcard = credit_card('4111111111111111', year: '2000')
    @invalid_month_creditcard = credit_card('4111111111111111', month: '13')
  end

  def test_successful_purchase_and_credit
    response = @gateway.purchase(@amount, @valid_creditcard)
    assert_equal 'approved', response.params['status']
    assert_success response
    assert_match(/\A\d{16}\z/, response.authorization)

    assert_deprecation_warning(Gateway::CREDIT_DEPRECATION_MESSAGE) do
      response = @gateway.credit(@amount, response.authorization)
      assert_equal 'approved', response.params['status']
      assert_success response
    end
  end

  def test_successful_purchase_and_refund
    response = @gateway.purchase(@amount, @valid_creditcard)
    assert_equal 'approved', response.params['status']
    assert_success response
    assert_match(/\A\d{16}\z/, response.authorization)

    response = @gateway.refund(@amount, response.authorization)
    assert_equal 'approved', response.params['status']
    assert_success response
  end

  # #authorize and #capture haven't been tested because the author's
  # account hasn't been setup to support these methods (see the
  # documentation for the NetRegistry gateway class).  There is no
  # mention of a #void transaction in NetRegistry's documentation,
  # either.
  if ENV['TEST_AUTHORIZE_AND_CAPTURE']
    def test_successful_authorization_and_capture
      response = @gateway.authorize(@amount, @valid_creditcard)
      assert_success response
      assert_equal 'approved', response.params['status']
      assert_match(/\A\d{6}\z/, response.authorization)

      response = @gateway.capture(@amount, response.authorization, credit_card: @valid_creditcard)
      assert_success response
      assert_equal 'approved', response.params['status']
    end
  end

  def test_purchase_with_invalid_credit_card
    response = @gateway.purchase(@amount, @invalid_creditcard)
    assert_equal 'declined', response.params['status']
    assert_equal 'INVALID CARD', response.message
    assert_failure response
  end

  def test_purchase_with_expired_credit_card
    response = @gateway.purchase(@amount, @expired_creditcard)
    assert_equal 'failed', response.params['status']
    assert_equal 'CARD EXPIRED', response.message
    assert_failure response
  end

  def test_purchase_with_invalid_month
    response = @gateway.purchase(@amount, @invalid_month_creditcard)
    assert_equal 'failed', response.params['status']
    assert_equal 'Invalid month', response.message
    assert_failure response
  end

  def test_bad_login
    gateway = NetRegistryGateway.new(
      login: 'bad-login',
      password: 'bad-login'
    )
    response = gateway.purchase(@amount, @valid_creditcard)
    assert_equal 'failed', response.params['status']
    assert_failure response
  end
end
