Skip to content
This repository has been archived by the owner on Sep 19, 2024. It is now read-only.

Add rspec matchers for charging amounts to cards #90

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 10 additions & 6 deletions lib/fake_stripe.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@
require 'fake_stripe/initializers/webmock'
require 'fake_stripe/stub_app'
require 'fake_stripe/stub_stripe_js'
require 'fake_stripe/exceptions'

if defined?(RSpec)
require 'fake_stripe/rspec'
end

module FakeStripe
extend Configuration
Expand All @@ -12,20 +17,19 @@ module FakeStripe
CARD_OBJECT_TYPE = "card"
BANK_ACCOUNT_OBJECT_TYPE = "bank_account"


STRIPE_OBJECTS.each do |object|
define_singleton_method "#{object}_count" do
instance_variable_get("@#{object}_count")
define_singleton_method "#{object}_calls" do
instance_variable_get("@#{object}_calls")
end

define_singleton_method "#{object}_count=" do |count|
instance_variable_set("@#{object}_count", count)
define_singleton_method "#{object}_calls=" do |calls|
instance_variable_set("@#{object}_calls", calls)
end
end

def self.reset
STRIPE_OBJECTS.each do |object|
instance_variable_set("@#{object}_count", 0)
instance_variable_set("@#{object}_calls", [])
end
end

Expand Down
4 changes: 4 additions & 0 deletions lib/fake_stripe/exceptions.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module FakeStripe
class InvalidCardToken < StandardError
end
end
65 changes: 0 additions & 65 deletions lib/fake_stripe/fixtures/create_charge.json

This file was deleted.

1 change: 1 addition & 0 deletions lib/fake_stripe/rspec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
require 'fake_stripe/rspec/matchers'
1 change: 1 addition & 0 deletions lib/fake_stripe/rspec/matchers.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
require 'fake_stripe/rspec/matchers/have_charged'
42 changes: 42 additions & 0 deletions lib/fake_stripe/rspec/matchers/have_charged.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
RSpec::Matchers.define :have_charged do |amount|
@card_token = :ignore_card_token

chain :to_card do |card_token|
@card_token = card_token

if invalid_card_token?(@card_token)
raise FakeStripe::InvalidCardToken
end
end

match do |fake_stripe|
matching_charges(fake_stripe, amount, @card_token).any?
end

def matching_charges(fake_stripe, amount, card_token)
matching_amounts = fake_stripe.charge_calls
.select(&matches_amount(amount))

if card_token
matching_amounts.select(&matches_card_token(card_token))
else
matching_amounts
end
end

def matches_amount(amount)
proc do |charge|
charge[:amount] == amount
end
end

def matches_card_token(card_token)
proc do |charge|
card_token == :ignore_card_token || charge[:card][:id] == card_token
end
end

def invalid_card_token?(card_token)
card_token.nil? || card_token == ''
end
end
126 changes: 112 additions & 14 deletions lib/fake_stripe/stub_app.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,13 @@ class StubApp < Sinatra::Base
if params['amount'] && params['amount'].to_i <= 0
json_response 400, fixture('invalid_positive_integer')
else
FakeStripe.charge_count += 1
json_response 201, fixture('create_charge')
charge = successful_charge
FakeStripe.charge_calls << charge
json_response 201, charge.to_json
end
end


get '/v1/charges/:charge_id' do
json_response 200, fixture('retrieve_charge')
end
Expand All @@ -22,12 +24,12 @@ class StubApp < Sinatra::Base
end

post '/v1/refunds' do
FakeStripe.refund_count += 1
FakeStripe.refund_calls << {}
json_response 200, fixture('refund_charge')
end

post '/v1/charges/:charge_id/refund' do
FakeStripe.refund_count += 1
FakeStripe.refund_calls << {}
json_response 200, fixture('refund_charge')
end

Expand All @@ -41,7 +43,7 @@ class StubApp < Sinatra::Base

# Customers
post '/v1/customers' do
FakeStripe.customer_count += 1
FakeStripe.customer_calls << {}
json_response 200, fixture('create_customer')
end

Expand All @@ -63,7 +65,7 @@ class StubApp < Sinatra::Base

# Cards
post '/v1/customers/:customer_id/sources' do
FakeStripe.card_count += 1
FakeStripe.card_calls << {}
json_response 200, fixture('create_card')
end

Expand All @@ -89,7 +91,7 @@ class StubApp < Sinatra::Base
'/v1/customers/:customer_id/subscriptions',
].each do |path|
post path do
FakeStripe.subscription_count += 1
FakeStripe.subscription_calls << {}
json_response 200, fixture('create_subscription')
end
end
Expand Down Expand Up @@ -144,7 +146,7 @@ class StubApp < Sinatra::Base

# Plans
post '/v1/plans' do
FakeStripe.plan_count += 1
FakeStripe.plan_calls << {}
json_response 200, fixture('create_plan')
end

Expand All @@ -166,7 +168,7 @@ class StubApp < Sinatra::Base

# Coupons
post '/v1/coupons' do
FakeStripe.coupon_count += 1
FakeStripe.coupon_calls << {}
json_response 200, fixture('create_coupon')
end

Expand Down Expand Up @@ -201,7 +203,7 @@ class StubApp < Sinatra::Base
end

post '/v1/invoices' do
FakeStripe.invoice_count += 1
FakeStripe.invoice_calls << {}
json_response 200, fixture('create_invoice')
end

Expand All @@ -223,7 +225,7 @@ class StubApp < Sinatra::Base

# Invoice Items
post '/v1/invoiceitems' do
FakeStripe.invoiceitem_count += 1
FakeStripe.invoiceitem_calls << {}
json_response 200, fixture('create_invoiceitem')
end

Expand Down Expand Up @@ -254,7 +256,7 @@ class StubApp < Sinatra::Base

# Transfers
post '/v1/transfers' do
FakeStripe.transfer_count += 1
FakeStripe.transfer_calls << {}
json_response 200, fixture('create_transfer')
end

Expand All @@ -276,7 +278,7 @@ class StubApp < Sinatra::Base

# Recipients
post '/v1/recipients' do
FakeStripe.recipient_count += 1
FakeStripe.recipient_calls << {}
json_response 200, fixture('create_recipient')
end

Expand Down Expand Up @@ -350,7 +352,7 @@ class StubApp < Sinatra::Base

# Tokens
post '/v1/tokens' do
FakeStripe.token_count += 1
FakeStripe.token_calls << {}
json_response 200, fixture(token_fixture_name)
end

Expand Down Expand Up @@ -378,5 +380,101 @@ def token_fixture_name
"create_card_token"
end
end

def successful_charge
{
amount: params[:amount].to_i,
card: {
id: params[:card],
address_city: nil,
address_country: nil,
address_line1: nil,
address_line1_check: nil,
address_line2: nil,
address_state: nil,
address_zip: nil,
address_zip_check: nil,
country: "US",
cvc_check: "pass",
exp_month: 11,
exp_year: 2014,
fingerprint: "qhjxpr7DiCdFYTlH",
last4: "4242",
name: "john doe",
object: "card",
type: "Visa"
},
amount_refunded: 0,
application_fee: nil,
balance_transaction: "txn_17bBUd2eZvKYlo2CAv3mOn7F",
captured: true,
created: 11456245794,
currency: "usd",
customer: "cus_7xeYRmuGuwvZK1",
description: "Charge for VirtuMedix consultation for Guy Henggeler",
destination: nil,
dispute: nil,
failure_code: nil,
failure_message: nil,
fee: 59,
fee_details: [
{
amount: 59,
application: nil,
currency: "usd",
description: "Stripe processing fees",
type: "stripe_fee"
}
],
fraud_details: {
},

id: "ch_17hjFm2eZvKYlo2Cf6ceKOqV",
invoice: nil,
livemode: false,
metadata: {
},
object: "charge",
order: nil,
paid: true,
refunded: false,
refunds: {
object: "list",
data: [
],
has_more: false,
total_count: 0,
url: "/v1/charges/ch_17hjFm2eZvKYlo2Cf6ceKOqV/refunds"
},
shipping: nil,
source: {
id: "card_17hjFk2eZvKYlo2CuvsYuAE1",
object: "card",
address_city: nil,
address_country: nil,
address_line1: nil,
address_line1_check: nil,
address_line2: nil,
address_state: nil,
address_zip: nil,
address_zip_check: nil,
brand: "Visa",
country: "US",
customer: "cus_7xeYRmuGuwvZK1",
cvc_check: "pass",
dynamic_last4: nil,
exp_month: 2,
exp_year: 2017,
funding: "credit",
last4: "4242",
metadata: {
},
name: nil,
tokenization_method: nil
},
statement_descriptor: nil,
status: "succeeded"
}
end
end
end
Loading