require File.expand_path('../../test_helper', __FILE__)

module Payjp
  class ChargeTest < Test::Unit::TestCase
    should "charges should be listable" do
      @mock.expects(:get).once.returns(test_response(test_charge_array))
      c = Payjp::Charge.all
      assert c.data.is_a? Array
      c.each do |charge|
        assert charge.is_a?(Payjp::Charge)
      end
    end

    should "charges should be refundable" do
      @mock.expects(:get).never
      @mock.expects(:post).once.returns(test_response({ :id => "ch_test_charge", :refunded => true }))
      c = Payjp::Charge.new("test_charge")
      c.refund
      assert c.refunded
    end

    should "charges should not be deletable" do
      assert_raises NoMethodError do
        @mock.expects(:get).once.returns(test_response(test_charge))
        c = Payjp::Charge.retrieve("test_charge")
        c.delete
      end
    end

    should "charges should be updateable" do
      @mock.expects(:get).once.returns(test_response(test_charge))
      @mock.expects(:post).once.returns(test_response(test_charge))
      c = Payjp::Charge.new("test_charge")
      c.refresh
      c.mnemonic = "New charge description"
      c.save
    end

    should "charges should have Card objects associated with their Card property" do
      @mock.expects(:get).once.returns(test_response(test_charge))
      c = Payjp::Charge.retrieve("test_charge")
      assert c.card.is_a?(Payjp::PayjpObject) && c.card.object == 'card'
    end

    should "execute should return a new, fully executed charge when passed correct `card` parameters" do
      @mock.expects(:post).with do |url, api_key, params|
        url == "#{Payjp.api_base}/v1/charges" && api_key.nil? && CGI.parse(params) == {
          'currency' => ['jpy'], 'amount' => ['100'],
          'card[exp_year]' => ['2012'],
          'card[number]' => ['4242424242424242'],
          'card[exp_month]' => ['11']
        }
      end.once.returns(test_response(test_charge))

      c = Payjp::Charge.create({
        :amount => 100,
        :card => {
          :number => "4242424242424242",
          :exp_month => 11,
          :exp_year => 2012
        },
        :currency => "jpy"
      })
      assert c.paid
    end

    should "execute should return a new, fully executed charge when passed correct `source` parameters" do
      @mock.expects(:post).with do |url, api_key, params|
        url == "#{Payjp.api_base}/v1/charges" && api_key.nil? && CGI.parse(params) == {
          'currency' => ['jpy'], 'amount' => ['100'],
          'source' => ['btcrcv_test_receiver']
        }
      end.once.returns(test_response(test_charge))

      c = Payjp::Charge.create({
        :amount => 100,
        :source => 'btcrcv_test_receiver',
        :currency => "jpy"
      })
      assert c.paid
    end
  end
end