fake_braintree 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -3
  3. data/.hound.yml +2 -0
  4. data/.javascript_ignore +2 -0
  5. data/.travis.yml +4 -1
  6. data/CONTRIBUTING.md +6 -2
  7. data/NEWS.md +16 -0
  8. data/README.md +41 -10
  9. data/Rakefile +56 -0
  10. data/asset_versions.yml +3 -0
  11. data/fake_braintree.gemspec +3 -2
  12. data/lib/fake_braintree.rb +17 -22
  13. data/lib/fake_braintree/address.rb +2 -0
  14. data/lib/fake_braintree/braintree_assets/dropin/1.7.0/braintree-dropin-internal.min.js +12 -0
  15. data/lib/fake_braintree/braintree_assets/dropin/1.7.0/braintree-dropin.css +4321 -0
  16. data/lib/fake_braintree/braintree_assets/dropin/1.7.0/images/2x-sf9a66b4f5a.png +0 -0
  17. data/lib/fake_braintree/braintree_assets/dropin/1.7.0/inline-frame.html +48 -0
  18. data/lib/fake_braintree/braintree_assets/dropin/1.7.0/modal-frame.html +25 -0
  19. data/lib/fake_braintree/braintree_assets/dropin/1.7.0/vendor/jquery-2.1.0.js +4 -0
  20. data/lib/fake_braintree/braintree_assets/dropin/1.7.0/vendor/modernizr.js +4 -0
  21. data/lib/fake_braintree/braintree_assets/dropin/1.7.0/vendor/normalize.css +339 -0
  22. data/lib/fake_braintree/client_token.rb +15 -0
  23. data/lib/fake_braintree/credit_card.rb +20 -0
  24. data/lib/fake_braintree/credit_card_serializer.rb +20 -0
  25. data/lib/fake_braintree/customer.rb +11 -3
  26. data/lib/fake_braintree/helpers.rb +3 -0
  27. data/lib/fake_braintree/merchant_account.rb +95 -0
  28. data/lib/fake_braintree/payment_method.rb +11 -0
  29. data/lib/fake_braintree/redirect.rb +6 -0
  30. data/lib/fake_braintree/registry.rb +10 -8
  31. data/lib/fake_braintree/server.rb +12 -4
  32. data/lib/fake_braintree/sinatra_app.rb +148 -14
  33. data/lib/fake_braintree/subscription.rb +48 -13
  34. data/lib/fake_braintree/transaction.rb +42 -0
  35. data/lib/fake_braintree/version.rb +1 -1
  36. data/spec/dummy/checkout_app.rb +44 -0
  37. data/spec/dummy/public/braintree.js +5 -0
  38. data/spec/dummy/public/jquery-2.1.0.js +4 -0
  39. data/spec/dummy/views/advanced_checkout.html.erb +36 -0
  40. data/spec/dummy/views/credit_cards.html.erb +16 -0
  41. data/spec/dummy/views/custom_checkout.html.erb +22 -0
  42. data/spec/dummy/views/dropin_checkout.html.erb +21 -0
  43. data/spec/fake_braintree/checkout_spec.rb +45 -0
  44. data/spec/fake_braintree/client_token_spec.rb +19 -0
  45. data/spec/fake_braintree/credit_card_spec.rb +15 -0
  46. data/spec/fake_braintree/merchant_account_spec.rb +83 -0
  47. data/spec/fake_braintree/payment_method_spec.rb +122 -0
  48. data/spec/fake_braintree/registry_spec.rb +4 -2
  49. data/spec/fake_braintree/subscription_spec.rb +51 -2
  50. data/spec/fake_braintree_spec.rb +34 -1
  51. data/spec/spec_helper.rb +11 -1
  52. data/spec/support/matchers/clear_hash_when_cleared.rb +1 -1
  53. data/spec/support/matchers/have_accessor_for.rb +1 -1
  54. data/spec/support/merchant_account_helpers.rb +24 -0
  55. data/spec/support/subscription_helpers.rb +4 -0
  56. metadata +60 -6
@@ -0,0 +1,20 @@
1
+ module FakeBraintree
2
+ class CreditCardSerializer
3
+ def initialize(credit_card)
4
+ @credit_card = credit_card
5
+ end
6
+
7
+ def to_h
8
+ last_2 = @credit_card.last_4[-2..-1]
9
+ card_type = @credit_card.card_type
10
+ {
11
+ type: 'CreditCard',
12
+ description: "ending in #{last_2}",
13
+ details: {
14
+ cardType: card_type,
15
+ lastTwo: last_2
16
+ }
17
+ }
18
+ end
19
+ end
20
+ end
@@ -1,3 +1,7 @@
1
+ require 'fake_braintree/helpers'
2
+ require 'fake_braintree/credit_card'
3
+ require 'fake_braintree/valid_credit_cards'
4
+
1
5
  module FakeBraintree
2
6
  class Customer
3
7
  include Helpers
@@ -39,8 +43,12 @@ module FakeBraintree
39
43
  end
40
44
 
41
45
  def delete
42
- delete_customer_with_id(customer_id)
43
- deletion_response
46
+ if customer_exists_in_registry?
47
+ delete_customer_with_id(customer_id)
48
+ deletion_response
49
+ else
50
+ response_for_customer_not_found
51
+ end
44
52
  end
45
53
 
46
54
  private
@@ -145,7 +153,7 @@ module FakeBraintree
145
153
  end
146
154
 
147
155
  def delete_customer_with_id(id)
148
- FakeBraintree.registry.customers[id] = nil
156
+ FakeBraintree.registry.customers.delete(id)
149
157
  end
150
158
 
151
159
  def deletion_response
@@ -1,3 +1,6 @@
1
+ require 'digest/md5'
2
+ require 'active_support/gzip'
3
+
1
4
  module FakeBraintree
2
5
  module Helpers
3
6
  def gzip(content)
@@ -0,0 +1,95 @@
1
+ module FakeBraintree
2
+ class MerchantAccount
3
+ include Helpers
4
+
5
+ def initialize(merchant_account_hash_from_params, options)
6
+ @merchant_account_hash = {
7
+ 'id' => options[:id]
8
+ }
9
+ @merchant_account_hash.merge!(merchant_account_hash_from_params)
10
+ set_merchant_account_id
11
+ end
12
+
13
+ def create
14
+ if invalid?
15
+ response_for_invalid_merchant_account
16
+ else
17
+ create_merchant_account_with(merchant_account_hash)
18
+ response_for_created_merchant_account(merchant_account_hash)
19
+ end
20
+ end
21
+
22
+ def update
23
+ if merchant_account_exists_in_registry?
24
+ updates = merchant_account_hash
25
+ updated_merchant_account = update_existing_merchant_account(updates)
26
+ response_for_updated_merchant_account(updated_merchant_account)
27
+ else
28
+ response_for_merchant_account_not_found
29
+ end
30
+ end
31
+
32
+ def delete
33
+ delete_merchant_account_with_id(merchant_account_id)
34
+ deletion_response
35
+ end
36
+
37
+ private
38
+
39
+ def invalid?
40
+ false
41
+ end
42
+
43
+ def create_merchant_account_with(hash)
44
+ FakeBraintree.registry.merchant_accounts[hash['id'].to_s] = hash
45
+ end
46
+
47
+ def update_existing_merchant_account(updates_hash)
48
+ merchant_account_from_registry.merge!(updates_hash)
49
+ end
50
+
51
+ def merchant_account_hash
52
+ @merchant_account_hash
53
+ end
54
+
55
+ def merchant_account_from_registry
56
+ FakeBraintree.registry.merchant_accounts[merchant_account_id]
57
+ end
58
+
59
+ def merchant_account_exists_in_registry?
60
+ FakeBraintree.registry.merchant_accounts.key?(merchant_account_id)
61
+ end
62
+
63
+ def delete_merchant_account_with_id(id)
64
+ FakeBraintree.registry.merchant_accounts[id] = nil
65
+ end
66
+
67
+ def deletion_response
68
+ gzipped_response(200, '')
69
+ end
70
+
71
+ def response_for_created_merchant_account(hash)
72
+ gzipped_response(201, hash.to_xml(root: 'merchant_account'))
73
+ end
74
+
75
+ def response_for_updated_merchant_account(hash)
76
+ gzipped_response(200, hash.to_xml(root: 'merchant_account'))
77
+ end
78
+
79
+ def response_for_merchant_account_not_found
80
+ failure_response(404)
81
+ end
82
+
83
+ def failure_response(code)
84
+ gzipped_response(code, '')
85
+ end
86
+
87
+ def merchant_account_id
88
+ merchant_account_hash['id']
89
+ end
90
+
91
+ def set_merchant_account_id
92
+ @merchant_account_hash['id'] ||= create_id(@merchant_account_hash['merchant_id'])
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,11 @@
1
+ require 'active_support/core_ext/hash/keys'
2
+
3
+ module FakeBraintree
4
+ class PaymentMethod
5
+ def self.tokenize_card(attributes)
6
+ token = (Time.now.to_f * 1000).round.to_s
7
+ FakeBraintree.registry.payment_methods[token] = attributes.stringify_keys
8
+ token
9
+ end
10
+ end
11
+ end
@@ -1,3 +1,9 @@
1
+ require 'uri'
2
+ require 'rack/utils'
3
+ require 'fake_braintree/helpers'
4
+ require 'fake_braintree/credit_card'
5
+ require 'fake_braintree/customer'
6
+
1
7
  module FakeBraintree
2
8
  class Redirect
3
9
  include Helpers
@@ -4,16 +4,18 @@ class FakeBraintree::Registry
4
4
  end
5
5
 
6
6
  attr_accessor :customers,:subscriptions, :failures, :transactions, :redirects,
7
- :credit_cards, :addresses
7
+ :credit_cards, :addresses, :payment_methods, :merchant_accounts
8
8
 
9
9
  def clear!
10
- @addresses = {}
11
- @customers = {}
12
- @subscriptions = {}
13
- @failures = {}
14
- @transactions = {}
15
- @redirects = {}
16
- @credit_cards = {}
10
+ @addresses = {}
11
+ @customers = {}
12
+ @subscriptions = {}
13
+ @failures = {}
14
+ @transactions = {}
15
+ @redirects = {}
16
+ @credit_cards = {}
17
+ @payment_methods = {}
18
+ @merchant_accounts = {}
17
19
  end
18
20
 
19
21
  def failure?(card_number)
@@ -1,7 +1,15 @@
1
+ require 'forwardable'
2
+ require 'capybara'
3
+ require 'fake_braintree/sinatra_app'
4
+
1
5
  class FakeBraintree::Server
2
- def boot
3
- server = Capybara::Server.new(FakeBraintree::SinatraApp)
4
- server.boot
5
- ENV['GATEWAY_PORT'] = server.port.to_s
6
+ SERVER_HOST = '127.0.0.1'
7
+
8
+ extend Forwardable
9
+ def_delegators :@server, :port, :boot
10
+
11
+ def initialize(options = {})
12
+ app = FakeBraintree::SinatraApp
13
+ @server = Capybara::Server.new(app, options.fetch(:port, nil), SERVER_HOST)
6
14
  end
7
15
  end
@@ -1,8 +1,23 @@
1
+ require 'sinatra/base'
2
+ require 'active_support/core_ext/hash/conversions'
3
+ require 'fake_braintree/customer'
4
+ require 'fake_braintree/subscription'
5
+ require 'fake_braintree/redirect'
6
+ require 'fake_braintree/credit_card'
7
+ require 'fake_braintree/address'
8
+ require 'fake_braintree/payment_method'
9
+ require 'fake_braintree/transaction'
10
+ require 'fake_braintree/client_token'
11
+ require 'fake_braintree/credit_card_serializer'
12
+ require 'fake_braintree/merchant_account'
13
+
1
14
  module FakeBraintree
2
15
  class SinatraApp < Sinatra::Base
3
16
  set :show_exceptions, false
4
17
  set :dump_errors, true
5
18
  set :raise_errors, true
19
+ set :public_folder, File.dirname(__FILE__) + '/braintree_assets'
20
+ set :protection, except: :frame_options
6
21
  disable :logging
7
22
 
8
23
  include Helpers
@@ -18,6 +33,52 @@ module FakeBraintree
18
33
  end
19
34
  end
20
35
 
36
+ # braintree.api.Client.prototype.tokenizeCard()
37
+ get '/merchants/:merchant_id/client_api/v1/payment_methods/credit_cards' do
38
+ request_hash = params
39
+
40
+ callback = request_hash.delete('callback')
41
+ nonce = FakeBraintree::PaymentMethod.tokenize_card(request_hash['creditCard'])
42
+
43
+ headers = {
44
+ 'Content-Encoding' => 'gzip',
45
+ 'Content-Type' => 'application/javascript; charset=utf-8'
46
+ }
47
+ json = {
48
+ creditCards: [nonce: nonce],
49
+ status: 201
50
+ }.to_json
51
+ response = "#{callback}(#{json})"
52
+ [200, headers, gzip(response)]
53
+ end
54
+
55
+ # braintree.api.Client.prototype.getCreditCards()
56
+ get '/merchants/:merchant_id/client_api/v1/payment_methods' do
57
+ request_hash = params
58
+
59
+ callback = request_hash.delete('callback')
60
+ customer_id = request_hash['authorizationFingerprint']
61
+ begin
62
+ customer = Braintree::Customer.find(customer_id)
63
+ credit_cards = customer.credit_cards.collect do |card|
64
+ FakeBraintree::CreditCardSerializer.new(card).to_h
65
+ end
66
+ rescue Braintree::NotFoundError, ArgumentError
67
+ credit_cards = []
68
+ end
69
+
70
+ headers = {
71
+ 'Content-Encoding' => 'gzip',
72
+ 'Content-Type' => 'application/javascript; charset=utf-8'
73
+ }
74
+ json = {
75
+ paymentMethods: credit_cards,
76
+ status: 200
77
+ }.to_json
78
+ response = "#{callback}(#{json})"
79
+ [200, headers, gzip(response)]
80
+ end
81
+
21
82
  # Braintree::Customer.create
22
83
  post '/merchants/:merchant_id/customers' do
23
84
  customer_hash = hash_from_request_body_with_key('customer')
@@ -82,9 +143,27 @@ module FakeBraintree
82
143
 
83
144
  # Braintree::Subscription.cancel
84
145
  put '/merchants/:merchant_id/subscriptions/:id/cancel' do
85
- updates = {'status' => Braintree::Subscription::Status::Canceled}
86
146
  options = {id: params[:id], merchant_id: params[:merchant_id]}
87
- Subscription.new(updates, options).update
147
+ Subscription.new({}, options).cancel
148
+ end
149
+
150
+ # Braintree::PaymentMethod.find
151
+ get '/merchants/:merchant_id/payment_methods/any/:token' do
152
+ credit_card = FakeBraintree.registry.credit_cards[params[:token]]
153
+ if credit_card
154
+ gzipped_response(200, credit_card.to_xml(root: 'credit_card'))
155
+ else
156
+ gzipped_response(404, {})
157
+ end
158
+ end
159
+
160
+ # Braintree::PaymentMethod.update
161
+ put '/merchants/:merchant_id/payment_methods/any/:token' do
162
+ credit_card = FakeBraintree.registry.credit_cards[params[:token]]
163
+ updates = hash_from_request_body_with_key('payment_method')
164
+ options = {token: params[:token], merchant_id: params[:merchant_id]}
165
+
166
+ CreditCard.new(updates, options).update
88
167
  end
89
168
 
90
169
  # Braintree::CreditCard.find
@@ -106,9 +185,28 @@ module FakeBraintree
106
185
  CreditCard.new(updates, options).update
107
186
  end
108
187
 
188
+ # Braintree::CreditCard.delete
189
+ delete '/merchants/:merchant_id/payment_methods/credit_card/:credit_card_token' do
190
+ cc_hash = {}
191
+ options = {token: params[:credit_card_token], merchant_id: params[:merchant_id]}
192
+
193
+ CreditCard.new(cc_hash, options).delete
194
+ end
195
+
196
+ # Braintree::PaymentMethod.create
109
197
  # Braintree::CreditCard.create
110
198
  post '/merchants/:merchant_id/payment_methods' do
111
- credit_card_hash = hash_from_request_body_with_key('credit_card')
199
+ request_hash = Hash.from_xml(request.body)
200
+ request.body.rewind
201
+
202
+ credit_card_hash =
203
+ if request_hash.key?('credit_card')
204
+ hash_from_request_body_with_key('credit_card')
205
+ else
206
+ payment_method_hash = hash_from_request_body_with_key('payment_method')
207
+ nonce = payment_method_hash.delete('payment_method_nonce')
208
+ FakeBraintree.registry.payment_methods[nonce].merge(payment_method_hash)
209
+ end
112
210
  options = {merchant_id: params[:merchant_id]}
113
211
 
114
212
  if credit_card_hash['options']
@@ -122,18 +220,13 @@ module FakeBraintree
122
220
  # Braintree::CreditCard.sale
123
221
  post '/merchants/:merchant_id/transactions' do
124
222
  if FakeBraintree.decline_all_cards?
125
- gzipped_response(422, FakeBraintree.create_failure.to_xml(root: 'api_error_response'))
223
+ gzipped_response(422, FakeBraintree.create_failure.to_xml(root: "api_error_response"))
126
224
  else
127
- transaction = hash_from_request_body_with_key('transaction')
225
+ data = hash_from_request_body_with_key("transaction")
128
226
  transaction_id = md5("#{params[:merchant_id]}#{Time.now.to_f}")
129
- options = transaction["options"] || {}
130
- status = "authorized"
131
- if options.fetch("submit_for_settlement", false) == true
132
- status = "submitted_for_settlement"
133
- end
134
- transaction_response = {'id' => transaction_id, 'amount' => transaction['amount'], 'status' => status, 'type' => 'sale'}
135
- FakeBraintree.registry.transactions[transaction_id] = transaction_response
136
- gzipped_response(200, transaction_response.to_xml(root: 'transaction'))
227
+ transaction = FakeBraintree::Transaction.new(data, transaction_id)
228
+ response = transaction.create
229
+ gzipped_response(200, response.to_xml(root: "transaction"))
137
230
  end
138
231
  end
139
232
 
@@ -150,7 +243,7 @@ module FakeBraintree
150
243
  # Braintree::Transaction.refund
151
244
  post '/merchants/:merchant_id/transactions/:transaction_id/refund' do
152
245
  transaction = hash_from_request_body_with_key('transaction')
153
- transaction_id = md5('#{params[:merchant_id]}#{Time.now.to_f}')
246
+ transaction_id = md5("#{params[:merchant_id]}#{Time.now.to_f}")
154
247
  transaction_response = {'id' => transaction_id, 'amount' => transaction['amount'], 'type' => 'credit'}
155
248
  FakeBraintree.registry.transactions[transaction_id] = transaction_response
156
249
  gzipped_response(200, transaction_response.to_xml(root: 'transaction'))
@@ -194,5 +287,46 @@ module FakeBraintree
194
287
  redirect = FakeBraintree.registry.redirects[params[:id]]
195
288
  redirect.confirm
196
289
  end
290
+
291
+ # Braintree::ClientToken.generate
292
+ post '/merchants/:merchant_id/client_token' do
293
+ client_token_hash = hash_from_request_body_with_key('client_token')
294
+ token = FakeBraintree::ClientToken.generate(client_token_hash)
295
+ response = { value: token }.to_xml(root: :client_token)
296
+ gzipped_response(200, response)
297
+ end
298
+
299
+ get '/config' do
300
+ headers = {
301
+ 'Content-Encoding' => 'gzip',
302
+ 'Content-Type' => 'application/javascript; charset=utf-8'
303
+ }
304
+ response = "#{params['callback']}(#{{ status: 200 }.to_json})"
305
+ [200, headers, gzip(response)]
306
+ end
307
+
308
+ #Braintree::MerchantAccount.find
309
+ get '/merchants/:merchant_id/merchant_accounts/:merchant_account_id' do
310
+ merchant_account = FakeBraintree.registry.merchant_accounts[params[:merchant_account_id]]
311
+ if merchant_account
312
+ gzipped_response(200, merchant_account.to_xml(root: 'merchant_account'))
313
+ else
314
+ gzipped_response(404, {})
315
+ end
316
+ end
317
+
318
+ # Braintree::MerchantAccount.update
319
+ put '/merchants/:merchant_id/merchant_accounts/:merchant_account_id/update_via_api' do
320
+ merchant_account_hash = hash_from_request_body_with_key('merchant_account')
321
+ options = {id: params[:merchant_account_id], merchant_id: params[:merchant_id]}
322
+ MerchantAccount.new(merchant_account_hash, options).update
323
+ end
324
+
325
+ # Braintree::MerchantAccount.create
326
+ post '/merchants/:merchant_id/merchant_accounts/create_via_api' do
327
+ merchant_account_hash = hash_from_request_body_with_key('merchant_account')
328
+ options = {merchant_id: params[:merchant_id]}
329
+ MerchantAccount.new(merchant_account_hash, options).create
330
+ end
197
331
  end
198
332
  end
@@ -1,3 +1,5 @@
1
+ require 'fake_braintree/helpers'
2
+
1
3
  module FakeBraintree
2
4
  class Subscription
3
5
  include Helpers
@@ -14,6 +16,10 @@ module FakeBraintree
14
16
 
15
17
  def create
16
18
  create_subscription_with(subscription_hash)
19
+ if credit_card = FakeBraintree.registry.credit_cards[payment_method_token]
20
+ credit_card['subscriptions'] ||= []
21
+ credit_card['subscriptions'] << subscription_hash
22
+ end
17
23
  response_for_created_subscription(subscription_hash)
18
24
  end
19
25
 
@@ -26,13 +32,22 @@ module FakeBraintree
26
32
  end
27
33
  end
28
34
 
35
+ def cancel
36
+ if subscription_exists_in_registry?
37
+ canceled_subscription = update_existing_subscription('status' => canceled_status)
38
+ response_for_canceled_subscription(canceled_subscription)
39
+ else
40
+ response_for_subscription_not_found
41
+ end
42
+ end
43
+
29
44
  private
30
45
 
31
46
  def subscription_hash
32
47
  @subscription_hash.merge(
33
48
  'transactions' => [],
34
- 'add_ons' => added_add_ons,
35
- 'discounts' => added_discounts,
49
+ 'add_ons' => add_ons,
50
+ 'discounts' => discounts,
36
51
  'next_billing_date' => braintree_formatted_date(next_billing_date),
37
52
  'billing_day_of_month' => billing_day_of_month,
38
53
  'billing_period_start_date' => braintree_formatted_date(billing_period_start_date),
@@ -61,17 +76,33 @@ module FakeBraintree
61
76
  date.strftime('%Y-%m-%d')
62
77
  end
63
78
 
64
- def added_add_ons
65
- if @subscription_hash['add_ons'].is_a?(Hash) && @subscription_hash['add_ons']['add']
66
- @subscription_hash['add_ons']['add'].map { |add_on| { 'id' => add_on['inherited_from_id'] } }
67
- else
68
- []
69
- end
79
+ def add_ons
80
+ discounts_or_add_ons(@subscription_hash['add_ons'])
70
81
  end
71
82
 
72
- def added_discounts
73
- if @subscription_hash['discounts'].is_a?(Hash) && @subscription_hash['discounts']['add']
74
- @subscription_hash['discounts']['add'].map { |discount| { 'id' => discount['inherited_from_id'], 'amount' => discount['amount'] } }
83
+ def discounts
84
+ discounts_or_add_ons(@subscription_hash['discounts'])
85
+ end
86
+
87
+ def discounts_or_add_ons(discount_or_add_on)
88
+ return [] unless discount_or_add_on.is_a?(Hash)
89
+
90
+ if discount_or_add_on['add']
91
+ discount_or_add_on['add'].map do |hsh|
92
+ {
93
+ 'id' => hsh['inherited_from_id'],
94
+ 'quantity' => hsh['quantity'],
95
+ 'amount' => hsh['amount']
96
+ }
97
+ end
98
+ elsif discount_or_add_on['update']
99
+ discount_or_add_on['update'].map do |hsh|
100
+ {
101
+ 'id' => hsh['existing_id'],
102
+ 'quantity' => hsh['quantity'],
103
+ 'amount' => hsh['amount']
104
+ }
105
+ end
75
106
  else
76
107
  []
77
108
  end
@@ -117,6 +148,10 @@ module FakeBraintree
117
148
  Braintree::Subscription::Status::Active
118
149
  end
119
150
 
151
+ def canceled_status
152
+ Braintree::Subscription::Status::Canceled
153
+ end
154
+
120
155
  def response_for_created_subscription(hash)
121
156
  gzipped_response(201, hash.to_xml(root: 'subscription'))
122
157
  end
@@ -125,8 +160,8 @@ module FakeBraintree
125
160
  gzipped_response(404, {})
126
161
  end
127
162
 
128
- def response_for_created_subscription(hash)
129
- gzipped_response(201, hash.to_xml(root: 'subscription'))
163
+ def response_for_canceled_subscription(hash)
164
+ gzipped_response(200, hash.to_xml(root: 'subscription'))
130
165
  end
131
166
  end
132
167
  end