money_mover 0.0.3

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 +7 -0
  2. data/.gitignore +1 -0
  3. data/.rspec +2 -0
  4. data/Gemfile +17 -0
  5. data/Gemfile.lock +80 -0
  6. data/lib/money_mover/dwolla/account_client.rb +9 -0
  7. data/lib/money_mover/dwolla/account_token.rb +24 -0
  8. data/lib/money_mover/dwolla/api_connection.rb +18 -0
  9. data/lib/money_mover/dwolla/api_server_response.rb +31 -0
  10. data/lib/money_mover/dwolla/application_client.rb +9 -0
  11. data/lib/money_mover/dwolla/application_token.rb +25 -0
  12. data/lib/money_mover/dwolla/client.rb +24 -0
  13. data/lib/money_mover/dwolla/config.rb +33 -0
  14. data/lib/money_mover/dwolla/environment_urls.rb +35 -0
  15. data/lib/money_mover/dwolla/error_handler.rb +30 -0
  16. data/lib/money_mover/dwolla/models/account_funding_source.rb +28 -0
  17. data/lib/money_mover/dwolla/models/api_resource.rb +70 -0
  18. data/lib/money_mover/dwolla/models/customer.rb +53 -0
  19. data/lib/money_mover/dwolla/models/document.rb +22 -0
  20. data/lib/money_mover/dwolla/models/funding_source.rb +30 -0
  21. data/lib/money_mover/dwolla/models/micro_deposit_initiation.rb +19 -0
  22. data/lib/money_mover/dwolla/models/micro_deposit_verification.rb +31 -0
  23. data/lib/money_mover/dwolla/models/receive_only_business_customer.rb +27 -0
  24. data/lib/money_mover/dwolla/models/receive_only_customer.rb +19 -0
  25. data/lib/money_mover/dwolla/models/root_account.rb +27 -0
  26. data/lib/money_mover/dwolla/models/transfer.rb +33 -0
  27. data/lib/money_mover/dwolla/models/unverified_business_customer.rb +43 -0
  28. data/lib/money_mover/dwolla/models/unverified_customer.rb +27 -0
  29. data/lib/money_mover/dwolla/models/verified_business_customer.rb +53 -0
  30. data/lib/money_mover/dwolla/models/webhook_subscription.rb +36 -0
  31. data/lib/money_mover/dwolla/token.rb +26 -0
  32. data/lib/money_mover/dwolla.rb +44 -0
  33. data/lib/money_mover/standalone_errors.rb +12 -0
  34. data/lib/money_mover/version.rb +3 -0
  35. data/lib/money_mover.rb +15 -0
  36. data/money_mover.gemspec +27 -0
  37. data/spec/integration/money_mover/dwolla/customers/create_spec.rb +75 -0
  38. data/spec/integration/money_mover/dwolla/customers/find_spec.rb +71 -0
  39. data/spec/integration/money_mover/dwolla/customers/funding-sources/create_spec.rb +40 -0
  40. data/spec/integration/money_mover/dwolla/documents/create_spec.rb +62 -0
  41. data/spec/integration/money_mover/dwolla/funding-sources/micro-deposits/initiation_spec.rb +52 -0
  42. data/spec/integration/money_mover/dwolla/funding-sources/micro-deposits/verification_spec.rb +77 -0
  43. data/spec/integration/money_mover/dwolla/transfers/create_spec.rb +80 -0
  44. data/spec/lib/money_mover/dwolla/client_spec.rb +101 -0
  45. data/spec/lib/money_mover/dwolla/config_spec.rb +20 -0
  46. data/spec/lib/money_mover/dwolla/error_handler_spec.rb +78 -0
  47. data/spec/lib/money_mover/dwolla/funding_source_spec.rb +94 -0
  48. data/spec/lib/money_mover/dwolla/microdeposits_initiation_spec.rb +36 -0
  49. data/spec/lib/money_mover/dwolla/root_account_spec.rb +86 -0
  50. data/spec/lib/money_mover/dwolla/token_spec.rb +101 -0
  51. data/spec/lib/money_mover/dwolla/transfer_spec.rb +94 -0
  52. data/spec/lib/money_mover/dwolla/webhook_subscription_spec.rb +199 -0
  53. data/spec/spec_helper.rb +121 -0
  54. data/spec/support/dwolla_helper.rb +330 -0
  55. data/spec/support/fixtures/sample.jpg +0 -0
  56. metadata +196 -0
@@ -0,0 +1,330 @@
1
+ require 'webmock'
2
+
3
+ class TestConfigProvider
4
+ def access_token
5
+ "X7JyEzy6F85MeDZERFE2cgiLbm9TXIbQNmr16cCfI6y1CtPrak"
6
+ end
7
+
8
+ def refresh_token
9
+ "Qlj3SFaIGPJmeFrPEJsPI6smKwdXLsPYAYi83lXkqeb8q0MX1P"
10
+ end
11
+
12
+ def application_token
13
+ "SF8Vxx6H644lekdVKAAHFnqRCFy8WGqltzitpii6w2MVaZp1Nw"
14
+ end
15
+
16
+ def environment
17
+ :sandbox
18
+ end
19
+
20
+ def api_key
21
+ "IkvGNVjFLJTBZeWsqFdHMppbuG2g4kTY1WFxz1HUjusxZ71eMz"
22
+ end
23
+
24
+ def api_secret_key
25
+ "lB9gPl6xyqLIiKF9al1K8e2sXhNyvjkrsTMUFKs176oXsSo2K9"
26
+ end
27
+
28
+ def webhook_secret_key
29
+ "20f2f952eb91071ab655d5522d7d246177b3fbbe8fe878df80be36a0fa2c4c6f7d1e981038d55aae40e5325d6377b0b4be78375c6566c74a7c9fdba7008daf58"
30
+ end
31
+
32
+ def webhook_callback_url
33
+ "http://buildpay.sprouti.com/ach/events"
34
+ end
35
+
36
+ def account_token_provider
37
+ TestDwollaTokenProvider
38
+ end
39
+ end
40
+
41
+ class TestDwollaTokenProvider
42
+ def access_token
43
+ "X7JyEzy6F85MeDZERFE2cgiLbm9TXIbQNmr16cCfI6y1CtPrak"
44
+ end
45
+
46
+ def refresh_token
47
+ "Qlj3SFaIGPJmeFrPEJsPI6smKwdXLsPYAYi83lXkqeb8q0MX1P"
48
+ end
49
+ end
50
+
51
+ class DwollaHelper
52
+ include WebMock::API
53
+
54
+ def initialize
55
+ @config_provider = TestConfigProvider.new
56
+ end
57
+
58
+ def access_token
59
+ @config_provider.access_token
60
+ end
61
+
62
+ def refresh_token
63
+ @config_provider.refresh_token
64
+ end
65
+
66
+ def application_token
67
+ @config_provider.application_token
68
+ end
69
+
70
+ def api_key
71
+ @config_provider.api_key
72
+ end
73
+
74
+ def api_secret_key
75
+ @config_provider.api_secret_key
76
+ end
77
+
78
+ def webhook_secret_key
79
+ @config_provider.webhook_secret_key
80
+ end
81
+
82
+ def webhook_callback_url
83
+ @config_provider.webhook_callback_url
84
+ end
85
+
86
+ def api_url
87
+ "https://api-uat.dwolla.com"
88
+ end
89
+
90
+ def api_endpoint
91
+ api_url
92
+ end
93
+
94
+ def customers_endpoint
95
+ 'customers'
96
+ end
97
+
98
+ def customer_endpoint(customer_token)
99
+ [ customers_endpoint, customer_token ].join '/'
100
+ end
101
+
102
+ def customer_funding_sources_endpoint(customer_token)
103
+ [ customer_endpoint(customer_token), 'funding-sources' ].join '/'
104
+ end
105
+
106
+ def customer_funding_source_endpoint(customer_token, funding_source_token)
107
+ [ customer_funding_sources_endpoint(customer_token), funding_source_token ].join '/'
108
+ end
109
+
110
+ def request_headers
111
+ {
112
+ 'Accept'=>'application/vnd.dwolla.v1.hal+json',
113
+ #'Accept-Encoding'=>'gzip, deflate',
114
+ 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
115
+ 'Authorization'=>"Bearer #{access_token}",
116
+ #'Content-Type'=>'application/json',
117
+ }
118
+ end
119
+
120
+ def customer_created_response(customer_token)
121
+ resource_created_response customer_endpoint(customer_token)
122
+ end
123
+
124
+ def transfer_created_response(transfer_token)
125
+ resource_created_response transfer_endpoint(transfer_token)
126
+ end
127
+
128
+ def customer_document_created_response(resource_token)
129
+ resource_created_response document_endpoint(resource_token)
130
+ end
131
+
132
+ def customer_funding_source_created_response(customer_token, funding_source_token)
133
+ resource_created_response customer_funding_source_endpoint(customer_token, funding_source_token)
134
+ end
135
+
136
+ def customer_documents_endpoint(customer_token)
137
+ [ customer_endpoint(customer_token), "documents" ].join '/'
138
+ end
139
+
140
+ def funding_sources_endpoint
141
+ "funding-sources"
142
+ end
143
+
144
+ def documents_endpoint
145
+ "documents"
146
+ end
147
+
148
+ def document_endpoint(resource_token)
149
+ [ documents_endpoint, resource_token ].join '/'
150
+ end
151
+
152
+ def funding_source_endpoint(funding_source_token)
153
+ [ funding_sources_endpoint, funding_source_token ].join '/'
154
+ end
155
+
156
+ def funding_source_microdeposits_endpoint(funding_source_token)
157
+ [ funding_source_endpoint(funding_source_token), "micro-deposits" ].join '/'
158
+ end
159
+
160
+ def transfers_endpoint
161
+ "transfers"
162
+ end
163
+
164
+ def transfer_endpoint(transfer_token)
165
+ [ transfers_endpoint, transfer_token ].join '/'
166
+ end
167
+
168
+ def resource_created_response(resource_location)
169
+ {
170
+ status: 201,
171
+ body: "",
172
+ headers: {
173
+ location: resource_location
174
+ }
175
+ }
176
+ end
177
+
178
+ def resource_create_error_response(response_body)
179
+ {
180
+ status: 400,
181
+ body: response_body.to_json,
182
+ headers: {"Content-Type" => "application/json"}
183
+ }
184
+ end
185
+
186
+ def stub_create_customer_request(params, response)
187
+ stub_post_request customers_endpoint, params, response
188
+ end
189
+
190
+ def stub_create_customer_funding_source_request(customer_token, params, response)
191
+ stub_post_request customer_funding_sources_endpoint(customer_token), params, response
192
+ end
193
+
194
+ def stub_find_customer_request(customer_token, response)
195
+ stub_get_request customer_endpoint(customer_token), response
196
+ end
197
+
198
+ def stub_funding_source_microdeposits_request(funding_source_token, create_params, response)
199
+ stub_post_request funding_source_microdeposits_endpoint(funding_source_token), create_params, response
200
+ end
201
+
202
+ def stub_create_transfer_request(params, response)
203
+ stub_post_request transfers_endpoint, params, response
204
+ end
205
+
206
+ def stub_create_customer_document_request(customer_token, params, response)
207
+ stub_post_request customer_documents_endpoint(customer_token), params, response
208
+ end
209
+
210
+ def stub_get_request(url, response)
211
+ stub_request(:get, build_dwolla_url(url)).with(headers: request_headers).to_return(response)
212
+ end
213
+
214
+ def stub_post_request(url, params, response)
215
+ stub_request(:post, build_dwolla_url(url)).with(body: params, headers: request_headers).to_return(response)
216
+ end
217
+
218
+ def build_dwolla_url(url)
219
+ [ api_endpoint, url ].join '/'
220
+ end
221
+
222
+ # taken from ach_helper
223
+
224
+ def get_token_url
225
+ "https://uat.dwolla.com/oauth/v2/token"
226
+ end
227
+
228
+ def error_response(body_json = {})
229
+ {
230
+ status: 400,
231
+ body: body_json.to_json,
232
+ headers: {"Content-Type" => "application/json"}
233
+ }
234
+ end
235
+
236
+ def stub_get_token_request(token_response = nil)
237
+ token_response ||= {
238
+ "access_token": application_token,
239
+ "token_type": "bearer",
240
+ "expires_in": 3600,
241
+ "scope": "AccountInfoFull|ManageAccount|Contacts|Transactions|Balance|Send|Request|Funding"
242
+ }
243
+
244
+ req_body = {
245
+ grant_type: "client_credentials",
246
+ client_id: api_key,
247
+ client_secret: api_secret_key
248
+ }
249
+
250
+ stub_request(:post, get_token_url).
251
+ with(:body => req_body).
252
+ to_return(status: 200, body: token_response.to_json, headers: {"Content-Type" => "application/json"})
253
+ end
254
+
255
+ def stub_refresh_token_request(token_response)
256
+ req_body = {
257
+ grant_type: "refresh_token",
258
+ client_id: api_key,
259
+ client_secret: api_secret_key,
260
+ refresh_token: refresh_token
261
+ }
262
+
263
+ req_headers = {
264
+ 'Accept'=>'application/vnd.dwolla.v1.hal+json',
265
+ 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
266
+ 'User-Agent'=>'Faraday v0.9.2'
267
+ }
268
+
269
+ stub_request(:post, get_token_url).with(body: req_body, headers: req_headers).
270
+ to_return(:status => 200, :body => token_response.to_json, headers: {"Content-Type" => "application/json"})
271
+ end
272
+
273
+ def webhook_subscriptions_url
274
+ "#{api_url}/webhook-subscriptions"
275
+ end
276
+
277
+ def webhook_subscription_url(webhook_token)
278
+ "#{api_url}/webhook-subscriptions/#{webhook_token}"
279
+ end
280
+
281
+ def stub_get_webhook_subscriptions_request(stub_response)
282
+ stub_request(:get, webhook_subscriptions_url).
283
+ with(headers: dwolla_application_request_headers).
284
+ to_return(body: stub_response.to_json, headers: {"Content-Type" => "application/json"})
285
+ end
286
+
287
+ def stub_create_webhook_subscription_request(stub_params, stub_response)
288
+ stub_request(:post, webhook_subscriptions_url).
289
+ with(headers: dwolla_application_request_headers, body: stub_params).
290
+ to_return(stub_response)
291
+ end
292
+
293
+ def stub_delete_webhook_subscription_request(subscription_id, stub_response)
294
+ stub_request(:delete, webhook_subscription_url(subscription_id)).
295
+ with(headers: dwolla_application_request_headers).
296
+ to_return(stub_response)
297
+ end
298
+
299
+ def dwolla_application_request_headers
300
+ {
301
+ 'Accept'=>'application/vnd.dwolla.v1.hal+json',
302
+ 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
303
+ 'Authorization'=>"Bearer #{application_token}",
304
+ 'User-Agent'=>'Faraday v0.9.2'
305
+ }
306
+ end
307
+
308
+ def create_webhook_success_response(webhook_token)
309
+ resource_created_response webhook_subscription_url(webhook_token)
310
+ end
311
+
312
+ def resource_deleted_response
313
+ {
314
+ status: 200,
315
+ body: ""
316
+ }
317
+ end
318
+
319
+ def create_customer_success_response(customer_token)
320
+ resource_created_response customer_url(customer_token)
321
+ end
322
+
323
+ def customers_url
324
+ "#{api_url}/customers"
325
+ end
326
+
327
+ def customer_url(customer_token)
328
+ "#{customers_url}/#{customer_token}"
329
+ end
330
+ end
Binary file
metadata ADDED
@@ -0,0 +1,196 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: money_mover
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
+ platform: ruby
6
+ authors:
7
+ - Daniel Errante
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-07-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.9'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 0.9.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '0.9'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 0.9.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: faraday_middleware
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '0.9'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 0.9.0
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '0.9'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 0.9.0
53
+ - !ruby/object:Gem::Dependency
54
+ name: activemodel
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '4.2'
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 4.2.6
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '4.2'
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: 4.2.6
73
+ - !ruby/object:Gem::Dependency
74
+ name: activesupport
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - "~>"
78
+ - !ruby/object:Gem::Version
79
+ version: '4.2'
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 4.2.6
83
+ type: :runtime
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '4.2'
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: 4.2.6
93
+ description: Moves Money with ACH integrations (dwolla, stripe)
94
+ email: danoph@gmail.com
95
+ executables: []
96
+ extensions: []
97
+ extra_rdoc_files: []
98
+ files:
99
+ - ".gitignore"
100
+ - ".rspec"
101
+ - Gemfile
102
+ - Gemfile.lock
103
+ - lib/money_mover.rb
104
+ - lib/money_mover/dwolla.rb
105
+ - lib/money_mover/dwolla/account_client.rb
106
+ - lib/money_mover/dwolla/account_token.rb
107
+ - lib/money_mover/dwolla/api_connection.rb
108
+ - lib/money_mover/dwolla/api_server_response.rb
109
+ - lib/money_mover/dwolla/application_client.rb
110
+ - lib/money_mover/dwolla/application_token.rb
111
+ - lib/money_mover/dwolla/client.rb
112
+ - lib/money_mover/dwolla/config.rb
113
+ - lib/money_mover/dwolla/environment_urls.rb
114
+ - lib/money_mover/dwolla/error_handler.rb
115
+ - lib/money_mover/dwolla/models/account_funding_source.rb
116
+ - lib/money_mover/dwolla/models/api_resource.rb
117
+ - lib/money_mover/dwolla/models/customer.rb
118
+ - lib/money_mover/dwolla/models/document.rb
119
+ - lib/money_mover/dwolla/models/funding_source.rb
120
+ - lib/money_mover/dwolla/models/micro_deposit_initiation.rb
121
+ - lib/money_mover/dwolla/models/micro_deposit_verification.rb
122
+ - lib/money_mover/dwolla/models/receive_only_business_customer.rb
123
+ - lib/money_mover/dwolla/models/receive_only_customer.rb
124
+ - lib/money_mover/dwolla/models/root_account.rb
125
+ - lib/money_mover/dwolla/models/transfer.rb
126
+ - lib/money_mover/dwolla/models/unverified_business_customer.rb
127
+ - lib/money_mover/dwolla/models/unverified_customer.rb
128
+ - lib/money_mover/dwolla/models/verified_business_customer.rb
129
+ - lib/money_mover/dwolla/models/webhook_subscription.rb
130
+ - lib/money_mover/dwolla/token.rb
131
+ - lib/money_mover/standalone_errors.rb
132
+ - lib/money_mover/version.rb
133
+ - money_mover.gemspec
134
+ - spec/integration/money_mover/dwolla/customers/create_spec.rb
135
+ - spec/integration/money_mover/dwolla/customers/find_spec.rb
136
+ - spec/integration/money_mover/dwolla/customers/funding-sources/create_spec.rb
137
+ - spec/integration/money_mover/dwolla/documents/create_spec.rb
138
+ - spec/integration/money_mover/dwolla/funding-sources/micro-deposits/initiation_spec.rb
139
+ - spec/integration/money_mover/dwolla/funding-sources/micro-deposits/verification_spec.rb
140
+ - spec/integration/money_mover/dwolla/transfers/create_spec.rb
141
+ - spec/lib/money_mover/dwolla/client_spec.rb
142
+ - spec/lib/money_mover/dwolla/config_spec.rb
143
+ - spec/lib/money_mover/dwolla/error_handler_spec.rb
144
+ - spec/lib/money_mover/dwolla/funding_source_spec.rb
145
+ - spec/lib/money_mover/dwolla/microdeposits_initiation_spec.rb
146
+ - spec/lib/money_mover/dwolla/root_account_spec.rb
147
+ - spec/lib/money_mover/dwolla/token_spec.rb
148
+ - spec/lib/money_mover/dwolla/transfer_spec.rb
149
+ - spec/lib/money_mover/dwolla/webhook_subscription_spec.rb
150
+ - spec/spec_helper.rb
151
+ - spec/support/dwolla_helper.rb
152
+ - spec/support/fixtures/sample.jpg
153
+ homepage: https://github.com/danoph/money_mover
154
+ licenses:
155
+ - MIT
156
+ metadata: {}
157
+ post_install_message:
158
+ rdoc_options: []
159
+ require_paths:
160
+ - lib
161
+ required_ruby_version: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: 1.9.3
166
+ required_rubygems_version: !ruby/object:Gem::Requirement
167
+ requirements:
168
+ - - ">="
169
+ - !ruby/object:Gem::Version
170
+ version: '0'
171
+ requirements: []
172
+ rubyforge_project:
173
+ rubygems_version: 2.5.1
174
+ signing_key:
175
+ specification_version: 4
176
+ summary: Money Mover
177
+ test_files:
178
+ - spec/integration/money_mover/dwolla/customers/create_spec.rb
179
+ - spec/integration/money_mover/dwolla/customers/find_spec.rb
180
+ - spec/integration/money_mover/dwolla/customers/funding-sources/create_spec.rb
181
+ - spec/integration/money_mover/dwolla/documents/create_spec.rb
182
+ - spec/integration/money_mover/dwolla/funding-sources/micro-deposits/initiation_spec.rb
183
+ - spec/integration/money_mover/dwolla/funding-sources/micro-deposits/verification_spec.rb
184
+ - spec/integration/money_mover/dwolla/transfers/create_spec.rb
185
+ - spec/lib/money_mover/dwolla/client_spec.rb
186
+ - spec/lib/money_mover/dwolla/config_spec.rb
187
+ - spec/lib/money_mover/dwolla/error_handler_spec.rb
188
+ - spec/lib/money_mover/dwolla/funding_source_spec.rb
189
+ - spec/lib/money_mover/dwolla/microdeposits_initiation_spec.rb
190
+ - spec/lib/money_mover/dwolla/root_account_spec.rb
191
+ - spec/lib/money_mover/dwolla/token_spec.rb
192
+ - spec/lib/money_mover/dwolla/transfer_spec.rb
193
+ - spec/lib/money_mover/dwolla/webhook_subscription_spec.rb
194
+ - spec/spec_helper.rb
195
+ - spec/support/dwolla_helper.rb
196
+ - spec/support/fixtures/sample.jpg