Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
getfitter-core / spec / core / utils / payments_spec.rb
Size: Mime:
require 'rails_helper'

RSpec.describe Core::Utils::Payments do
  it 'has a valid Payments object' do
    user = create(:core_user)

    payment = described_class.new(user, 'abc')

    expect(payment.user).to eq user
    expect(payment.source).to eq 'abc'
    expect(Stripe.api_key).to eq Core.configuration.stripe_token
  end

  it 'can store details for a new user' do
    VCR.use_cassette('stipe_new_user_details') do
      user = create(:core_user, name: 'Payments Details Test User')

      source = { number: '4242424242424242', exp_month: '12',
                 exp_year: '2015', cvc: '111' }

      payment = described_class.new(user, source)
      customer_id = payment.store_details

      expect(customer_id).not_to be_nil
      user.reload
      expect(user.stripe_customer_id).not_to be_nil
    end
  end

  it 'can process payments for a new user' do
    VCR.use_cassette('stripe_new_user_payment') do
      user = create(:core_user, name: 'Payments Test User',
                                email: 'stripe@getfitter.co')
      # source can either be a Hash (like this) or a hashed value from a lib.
      source = { number: '4242424242424242', exp_month: '12',
                 exp_year: '2015', cvc: '111' }

      payment = described_class.new(user, source)
      charge = payment.process(100, 'Test Payment')

      expect(charge).to be_an_instance_of Stripe::Charge
      expect(charge.status).to eq 'paid'
      expect(charge.amount).to eq 100
      expect(charge.description).to eq 'Test Payment'
    end
  end

  it 'can process payments for an existing user' do
    VCR.use_cassette('stripe_existing_user_payment') do
      user = create(:core_user, name: 'Payments Test User',
                                email: 'stripe@getfitter.co',
                                stripe_customer_id: 'cus_5jQXWYZ5STSVkt')

      # don't provide a source because it's an existing customer
      payment = described_class.new(user)
      charge = payment.process(100, 'Test Payment')

      expect(charge).to be_an_instance_of Stripe::Charge
      expect(charge.status).to eq 'paid'
      expect(charge.amount).to eq 100
      expect(charge.description).to eq 'Test Payment'
      expect(charge.customer).to eq 'cus_5jQXWYZ5STSVkt'
    end
  end

  it 'raises a custom error class on failure' do
    VCR.use_cassette('stripe_invalid_card_payment') do
      user = create(:core_user, name: 'Payments Test User',
                                email: 'stripe@getfitter.co')
      # provide not quite enough information to make the charge
      source = { number: '4242424242424242' }

      payment = described_class.new(user, source)
      expect { payment.process(100, 'Test') }.to raise_error(
        Core::Utils::PaymentError, "Your card's expiration year is invalid.")
    end
  end
end