stripe-ruby-mock 2.4.1 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +6 -4
  3. data/README.md +10 -4
  4. data/lib/stripe_mock/api/client.rb +3 -3
  5. data/lib/stripe_mock/api/errors.rb +25 -14
  6. data/lib/stripe_mock/api/instance.rb +4 -4
  7. data/lib/stripe_mock/api/webhooks.rb +1 -1
  8. data/lib/stripe_mock/client.rb +2 -2
  9. data/lib/stripe_mock/data.rb +51 -26
  10. data/lib/stripe_mock/instance.rb +7 -3
  11. data/lib/stripe_mock/request_handlers/charges.rb +6 -6
  12. data/lib/stripe_mock/request_handlers/coupons.rb +3 -2
  13. data/lib/stripe_mock/request_handlers/customers.rb +16 -7
  14. data/lib/stripe_mock/request_handlers/helpers/card_helpers.rb +2 -2
  15. data/lib/stripe_mock/request_handlers/helpers/coupon_helpers.rb +6 -1
  16. data/lib/stripe_mock/request_handlers/helpers/subscription_helpers.rb +5 -5
  17. data/lib/stripe_mock/request_handlers/helpers/token_helpers.rb +2 -2
  18. data/lib/stripe_mock/request_handlers/invoices.rb +63 -11
  19. data/lib/stripe_mock/request_handlers/orders.rb +4 -4
  20. data/lib/stripe_mock/request_handlers/refunds.rb +3 -3
  21. data/lib/stripe_mock/request_handlers/subscriptions.rb +8 -8
  22. data/lib/stripe_mock/request_handlers/tokens.rb +1 -1
  23. data/lib/stripe_mock/request_handlers/transfers.rb +1 -1
  24. data/lib/stripe_mock/server.rb +1 -1
  25. data/lib/stripe_mock/version.rb +1 -1
  26. data/spec/instance_spec.rb +4 -4
  27. data/spec/integration_examples/prepare_error_examples.rb +6 -6
  28. data/spec/readme_spec.rb +2 -0
  29. data/spec/server_spec.rb +2 -2
  30. data/spec/shared_stripe_examples/card_examples.rb +3 -3
  31. data/spec/shared_stripe_examples/coupon_examples.rb +6 -0
  32. data/spec/shared_stripe_examples/customer_examples.rb +31 -3
  33. data/spec/shared_stripe_examples/dispute_examples.rb +9 -8
  34. data/spec/shared_stripe_examples/error_mock_examples.rb +3 -3
  35. data/spec/shared_stripe_examples/extra_features_examples.rb +2 -0
  36. data/spec/shared_stripe_examples/invoice_examples.rb +232 -48
  37. data/spec/shared_stripe_examples/recipient_examples.rb +7 -7
  38. data/spec/shared_stripe_examples/subscription_examples.rb +52 -16
  39. data/spec/shared_stripe_examples/transfer_examples.rb +8 -6
  40. data/spec/shared_stripe_examples/webhook_event_examples.rb +3 -3
  41. data/spec/spec_helper.rb +6 -5
  42. data/spec/stripe_mock_spec.rb +3 -3
  43. data/stripe-ruby-mock.gemspec +1 -1
  44. metadata +4 -10
@@ -8,10 +8,10 @@ module StripeMock
8
8
  if card.nil?
9
9
  if class_name == 'Recipient'
10
10
  msg = "#{class_name} #{object[:id]} does not have a card with ID #{card_id}"
11
- raise Stripe::InvalidRequestError.new(msg, 'card', 404)
11
+ raise Stripe::InvalidRequestError.new(msg, 'card', http_status: 404)
12
12
  else
13
13
  msg = "There is no source with ID #{card_id}"
14
- raise Stripe::InvalidRequestError.new(msg, 'id', 404)
14
+ raise Stripe::InvalidRequestError.new(msg, 'id', http_status: 404)
15
15
  end
16
16
  end
17
17
  card
@@ -3,7 +3,12 @@ module StripeMock
3
3
  module Helpers
4
4
 
5
5
  def add_coupon_to_customer(customer, coupon)
6
- customer[:discount] = { coupon: coupon }
6
+ customer[:discount] = {
7
+ coupon: coupon,
8
+ customer: customer[:id],
9
+ start: Time.now.to_i,
10
+ }
11
+ customer[:discount][:end] = (DateTime.now >> coupon[:duration_in_months]).to_time.to_i if coupon[:duration].to_sym == :repeating && coupon[:duration_in_months]
7
12
 
8
13
  customer
9
14
  end
@@ -14,7 +14,7 @@ module StripeMock
14
14
  params.merge! options.select {|k,v| k =~ /application_fee_percent|quantity|metadata|tax_percent/}
15
15
  # TODO: Implement coupon logic
16
16
 
17
- if (plan[:trial_period_days].nil? && options[:trial_end].nil?) || options[:trial_end] == "now"
17
+ if ((plan[:trial_period_days]||0) == 0 && options[:trial_end].nil?) || options[:trial_end] == "now"
18
18
  end_time = get_ending_time(start_time, plan)
19
19
  params.merge!({status: 'active', current_period_end: end_time, trial_start: nil, trial_end: nil})
20
20
  else
@@ -34,7 +34,7 @@ module StripeMock
34
34
  if cus[:currency].nil?
35
35
  cus[:currency] = sub[:plan][:currency]
36
36
  elsif cus[:currency] != sub[:plan][:currency]
37
- raise Stripe::InvalidRequestError.new( "Can't combine currencies on a single customer. This customer has had a subscription, coupon, or invoice item with currency #{cus[:currency]}", 'currency', 400)
37
+ raise Stripe::InvalidRequestError.new( "Can't combine currencies on a single customer. This customer has had a subscription, coupon, or invoice item with currency #{cus[:currency]}", 'currency', http_status: 400)
38
38
  end
39
39
  cus[:subscriptions][:total_count] = (cus[:subscriptions][:total_count] || 0) + 1
40
40
  cus[:subscriptions][:data].unshift sub
@@ -65,11 +65,11 @@ module StripeMock
65
65
  def verify_trial_end(trial_end)
66
66
  if trial_end != "now"
67
67
  if !trial_end.is_a? Integer
68
- raise Stripe::InvalidRequestError.new('Invalid timestamp: must be an integer', nil, 400)
68
+ raise Stripe::InvalidRequestError.new('Invalid timestamp: must be an integer', nil, http_status: 400)
69
69
  elsif trial_end < Time.now.utc.to_i
70
- raise Stripe::InvalidRequestError.new('Invalid timestamp: must be an integer Unix timestamp in the future', nil, 400)
70
+ raise Stripe::InvalidRequestError.new('Invalid timestamp: must be an integer Unix timestamp in the future', nil, http_status: 400)
71
71
  elsif trial_end > Time.now.utc.to_i + 31557600*5 # five years
72
- raise Stripe::InvalidRequestError.new('Invalid timestamp: can be no more than five years in the future', nil, 400)
72
+ raise Stripe::InvalidRequestError.new('Invalid timestamp: can be no more than five years in the future', nil, http_status: 400)
73
73
  end
74
74
  end
75
75
  end
@@ -28,7 +28,7 @@ module StripeMock
28
28
  if token.nil? || @card_tokens[token].nil?
29
29
  # TODO: Make this strict
30
30
  msg = "Invalid token id: #{token}"
31
- raise Stripe::InvalidRequestError.new(msg, 'tok', 404)
31
+ raise Stripe::InvalidRequestError.new(msg, 'tok', http_status: 404)
32
32
  else
33
33
  @card_tokens.delete(token)
34
34
  end
@@ -36,7 +36,7 @@ module StripeMock
36
36
 
37
37
  def get_card_or_bank_by_token(token)
38
38
  token_id = token['id'] || token
39
- @card_tokens[token_id] || @bank_tokens[token_id] || raise(Stripe::InvalidRequestError.new("Invalid token id: #{token_id}", 'tok', 404))
39
+ @card_tokens[token_id] || @bank_tokens[token_id] || raise(Stripe::InvalidRequestError.new("Invalid token id: #{token_id}", 'tok', http_status: 404))
40
40
  end
41
41
 
42
42
  end
@@ -58,24 +58,76 @@ module StripeMock
58
58
 
59
59
  def upcoming_invoice(route, method_url, params, headers)
60
60
  route =~ method_url
61
- raise Stripe::InvalidRequestError.new('Missing required param: customer', nil, 400) if params[:customer].nil?
61
+ raise Stripe::InvalidRequestError.new('Missing required param: customer', nil, http_status: 400) if params[:customer].nil?
62
+ raise Stripe::InvalidRequestError.new('When previewing changes to a subscription, you must specify either `subscription` or `subscription_items`', nil, http_status: 400) if !params[:subscription_proration_date].nil? && params[:subscription].nil? && params[:subscription_plan].nil?
63
+ raise Stripe::InvalidRequestError.new('Cannot specify proration date without specifying a subscription', nil, http_status: 400) if !params[:subscription_proration_date].nil? && params[:subscription].nil?
62
64
 
63
65
  customer = customers[params[:customer]]
64
66
  assert_existence :customer, params[:customer], customer
65
67
 
66
- raise Stripe::InvalidRequestError.new("No upcoming invoices for customer: #{customer[:id]}", nil, 404) if customer[:subscriptions][:data].length == 0
68
+ raise Stripe::InvalidRequestError.new("No upcoming invoices for customer: #{customer[:id]}", nil, http_status: 404) if customer[:subscriptions][:data].length == 0
69
+
70
+ subscription =
71
+ if params[:subscription]
72
+ customer[:subscriptions][:data].select{|s|s[:id] == params[:subscription]}.first
73
+ else
74
+ customer[:subscriptions][:data].min_by { |sub| sub[:current_period_end] }
75
+ end
76
+
77
+ if params[:subscription_proration_date] && !((subscription[:current_period_start]..subscription[:current_period_end]) === params[:subscription_proration_date])
78
+ raise Stripe::InvalidRequestError.new('Cannot specify proration date outside of current subscription period', nil, http_status: 400)
79
+ end
80
+
81
+ prorating = false
82
+ subscription_proration_date = nil
83
+ subscription_plan_id = params[:subscription_plan] || subscription[:plan][:id]
84
+ subscription_quantity = params[:subscription_quantity] || subscription[:quantity]
85
+ if subscription_plan_id != subscription[:plan][:id] || subscription_quantity != subscription[:quantity]
86
+ prorating = true
87
+ invoice_date = Time.now.to_i
88
+ subscription_plan = assert_existence :plan, subscription_plan_id, plans[subscription_plan_id.to_s]
89
+ preview_subscription = Data.mock_subscription
90
+ preview_subscription.merge!(custom_subscription_params(subscription_plan, customer, { trial_end: params[:subscription_trial_end] }))
91
+ preview_subscription[:id] = subscription[:id]
92
+ preview_subscription[:quantity] = subscription_quantity
93
+ subscription_proration_date = params[:subscription_proration_date] || Time.now
94
+ else
95
+ preview_subscription = subscription
96
+ invoice_date = subscription[:current_period_end]
97
+ end
98
+
99
+ invoice_lines = []
100
+
101
+ if prorating
102
+ unused_amount = subscription[:plan][:amount] * subscription[:quantity] * (subscription[:current_period_end] - subscription_proration_date.to_i) / (subscription[:current_period_end] - subscription[:current_period_start])
103
+ invoice_lines << Data.mock_line_item(
104
+ id: new_id('ii'),
105
+ amount: -unused_amount,
106
+ description: 'Unused time',
107
+ plan: subscription[:plan],
108
+ period: {
109
+ start: subscription_proration_date.to_i,
110
+ end: subscription[:current_period_end]
111
+ },
112
+ quantity: subscription[:quantity],
113
+ proration: true
114
+ )
115
+ end
67
116
 
68
- most_recent = customer[:subscriptions][:data].min_by { |sub| sub[:current_period_end] }
69
- invoice_item = get_mock_subscription_line_item(most_recent)
117
+ subscription_line = get_mock_subscription_line_item(preview_subscription)
118
+ invoice_lines << subscription_line
70
119
 
71
120
  id = new_id('in')
72
- invoices[id] = Data.mock_invoice([invoice_item],
121
+ invoices[id] = Data.mock_invoice(invoice_lines,
73
122
  id: id,
74
123
  customer: customer[:id],
75
- subscription: most_recent[:id],
76
- period_start: most_recent[:current_period_start],
77
- period_end: most_recent[:current_period_end],
78
- next_payment_attempt: most_recent[:current_period_end] + 3600 )
124
+ discount: customer[:discount],
125
+ date: invoice_date,
126
+ starting_balance: customer[:account_balance],
127
+ subscription: preview_subscription[:id],
128
+ period_start: prorating ? invoice_date : preview_subscription[:current_period_start],
129
+ period_end: prorating ? invoice_date : preview_subscription[:current_period_end],
130
+ next_payment_attempt: preview_subscription[:current_period_end] + 3600 )
79
131
  end
80
132
 
81
133
  private
@@ -85,9 +137,9 @@ module StripeMock
85
137
  id: subscription[:id],
86
138
  type: "subscription",
87
139
  plan: subscription[:plan],
88
- amount: subscription[:plan][:amount],
140
+ amount: subscription[:status] == 'trialing' ? 0 : subscription[:plan][:amount] * subscription[:quantity],
89
141
  discountable: true,
90
- quantity: 1,
142
+ quantity: subscription[:quantity],
91
143
  period: {
92
144
  start: subscription[:current_period_end],
93
145
  end: get_ending_time(subscription[:current_period_start], subscription[:plan], 2)
@@ -15,16 +15,16 @@ module StripeMock
15
15
  order_items = []
16
16
 
17
17
  unless params[:currency].to_s.size == 3
18
- raise Stripe::InvalidRequestError.new('You must supply a currency', nil, 400)
18
+ raise Stripe::InvalidRequestError.new('You must supply a currency', nil, http_status: 400)
19
19
  end
20
20
 
21
21
  if params[:items]
22
22
  unless params[:items].is_a? Array
23
- raise Stripe::InvalidRequestError.new('You must supply a list of items', nil, 400)
23
+ raise Stripe::InvalidRequestError.new('You must supply a list of items', nil, http_status: 400)
24
24
  end
25
25
 
26
26
  unless params[:items].first.is_a? Hash
27
- raise Stripe::InvalidRequestError.new('You must supply an item', nil, 400)
27
+ raise Stripe::InvalidRequestError.new('You must supply an item', nil, http_status: 400)
28
28
  end
29
29
  end
30
30
 
@@ -61,7 +61,7 @@ module StripeMock
61
61
  order = assert_existence :order, $1, orders[$1]
62
62
 
63
63
  if params[:source].blank? && params[:customer].blank?
64
- raise Stripe::InvalidRequestError.new('You must supply a source or customer', nil, 400)
64
+ raise Stripe::InvalidRequestError.new('You must supply a source or customer', nil, http_status: 400)
65
65
  end
66
66
 
67
67
  charge_id = new_id('ch')
@@ -47,7 +47,7 @@ module StripeMock
47
47
  allowed = allowed_refund_params(params)
48
48
  disallowed = params.keys - allowed
49
49
  if disallowed.count > 0
50
- raise Stripe::InvalidRequestError.new("Received unknown parameters: #{disallowed.join(', ')}" , '', 400)
50
+ raise Stripe::InvalidRequestError.new("Received unknown parameters: #{disallowed.join(', ')}" , '', http_status: 400)
51
51
  end
52
52
 
53
53
  refunds[id] = Util.rmerge(refund, params)
@@ -72,9 +72,9 @@ module StripeMock
72
72
 
73
73
  def ensure_refund_required_params(params)
74
74
  if non_integer_charge_amount?(params)
75
- raise Stripe::InvalidRequestError.new("Invalid integer: #{params[:amount]}", 'amount', 400)
75
+ raise Stripe::InvalidRequestError.new("Invalid integer: #{params[:amount]}", 'amount', http_status: 400)
76
76
  elsif non_positive_charge_amount?(params)
77
- raise Stripe::InvalidRequestError.new('Invalid positive integer', 'amount', 400)
77
+ raise Stripe::InvalidRequestError.new('Invalid positive integer', 'amount', http_status: 400)
78
78
  elsif params[:charge].nil?
79
79
  raise Stripe::InvalidRequestError.new('Must provide the identifier of the charge to refund.', nil)
80
80
  end
@@ -63,7 +63,7 @@ module StripeMock
63
63
  if coupon
64
64
  subscription[:discount] = Stripe::Util.convert_to_stripe_object({ coupon: coupon }, {})
65
65
  else
66
- raise Stripe::InvalidRequestError.new("No such coupon: #{coupon_id}", 'coupon', 400)
66
+ raise Stripe::InvalidRequestError.new("No such coupon: #{coupon_id}", 'coupon', http_status: 400)
67
67
  end
68
68
  end
69
69
 
@@ -89,10 +89,10 @@ module StripeMock
89
89
  customer[:default_source] = new_card[:id]
90
90
  end
91
91
 
92
- allowed_params = %w(customer application_fee_percent coupon items metadata plan quantity source tax_percent trial_end trial_period_days)
92
+ allowed_params = %w(customer application_fee_percent coupon items metadata plan quantity source tax_percent trial_end trial_period_days current_period_start)
93
93
  unknown_params = params.keys - allowed_params.map(&:to_sym)
94
94
  if unknown_params.length > 0
95
- raise Stripe::InvalidRequestError.new("Received unknown parameter: #{unknown_params.join}", unknown_params.first.to_s, 400)
95
+ raise Stripe::InvalidRequestError.new("Received unknown parameter: #{unknown_params.join}", unknown_params.first.to_s, http_status: 400)
96
96
  end
97
97
 
98
98
  subscription = Data.mock_subscription({ id: (params[:id] || new_id('su')) })
@@ -112,7 +112,7 @@ module StripeMock
112
112
  if coupon
113
113
  subscription[:discount] = Stripe::Util.convert_to_stripe_object({ coupon: coupon }, {})
114
114
  else
115
- raise Stripe::InvalidRequestError.new("No such coupon: #{coupon_id}", 'coupon', 400)
115
+ raise Stripe::InvalidRequestError.new("No such coupon: #{coupon_id}", 'coupon', http_status: 400)
116
116
  end
117
117
  end
118
118
 
@@ -170,7 +170,7 @@ module StripeMock
170
170
  elsif coupon_id == ""
171
171
  subscription[:discount] = Stripe::Util.convert_to_stripe_object(nil, {})
172
172
  else
173
- raise Stripe::InvalidRequestError.new("No such coupon: #{coupon_id}", 'coupon', 400)
173
+ raise Stripe::InvalidRequestError.new("No such coupon: #{coupon_id}", 'coupon', http_status: 400)
174
174
  end
175
175
  end
176
176
 
@@ -224,8 +224,8 @@ module StripeMock
224
224
  private
225
225
 
226
226
  def verify_card_present(customer, plan, subscription, params={})
227
- if customer[:default_source].nil? && customer[:trial_end].nil? && plan[:trial_period_days].nil? && plan[:amount] != 0 && plan[:trial_end].nil? && params[:trial_end].nil? && (subscription.nil? || subscription[:trial_end].nil? || subscription[:trial_end] == 'now')
228
- raise Stripe::InvalidRequestError.new('You must supply a valid card xoxo', nil, 400)
227
+ if customer[:default_source].nil? && customer[:trial_end].nil? && (plan[:trial_period_days]||0)==0 && plan[:amount] != 0 && plan[:trial_end].nil? && params[:trial_end].nil? && (subscription.nil? || subscription[:trial_end].nil? || subscription[:trial_end] == 'now')
228
+ raise Stripe::InvalidRequestError.new('You must supply a valid card xoxo', nil, http_status: 400)
229
229
  end
230
230
  end
231
231
 
@@ -234,7 +234,7 @@ module StripeMock
234
234
 
235
235
  if status == 'canceled'
236
236
  message = "No such subscription: #{id}"
237
- raise Stripe::InvalidRequestError.new(message, 'subscription', 404)
237
+ raise Stripe::InvalidRequestError.new(message, 'subscription', http_status: 404)
238
238
  end
239
239
  end
240
240
  end
@@ -9,7 +9,7 @@ module StripeMock
9
9
 
10
10
  def create_token(route, method_url, params, headers)
11
11
  if params[:customer].nil? && params[:card].nil? && params[:bank_account].nil?
12
- raise Stripe::InvalidRequestError.new('You must supply either a card, customer, or bank account to create a token.', nil, 400)
12
+ raise Stripe::InvalidRequestError.new('You must supply either a card, customer, or bank account to create a token.', nil, http_status: 400)
13
13
  end
14
14
 
15
15
  cus_id = params[:customer]
@@ -36,7 +36,7 @@ module StripeMock
36
36
  end
37
37
 
38
38
  unless params[:amount].is_a?(Integer) || (params[:amount].is_a?(String) && /^\d+$/.match(params[:amount]))
39
- raise Stripe::InvalidRequestError.new("Invalid integer: #{params[:amount]}", 'amount', 400)
39
+ raise Stripe::InvalidRequestError.new("Invalid integer: #{params[:amount]}", 'amount', http_status: 400)
40
40
  end
41
41
 
42
42
  transfers[id] = Data.mock_transfer(params.merge :id => id)
@@ -23,7 +23,7 @@ module StripeMock
23
23
  {
24
24
  :error_raised => 'invalid_request',
25
25
  :error_params => [
26
- e.message, e.param, e.http_status, e.http_body, e.json_body
26
+ e.message, e.param, { http_status: e.http_status, http_body: e.http_body, json_body: e.json_body}
27
27
  ]
28
28
  }
29
29
  end
@@ -1,4 +1,4 @@
1
1
  module StripeMock
2
2
  # stripe-ruby-mock version
3
- VERSION = "2.4.1"
3
+ VERSION = "2.5.0"
4
4
  end
@@ -17,9 +17,9 @@ describe StripeMock::Instance do
17
17
  "id" => "str_abcde",
18
18
  :name => "String Plan"
19
19
  )
20
- res, api_key = StripeMock.instance.mock_request('post', '/v1/plans', 'api_key', string_params)
21
- expect(res[:id]).to eq('str_abcde')
22
- expect(res[:name]).to eq('String Plan')
20
+ res, api_key = StripeMock.instance.mock_request('post', '/v1/plans', api_key: 'api_key', params: string_params)
21
+ expect(res.data[:id]).to eq('str_abcde')
22
+ expect(res.data[:name]).to eq('String Plan')
23
23
  end
24
24
 
25
25
  it "exits gracefully on an unrecognized handler url" do
@@ -28,7 +28,7 @@ describe StripeMock::Instance do
28
28
  "name" => "PLAN"
29
29
  }
30
30
 
31
- expect { res, api_key = StripeMock.instance.mock_request('post', '/v1/unrecongnized_method', 'api_key', dummy_params) }.to_not raise_error
31
+ expect { res, api_key = StripeMock.instance.mock_request('post', '/v1/unrecongnized_method', api_key: 'api_key', params: dummy_params) }.to_not raise_error
32
32
  end
33
33
 
34
34
  it "can toggle debug" do
@@ -26,13 +26,13 @@ shared_examples 'Card Error Prep' do
26
26
  )
27
27
  rescue Stripe::CardError => e
28
28
  body = e.json_body
29
- err = body[:error]
30
-
31
29
  expect(body).to be_a(Hash)
32
- expect(err[:type]).to eq 'card_error'
33
- expect(err[:param]).to eq 'number'
34
- expect(err[:code]).to eq 'invalid_number'
35
- expect(err[:message]).to eq 'The card number is not a valid credit card number.'
30
+ error = body[:error]
31
+
32
+ expect(error[:type]).to eq 'card_error'
33
+ expect(error[:param]).to eq 'number'
34
+ expect(error[:code]).to eq 'invalid_number'
35
+ expect(error[:message]).to eq 'The card number is not a valid credit card number.'
36
36
  end
37
37
  end
38
38
  end
@@ -1,3 +1,4 @@
1
+ require 'stripe_mock'
1
2
 
2
3
  describe 'README examples' do
3
4
  let(:stripe_helper) { StripeMock.create_test_helper }
@@ -24,6 +25,7 @@ describe 'README examples' do
24
25
  expect(e).to be_a Stripe::CardError
25
26
  expect(e.http_status).to eq(402)
26
27
  expect(e.code).to eq('card_declined')
28
+ expect(e.json_body[:error][:decline_code]).to eq('do_not_honor')
27
29
  }
28
30
  end
29
31
 
@@ -52,8 +52,8 @@ describe 'StripeMock Server', :mock_server => true do
52
52
 
53
53
  it "returns a response with symbolized hash keys" do
54
54
  stripe_helper.create_plan(id: 'x')
55
- response, api_key = StripeMock.redirect_to_mock_server('get', '/v1/plans/x', 'xxx')
56
- response.keys.each {|k| expect(k).to be_a(Symbol) }
55
+ response, api_key = StripeMock.redirect_to_mock_server('get', '/v1/plans/x', api_key: 'xxx')
56
+ response.data.keys.each {|k| expect(k).to be_a(Symbol) }
57
57
  end
58
58
 
59
59
 
@@ -21,7 +21,7 @@ shared_examples 'Card API' do
21
21
  expect(card.exp_year).to eq(2099)
22
22
  end
23
23
 
24
- it 'creates/returns a card when using recipient.cards.create given a card token' do
24
+ it 'creates/returns a card when using recipient.cards.create given a card token', skip: 'Stripe has deprecated Recipients' do
25
25
  params = {
26
26
  id: 'test_recipient_sub',
27
27
  name: 'MyRec',
@@ -69,7 +69,7 @@ shared_examples 'Card API' do
69
69
  expect(card.exp_year).to eq(3031)
70
70
  end
71
71
 
72
- it 'creates/returns a card when using recipient.cards.create given card params' do
72
+ it 'creates/returns a card when using recipient.cards.create given card params', skip: 'Stripe has deprecated Recipients' do
73
73
  params = {
74
74
  id: 'test_recipient_sub',
75
75
  name: 'MyRec',
@@ -192,7 +192,7 @@ shared_examples 'Card API' do
192
192
  end
193
193
  end
194
194
 
195
- describe "retrieval and deletion with recipients", :live => true do
195
+ describe "retrieval and deletion with recipients", :live => true, skip: 'Stripe has deprecated Recipients' do
196
196
  let!(:recipient) { Stripe::Recipient.create(name: 'Test Recipient', type: 'individual') }
197
197
  let!(:card_token) { stripe_helper.generate_card_token(number: "4000056655665556") }
198
198
  let!(:card) { recipient.cards.create(card: card_token) }
@@ -27,6 +27,12 @@ shared_examples 'Coupon API' do
27
27
  expect(e.message).to match /duration/
28
28
  }
29
29
  end
30
+ it 'fails when a coupon is created without a currency when amount_off is specified' do
31
+ expect { Stripe::Coupon.create(id: '10OFF', duration: 'once', amount_off: 1000) }.to raise_error {|e|
32
+ expect(e).to be_a(Stripe::InvalidRequestError)
33
+ expect(e.message).to match /You must pass currency when passing amount_off/
34
+ }
35
+ end
30
36
  end
31
37
 
32
38
  context 'retrieve coupon', live: true do
@@ -215,6 +215,21 @@ shared_examples 'Customer API' do
215
215
  customer = Stripe::Customer.retrieve('test_cus_coupon')
216
216
  expect(customer.discount).to_not be_nil
217
217
  expect(customer.discount.coupon).to_not be_nil
218
+ expect(customer.discount.customer).to eq customer.id
219
+ expect(customer.discount.start).to be_within(1).of Time.now.to_i
220
+ end
221
+
222
+ describe 'repeating coupon with duration limit', live: true do
223
+ let!(:coupon) { Stripe::Coupon.create(id: '10OFF', amount_off: 1000, currency: 'usd', duration: 'repeating', duration_in_months: 12) }
224
+ let!(:customer) { Stripe::Customer.create(coupon: '10OFF') }
225
+ it 'creates the discount with the end date', live: true do
226
+ discount = Stripe::Customer.retrieve(customer.id).discount
227
+ expect(discount).to_not be_nil
228
+ expect(discount.coupon).to_not be_nil
229
+ expect(discount.end).to be_within(1).of (Time.now + 365 * 24 * 3600).to_i
230
+ end
231
+ after { Stripe::Coupon.retrieve(coupon.id).delete }
232
+ after { Stripe::Customer.retrieve(customer.id).delete }
218
233
  end
219
234
 
220
235
  it 'cannot create a customer with a coupon that does not exist' do
@@ -253,10 +268,23 @@ shared_examples 'Customer API' do
253
268
  expect(customer.id).to eq(original.id)
254
269
  expect(customer.email).to eq(original.email)
255
270
  expect(customer.default_source).to eq(original.default_source)
271
+ expect(customer.default_source).not_to be_a(Stripe::Card)
256
272
  expect(customer.subscriptions.count).to eq(0)
257
273
  expect(customer.subscriptions.data).to be_empty
258
274
  end
259
275
 
276
+ it "can expand default_source" do
277
+ original = Stripe::Customer.create({
278
+ email: 'johnny@appleseed.com',
279
+ source: gen_card_tk
280
+ })
281
+ customer = Stripe::Customer.retrieve(
282
+ id: original.id,
283
+ expand: ['default_source']
284
+ )
285
+ expect(customer.default_source).to be_a(Stripe::Card)
286
+ end
287
+
260
288
  it "cannot retrieve a customer that doesn't exist" do
261
289
  expect { Stripe::Customer.retrieve('nope') }.to raise_error {|e|
262
290
  expect(e).to be_a Stripe::InvalidRequestError
@@ -378,7 +406,7 @@ shared_examples 'Customer API' do
378
406
  customer = customer.delete
379
407
  expect(customer.deleted).to eq(true)
380
408
  end
381
-
409
+
382
410
  it 'works with the update_subscription method' do
383
411
  stripe_helper.create_plan(id: 'silver')
384
412
  cus = Stripe::Customer.create(source: gen_card_tk)
@@ -386,7 +414,7 @@ shared_examples 'Customer API' do
386
414
  cus.update_subscription(plan: 'silver')
387
415
  }.not_to raise_error
388
416
  end
389
-
417
+
390
418
  it "deletes a stripe customer discount" do
391
419
  original = Stripe::Customer.create(id: 'test_customer_update')
392
420
 
@@ -395,7 +423,7 @@ shared_examples 'Customer API' do
395
423
  original.save
396
424
 
397
425
  expect(original.discount.coupon).to be_a Stripe::Coupon
398
-
426
+
399
427
  original.delete_discount
400
428
 
401
429
  customer = Stripe::Customer.retrieve("test_customer_update")