fake_braintree 0.6.0 → 0.7.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 (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