money_mover 0.0.3

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 +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,27 @@
1
+ module MoneyMover
2
+ module Dwolla
3
+ class RootAccount < ApiResource
4
+ def account_resource_id
5
+ account_resource_location.split('/').last
6
+ end
7
+
8
+ def account_resource_location
9
+ _links.dig :account, :href
10
+ end
11
+
12
+ def funding_sources
13
+ @funding_sources ||= AccountFundingSource.all(account_resource_id)
14
+ end
15
+
16
+ def bank_account_funding_source
17
+ funding_sources.detect{|source| source.bank_account? }
18
+ end
19
+
20
+ private
21
+
22
+ def self.fetch_endpoint
23
+ "/"
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,33 @@
1
+ module MoneyMover
2
+ module Dwolla
3
+ class Transfer < ApiResource
4
+ attr_accessor :sender_funding_source_token, :destination_funding_source_token, :transfer_amount, :metadata
5
+
6
+ validates_presence_of :sender_funding_source_token, :destination_funding_source_token, :transfer_amount
7
+
8
+ private
9
+
10
+ def create_endpoint
11
+ "/transfers"
12
+ end
13
+
14
+ def create_params
15
+ {
16
+ _links: {
17
+ destination: {
18
+ href: "#{@client.api_url}/funding-sources/#{@destination_funding_source_token}"
19
+ },
20
+ source: {
21
+ href: "#{@client.api_url}/funding-sources/#{@sender_funding_source_token}"
22
+ }
23
+ },
24
+ amount: {
25
+ value: @transfer_amount.to_s,
26
+ currency: "USD"
27
+ },
28
+ metadata: @metadata
29
+ }
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,43 @@
1
+ module MoneyMover
2
+ module Dwolla
3
+ class UnverifiedBusinessCustomer < Customer
4
+ validates_presence_of :businessName
5
+
6
+ def initialize(attrs = {})
7
+ attrs[:type] = 'unverified'
8
+ super attrs
9
+ end
10
+
11
+ private
12
+
13
+ def create_params
14
+ create_attrs = {
15
+ firstName: firstName,
16
+ lastName: lastName,
17
+ email: email,
18
+ address1: address1,
19
+ address2: address2,
20
+ city: city,
21
+ state: state,
22
+ postalCode: postalCode,
23
+ dateOfBirth: dateOfBirth,
24
+ ssn: ssn,
25
+ phone: phone,
26
+ businessClassification: businessClassification,
27
+ businessType: businessType,
28
+ businessName: businessName,
29
+ ein: ein,
30
+ doingBusinessAs: doingBusinessAs,
31
+ website: website,
32
+ type: type,
33
+ ipAddress: ipAddress
34
+ }
35
+
36
+ # hack to fix bug on dwolla's side with funding sources being removed if no dba is sent
37
+ create_attrs[:doingBusinessAs] = businessName unless doingBusinessAs.present?
38
+
39
+ create_attrs.compact
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,27 @@
1
+ module MoneyMover
2
+ module Dwolla
3
+ class UnverifiedCustomer < Customer
4
+ private
5
+
6
+ validates_presence_of :firstName, :lastName, :email
7
+
8
+ def initialize(attrs={})
9
+ super attrs.merge(type: 'unverified')
10
+ end
11
+
12
+ def create_params
13
+ create_attrs = {
14
+ firstName: firstName,
15
+ lastName: lastName,
16
+ email: email
17
+ }
18
+
19
+ create_attrs[:businessName] = businessName if businessName.present?
20
+ create_attrs[:ipAddress] = ipAddress if ipAddress.present?
21
+ #create_attrs[:type] = 'unverified'
22
+
23
+ create_attrs
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,53 @@
1
+ module MoneyMover
2
+ module Dwolla
3
+ class VerifiedBusinessCustomer < Customer
4
+ validates_presence_of :address1,
5
+ :city,
6
+ :state,
7
+ :postalCode,
8
+ :dateOfBirth,
9
+ :ssn,
10
+ :phone,
11
+ :businessClassification,
12
+ :businessType,
13
+ :businessName,
14
+ :ein
15
+
16
+ def initialize(attrs = {})
17
+ attrs[:type] = 'business'
18
+ super attrs
19
+ end
20
+
21
+ private
22
+
23
+ def create_params
24
+ create_attrs = {
25
+ firstName: firstName,
26
+ lastName: lastName,
27
+ email: email,
28
+ address1: address1,
29
+ address2: address2,
30
+ city: city,
31
+ state: state,
32
+ postalCode: postalCode,
33
+ dateOfBirth: dateOfBirth,
34
+ ssn: ssn,
35
+ phone: phone,
36
+ businessClassification: businessClassification,
37
+ businessType: businessType,
38
+ businessName: businessName,
39
+ ein: ein,
40
+ doingBusinessAs: doingBusinessAs,
41
+ website: website,
42
+ type: type,
43
+ }
44
+
45
+ # hack to fix bug on dwolla's side with funding sources being removed if no dba is sent
46
+ create_attrs[:doingBusinessAs] = businessName unless doingBusinessAs.present?
47
+ create_attrs[:ipAddress] = ipAddress if ipAddress.present?
48
+
49
+ create_attrs
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,36 @@
1
+ module MoneyMover
2
+ module Dwolla
3
+ class WebhookSubscription < ApiResource
4
+ attr_accessor :url, :secret
5
+
6
+ validates_presence_of :url, :secret
7
+
8
+ def initialize(attrs = {}, client = ApplicationClient.new)
9
+ super_attrs = { id: attrs[:id], url: attrs[:url], secret: attrs[:secret] }
10
+ super super_attrs, client
11
+ end
12
+
13
+ def self.all
14
+ response = ApplicationClient.new.get fetch_endpoint
15
+ response.body[:_embedded][:'webhook-subscriptions'].map{|sub| self.new(sub) }
16
+ end
17
+
18
+ private
19
+
20
+ def self.fetch_endpoint
21
+ '/webhook-subscriptions'
22
+ end
23
+
24
+ def create_endpoint
25
+ '/webhook-subscriptions'
26
+ end
27
+
28
+ def create_params
29
+ {
30
+ url: url,
31
+ secret: secret
32
+ }
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,26 @@
1
+ module MoneyMover
2
+ module Dwolla
3
+ class Token
4
+ attr_reader :account_id, :expires_in, :access_token, :refresh_token, :_links, :token_type, :refresh_expires_in, :scope
5
+
6
+ def initialize(attrs={}, ach_config = Config.new, client = Client.new)
7
+ @_links = attrs[:_links]
8
+ @account_id = attrs[:account_id]
9
+ @expires_in = attrs[:expires_in]
10
+ @refresh_expires_in = attrs[:refresh_expires_in]
11
+ @access_token = attrs[:access_token]
12
+ @refresh_token = attrs[:refresh_token]
13
+ @token_type = attrs[:token_type]
14
+ @scope = attrs[:scope]
15
+
16
+ @ach_config = ach_config
17
+ @client = client
18
+ end
19
+
20
+ def request_new_token!
21
+ response = @client.post @client.token_url, create_params
22
+ Token.new response.body
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,44 @@
1
+ require 'money_mover/dwolla/config'
2
+ require 'money_mover/dwolla/api_connection'
3
+ require 'money_mover/dwolla/api_server_response'
4
+
5
+ # token stuff
6
+ require 'money_mover/dwolla/client'
7
+ require 'money_mover/dwolla/token'
8
+ require 'money_mover/dwolla/account_client'
9
+ require 'money_mover/dwolla/account_token'
10
+ require 'money_mover/dwolla/application_client'
11
+ require 'money_mover/dwolla/application_token'
12
+
13
+ require 'money_mover/dwolla/environment_urls'
14
+ require 'money_mover/dwolla/error_handler'
15
+
16
+ require 'money_mover/dwolla/models/api_resource'
17
+ # models
18
+ require 'money_mover/dwolla/models/account_funding_source'
19
+ require 'money_mover/dwolla/models/document'
20
+ require 'money_mover/dwolla/models/funding_source'
21
+ require 'money_mover/dwolla/models/micro_deposit_initiation'
22
+ require 'money_mover/dwolla/models/micro_deposit_verification'
23
+ require 'money_mover/dwolla/models/transfer'
24
+ require 'money_mover/dwolla/models/root_account'
25
+ # customer models
26
+ require 'money_mover/dwolla/models/customer'
27
+ require 'money_mover/dwolla/models/receive_only_business_customer'
28
+ require 'money_mover/dwolla/models/receive_only_customer'
29
+ require 'money_mover/dwolla/models/unverified_customer'
30
+ require 'money_mover/dwolla/models/unverified_business_customer'
31
+ require 'money_mover/dwolla/models/verified_business_customer'
32
+
33
+ # application stuff
34
+ require 'money_mover/dwolla/models/webhook_subscription'
35
+
36
+ module MoneyMover
37
+ module Dwolla
38
+ @config_provider = nil
39
+
40
+ class << self
41
+ attr_accessor :config_provider
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,12 @@
1
+ class StandaloneErrors < SimpleDelegator
2
+ extend ActiveModel::Naming
3
+ extend ActiveModel::Translation
4
+
5
+ def initialize
6
+ super ActiveModel::Errors.new(self)
7
+ end
8
+
9
+ def copy!(error_source)
10
+ error_source.errors.each { |key, msg| add key, msg }
11
+ end
12
+ end
@@ -0,0 +1,3 @@
1
+ module MoneyMover
2
+ VERSION = '0.0.3'
3
+ end
@@ -0,0 +1,15 @@
1
+ require 'active_support/core_ext/hash'
2
+ #require 'active_support/hash_with_indifferent_access'
3
+
4
+ require 'faraday'
5
+ require 'faraday_middleware'
6
+ require 'active_model'
7
+
8
+ require 'money_mover/version'
9
+ require 'money_mover/standalone_errors'
10
+
11
+ # dwolla
12
+ require 'money_mover/dwolla'
13
+
14
+ module MoneyMover; end
15
+
@@ -0,0 +1,27 @@
1
+ $:.unshift(File.join(File.dirname(__FILE__), 'lib'))
2
+
3
+ require 'money_mover/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.required_ruby_version = '>= 1.9.3'
7
+ s.name = 'money_mover'
8
+ s.version = MoneyMover::VERSION
9
+ s.date = '2016-07-21'
10
+ s.summary = "Money Mover"
11
+ s.description = "Moves Money with ACH integrations (dwolla, stripe)"
12
+ s.authors = ["Daniel Errante"]
13
+ s.email = 'danoph@gmail.com'
14
+ s.files = ["lib/money_mover.rb"]
15
+ s.homepage = 'https://github.com/danoph/money_mover'
16
+ s.license = 'MIT'
17
+
18
+ s.add_dependency('faraday', '~> 0.9', '>= 0.9.0')
19
+ s.add_dependency('faraday_middleware', '~> 0.9', '>= 0.9.0')
20
+ s.add_dependency('activemodel', '~> 4.2', '>= 4.2.6')
21
+ s.add_dependency('activesupport', '~> 4.2', '>= 4.2.6')
22
+
23
+ s.files = `git ls-files`.split("\n")
24
+ s.test_files = `git ls-files -- spec/*`.split("\n")
25
+ #s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
26
+ s.require_paths = ['lib']
27
+ end
@@ -0,0 +1,75 @@
1
+ require 'spec_helper'
2
+
3
+ describe MoneyMover::Dwolla::UnverifiedCustomer do
4
+ let(:firstName) { 'first name' }
5
+ let(:lastName) { 'last name' }
6
+ let(:email) { 'some@example.com' }
7
+ let(:ipAddress) { '127.0.0.1' }
8
+
9
+ let(:attrs) {{
10
+ firstName: firstName,
11
+ lastName: lastName,
12
+ email: email,
13
+ ipAddress: ipAddress
14
+ }}
15
+
16
+ subject { described_class.new(attrs) }
17
+
18
+ let(:customer_token) { '9481924a-6795-4e7a-b436-a7a48a4141ca' }
19
+
20
+ let(:create_customer_params) {{
21
+ firstName: firstName,
22
+ lastName: lastName,
23
+ email: email,
24
+ ipAddress: ipAddress
25
+ }}
26
+
27
+ before do
28
+ dwolla_helper.stub_create_customer_request create_customer_params, create_response
29
+ end
30
+
31
+ describe '#save' do
32
+ context 'success' do
33
+ let(:create_response) { dwolla_helper.customer_created_response customer_token }
34
+
35
+ it 'creates new customer in dwolla' do
36
+ expect(subject.save).to eq(true)
37
+ expect(subject.id).to eq(customer_token)
38
+ expect(subject.resource_location).to eq(dwolla_helper.customer_endpoint(customer_token))
39
+ end
40
+ end
41
+
42
+ context 'fail' do
43
+ let(:create_response) { dwolla_helper.resource_create_error_response error_response }
44
+
45
+ #let(:error_response) {{
46
+ #code: "ValidationError",
47
+ #message: "Validation error(s) present. See embedded errors list for more details.",
48
+ #_embedded: {
49
+ #errors: [
50
+ #{ code: "Invalid", message: "Invalid parameter.", path: "/firstName"
51
+ #}
52
+ #]
53
+ #}
54
+ #}}
55
+
56
+ let(:error_response) {{
57
+ code: "ValidationError",
58
+ message: "Validation error(s) present. See embedded errors list for more details.",
59
+ _embedded: {
60
+ errors: [
61
+ { code: "Duplicate", message: "A customer with the specified email already exists.", path: "/email"
62
+ }
63
+ ]
64
+ }
65
+ }}
66
+
67
+ it 'returns errors' do
68
+ expect(subject.save).to eq(false)
69
+ expect(subject.errors[:email]).to eq(['A customer with the specified email already exists.'])
70
+ expect(subject.id).to be_nil
71
+ expect(subject.resource_location).to be_nil
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,71 @@
1
+ require 'spec_helper'
2
+
3
+ describe MoneyMover::Dwolla::Customer do
4
+ let(:customer_token) { '9481924a-6795-4e7a-b436-a7a48a4141ca' }
5
+
6
+ let(:firstName) { 'first name' }
7
+ let(:lastName) { 'last name' }
8
+ let(:email) { 'email@example.com' }
9
+ let(:ipAddress) { '127.0.0.1' }
10
+
11
+ before do
12
+ dwolla_helper.stub_find_customer_request customer_token, customer_response
13
+ end
14
+
15
+ describe '.find' do
16
+ subject { described_class.find(customer_token) }
17
+
18
+ context 'success' do
19
+ let(:timestamp) { DateTime.now.to_s }
20
+
21
+ let(:customer_response_object) {{
22
+ _links: {
23
+ self: {
24
+ href: dwolla_helper.customer_endpoint(customer_token)
25
+ }
26
+ },
27
+ id: customer_token,
28
+ firstName: firstName,
29
+ lastName: lastName,
30
+ email: email,
31
+ ipAddress: ipAddress,
32
+ type: 'unverified',
33
+ status: 'unverified',
34
+ created: timestamp
35
+ }}
36
+
37
+ let(:customer_response) {{
38
+ status: 200,
39
+ body: customer_response_object.to_json,
40
+ headers: {
41
+ 'Content-Type' => 'application/json'
42
+ }
43
+ }}
44
+
45
+ it 'returns customer' do
46
+ expect(subject.id).to eq(customer_token)
47
+ #expect(subject.resource_location).to eq(dwolla_helper.customer_endpoint(customer_token))
48
+ expect(subject.firstName).to eq(firstName)
49
+ expect(subject.lastName).to eq(lastName)
50
+ expect(subject.email).to eq(email)
51
+ expect(subject.ipAddress).to eq(ipAddress)
52
+ end
53
+ end
54
+
55
+ context 'failure' do
56
+ let(:response_body) {{
57
+ code: 'Something',
58
+ message: 'Customer not found.'
59
+ }}
60
+
61
+ let(:customer_response) {{
62
+ status: 404,
63
+ body: response_body.to_json
64
+ }}
65
+
66
+ it 'returns errors' do
67
+ expect { subject }.to raise_error('Customer Not Found')
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ describe MoneyMover::Dwolla::FundingSource do
4
+ let(:name) { 'my checking account' }
5
+ let(:type) { 'checking' }
6
+ let(:routingNumber) { '222222226' }
7
+ let(:accountNumber) { '9393' }
8
+
9
+ let(:attrs) {{
10
+ #customer_id: customer_token,
11
+ name: name,
12
+ type: type,
13
+ routingNumber: routingNumber,
14
+ accountNumber: accountNumber
15
+ }}
16
+
17
+ subject { described_class.new(customer_token, attrs) }
18
+
19
+ let(:customer_token) { '9481924a-6795-4e7a-b436-a7a48a4141ca' }
20
+ let(:funding_source_token) { 'FC451A7A-AE30-4404-AB95-E3553FCD733F' }
21
+
22
+ let(:create_params) {{
23
+ name: name,
24
+ type: type,
25
+ routingNumber: routingNumber,
26
+ accountNumber: accountNumber
27
+ }}
28
+
29
+ before do
30
+ dwolla_helper.stub_create_customer_funding_source_request customer_token, create_params, dwolla_helper.customer_funding_source_created_response(customer_token, funding_source_token)
31
+ end
32
+
33
+ describe '#save' do
34
+ it 'creates new customer funding source in dwolla' do
35
+ expect(subject.save).to eq(true)
36
+ expect(subject.id).to eq(funding_source_token)
37
+ expect(subject.resource_location).to eq(dwolla_helper.customer_funding_source_endpoint(customer_token, funding_source_token))
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,62 @@
1
+ require 'spec_helper'
2
+
3
+ describe MoneyMover::Dwolla::Document do
4
+ let(:customer_id) { 'customer-id' }
5
+ let(:file) { File.expand_path('../../../../../support/fixtures/sample.jpg', __FILE__) }
6
+ let(:file_fixture) { Rack::Test::UploadedFile.new(file, 'image/jpeg') }
7
+ let(:documentType) { 'other' }
8
+
9
+ let(:attrs) {{
10
+ customer_id: customer_id,
11
+ documentType: 'other',
12
+ file: file_fixture
13
+ }}
14
+
15
+ subject { described_class.new(attrs) }
16
+
17
+ let(:create_params) {{
18
+ documentType: documentType,
19
+ #file: File.new(file, 'rb')
20
+ #file: Faraday::UploadIO.new(file)
21
+ }}
22
+
23
+ let(:resource_token) { 'some-token' }
24
+
25
+ before do
26
+ dwolla_helper.stub_request(:post, dwolla_helper.build_dwolla_url(dwolla_helper.customer_documents_endpoint(customer_id))).with(headers: dwolla_helper.request_headers).to_return(create_response)
27
+ end
28
+
29
+ describe '#save' do
30
+ context 'success' do
31
+ let(:create_response) { dwolla_helper.customer_document_created_response resource_token }
32
+
33
+ it 'creates new resource in dwolla' do
34
+ expect(subject.save).to eq(true)
35
+ expect(subject.id).to eq(resource_token)
36
+ expect(subject.resource_location).to eq(dwolla_helper.document_endpoint(resource_token))
37
+ end
38
+ end
39
+
40
+ context 'fail' do
41
+ let(:create_response) { dwolla_helper.resource_create_error_response error_response }
42
+
43
+ let(:error_response) {{
44
+ code: "ValidationError",
45
+ message: "Validation error(s) present. See embedded errors list for more details.",
46
+ _embedded: {
47
+ errors: [
48
+ { code: "Invalid", message: "Invalid parameter.", path: "/file"
49
+ }
50
+ ]
51
+ }
52
+ }}
53
+
54
+ it 'returns errors' do
55
+ expect(subject.save).to eq(false)
56
+ expect(subject.errors[:file]).to eq(['Invalid parameter.'])
57
+ expect(subject.id).to be_nil
58
+ expect(subject.resource_location).to be_nil
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+
3
+ describe MoneyMover::Dwolla::MicroDepositInitiation do
4
+ let(:funding_source_token) { '9481924a-6795-4e7a-b436-a7a48a4141ca' }
5
+
6
+ let(:attrs) {{
7
+ funding_source_id: funding_source_token,
8
+ }}
9
+
10
+ subject { described_class.new(attrs) }
11
+
12
+ let(:create_params) {{}}
13
+
14
+ before do
15
+ dwolla_helper.stub_funding_source_microdeposits_request funding_source_token, create_params, create_response
16
+ end
17
+
18
+ let(:resource_created_location) { 'https://some-url.com' }
19
+
20
+ describe '#save' do
21
+ context 'success' do
22
+ let(:create_response) {{
23
+ status: 201,
24
+ body: ""
25
+ }}
26
+
27
+ it 'creates new resource in dwolla' do
28
+ expect(subject.save).to eq(true)
29
+ end
30
+ end
31
+
32
+ context 'fail' do
33
+ let(:create_response) {{
34
+ status: 400,
35
+ body: error_response.to_json,
36
+ headers: {
37
+ 'Content-Type' => 'application/json'
38
+ }
39
+ }}
40
+
41
+ let(:error_response) {{
42
+ code: "ValidationError",
43
+ message: "Some error"
44
+ }}
45
+
46
+ it 'returns errors' do
47
+ expect(subject.save).to eq(false)
48
+ expect(subject.errors[:base]).to eq(['Some error'])
49
+ end
50
+ end
51
+ end
52
+ end