require "spec_helper"

describe PxFusion::Transaction do
  let(:timestamp) { Time.now.to_i }
  let(:complete_transaction_id) { "0000010016327641e4c03879868bd001" }

  subject(:transaction) { described_class.new(amount: "10.00", reference: timestamp) }

  describe ".initialize" do
    context "normal attributes passed in" do
      it { transaction.amount.should eq "10.00" }
      it { transaction.reference.should eq timestamp }
      it { transaction.currency.should eq "NZD" }
    end

    context "missing attributes" do
      it { expect { described_class.new(reference: "Test") }.to raise_error(ArgumentError) }
    end

    context "overriding globally-configured attributes", :vcr do
      it { described_class.new(amount: "10.00", reference: "12345", currency: "USD").currency.should eq "USD" }
    end

    context "token billing" do
      it { described_class.new(amount: "10.00", reference: "12345", token_billing: true).token_billing.should be_truthy }
    end
  end

  describe ".generate_session_id!", :vcr do
    subject { -> { transaction.reference = Time.now.to_i;transaction.generate_session_id! } }
    it { expect { subject.call }.to change(transaction, :session_id) }
    it { expect { subject.call }.to change(transaction, :id) }
  end

  describe ".fetch" do
    context "transaction is complete", :vcr do
      subject { PxFusion::Transaction.fetch(complete_transaction_id) }
      it { subject.currency.should eq "NZD" }
      it { subject.amount.should eq "1.00" }
      it { subject.status.should eq PxFusion.statuses[:approved] }
      it { subject.response.should_not be_empty }
    end

    context "transaction is incomplete", :vcr do
      subject { transaction.reference = Time.now.to_i; transaction.generate_session_id! }
      it { expect { PxFusion::Transaction.fetch(subject) }.to raise_error PxFusion::Transaction::NotFound }
    end

    context "transaction does not exist", :vcr do
      it { expect { PxFusion::Transaction.fetch("1234") }.to raise_error(PxFusion::Transaction::NotFound) }
    end
  end
end