balanced 0.5.5 → 0.5.6

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.
data/README.md CHANGED
@@ -21,7 +21,7 @@ Or install it yourself as:
21
21
 
22
22
  ## Usage
23
23
 
24
- See https://www.balancedpayments.com/docs/ruby for tutorials and documentation.
24
+ See https://www.balancedpayments.com/docs/overview?language=ruby for tutorials and documentation.
25
25
 
26
26
 
27
27
  ## Contributing
@@ -0,0 +1,56 @@
1
+ """
2
+ Learn how to authenticate a bank account so you can debit with it.
3
+ """
4
+ cwd = File.dirname(File.dirname(File.absolute_path(__FILE__)))
5
+ $:.unshift(cwd + "/lib")
6
+ require 'balanced'
7
+
8
+ host = ENV.fetch('BALANCED_HOST') { nil }
9
+ options = {}
10
+ if host
11
+ options[:scheme] = 'http'
12
+ options[:host] = host
13
+ options[:port] = 5000
14
+ end
15
+
16
+ Balanced.configure(nil, options)
17
+
18
+ # create a new marketplace
19
+ api_key = Balanced::ApiKey.new.save
20
+ Balanced.configure(api_key.secret)
21
+ marketplace = Balanced::Marketplace.new.save
22
+
23
+ # create a bank account
24
+ bank_account = marketplace.create_bank_account(
25
+ :account_number => "1234567890",
26
+ :bank_code => "12",
27
+ :name => "Jack Q Merchant"
28
+ )
29
+ account = marketplace.create_account()
30
+ account.add_bank_account(bank_account.uri)
31
+
32
+ puts "you can't debit until you authenticate"
33
+ begin
34
+ account.debit(:amount => 100)
35
+ rescue Balanced::Error => ex
36
+ puts "Debit failed, %s" % ex.message
37
+ end
38
+
39
+ # authenticate
40
+ verification = bank_account.verify
41
+
42
+ begin
43
+ verification.confirm(1,2)
44
+ rescue Balanced::BankAccountVerificationFailure => ex
45
+ puts 'Authentication error , %s' % ex.message
46
+ puts "PROTIP: for TEST bank accounts the valid amount is always 1 and 1"
47
+ end
48
+ verification = bank_account.verifications.find(:first).first
49
+
50
+ raise "unpossible" if verification.confirm(1, 1).state != 'verified'
51
+ debit = account.debit(:amount => 100)
52
+ puts "debited the bank account %s for %d cents" % [
53
+ debit.source.uri,
54
+ debit.amount
55
+ ]
56
+ puts "and there you have it"
@@ -97,4 +97,14 @@ module Balanced
97
97
 
98
98
  # Raised when Balanced returns a 504 HTTP status code
99
99
  class GatewayTimeout < Error; end
100
+
101
+
102
+ # custom mapped exceptions
103
+ class FundingInstrumentVerificationError < Error; end
104
+
105
+ # Raised when Balanced has an issue with you verifying a bank account
106
+ class BankAccountVerificationFailure < FundingInstrumentVerificationError
107
+
108
+ end
109
+
100
110
  end
@@ -8,6 +8,12 @@ module Balanced
8
8
  include Enumerable
9
9
 
10
10
  # A pager for paginating through resource records.
11
+ #
12
+ # @param [String] uri the uri of the resource
13
+ # @param [Hash] options
14
+ # @option options [Integer] limit
15
+ # @option options [Integer] offset
16
+ # @option options [Integer] per an alias for the :limit option
11
17
  def initialize uri, options = {}
12
18
  @uri = uri
13
19
  @options = options
@@ -40,7 +40,13 @@ module Balanced
40
40
  meta = args[2] || options.fetch(:meta) { nil }
41
41
  description = args[3] || options.fetch(:description) { nil }
42
42
 
43
- self.account.debit(amount, appears_on_statement_as, meta, description, self.uri)
43
+ self.account.debit(
44
+ :amount => amount,
45
+ :appears_on_statement_as => appears_on_statement_as,
46
+ :meta => meta,
47
+ :description => description,
48
+ :source_uri => self.uri
49
+ )
44
50
  end
45
51
 
46
52
  # Creates a Credit of funds from your Marketplace's escrow account to this
@@ -82,5 +88,22 @@ module Balanced
82
88
  save
83
89
  end
84
90
 
91
+ def verify
92
+ Verification.new(
93
+ 'uri' => self.verifications_uri
94
+ ).save
95
+ end
96
+
85
97
  end
98
+
99
+ class Verification
100
+ include Balanced::Resource
101
+
102
+ def confirm(amount_1, amount_2)
103
+ self.amount_1 = amount_1
104
+ self.amount_2 = amount_2
105
+ save
106
+ end
107
+ end
108
+
86
109
  end
@@ -22,9 +22,22 @@ module Faraday
22
22
  503 => Balanced::ServiceUnavailable,
23
23
  504 => Balanced::GatewayTimeout,
24
24
  }
25
+ CATEGORY_CODE_MAP = {
26
+ 'bank-account-authentication-not-pending' =>
27
+ Balanced::BankAccountVerificationFailure,
28
+ 'bank-account-authentication-failed' =>
29
+ Balanced::BankAccountVerificationFailure,
30
+ 'bank-account-authentication-already-exists' =>
31
+ Balanced::BankAccountVerificationFailure,
32
+ }
25
33
  def on_complete(response)
26
34
  status_code = response[:status].to_i
27
- error_class = HTTP_STATUS_CODES[status_code]
35
+ if response.key? :body and response[:body] != nil
36
+ category_code = response[:body]['category_code']
37
+ else
38
+ category_code = nil
39
+ end
40
+ error_class = CATEGORY_CODE_MAP[category_code] || HTTP_STATUS_CODES[status_code]
28
41
  raise error_class.new(response) if error_class
29
42
  end
30
43
 
@@ -1,3 +1,3 @@
1
1
  module Balanced
2
- VERSION = '0.5.5'
2
+ VERSION = '0.5.6'
3
3
  end
@@ -9,9 +9,9 @@ describe Balanced::BankAccount do
9
9
 
10
10
  @marketplace = Balanced::Marketplace.new.save
11
11
  card = @marketplace.create_card(
12
- :card_number => "5105105105105100",
13
- :expiration_month => "12",
14
- :expiration_year => "2015"
12
+ :card_number => "5105105105105100",
13
+ :expiration_month => "12",
14
+ :expiration_year => "2015"
15
15
  )
16
16
  # An initial balance for the marketplace
17
17
  @buyer = @marketplace.create_buyer(
@@ -21,9 +21,9 @@ describe Balanced::BankAccount do
21
21
  @buyer.debit :amount => 10000000
22
22
 
23
23
  @incomplete_bank_account_hash = {
24
- :account_number => "0987654321",
25
- :bank_code => "321174851",
26
- :name => "Timmy T. McTimmerson"
24
+ :account_number => "0987654321",
25
+ :bank_code => "321174851",
26
+ :name => "Timmy T. McTimmerson"
27
27
  }
28
28
  end
29
29
 
@@ -32,9 +32,9 @@ describe Balanced::BankAccount do
32
32
 
33
33
  it 'should not create without a type field' do
34
34
  lambda { Balanced::BankAccount.new(
35
- :account_number => "0987654321",
36
- :bank_code => "321174851",
37
- :name => "Timmy T. McTimmerson"
35
+ :account_number => "0987654321",
36
+ :bank_code => "321174851",
37
+ :name => "Timmy T. McTimmerson"
38
38
  ).save }.should raise_error(Balanced::BadRequest)
39
39
  end
40
40
  end
@@ -44,10 +44,10 @@ describe Balanced::BankAccount do
44
44
 
45
45
  before do
46
46
  @bank_account = @marketplace.create_bank_account(
47
- :account_number => "0987654321",
48
- :bank_code => "321174851",
49
- :name => "Timmy T. McTimmerson",
50
- :type => "checking"
47
+ :account_number => "0987654321",
48
+ :bank_code => "321174851",
49
+ :name => "Timmy T. McTimmerson",
50
+ :type => "checking"
51
51
  )
52
52
  end
53
53
 
@@ -102,48 +102,114 @@ describe Balanced::BankAccount do
102
102
 
103
103
  before do
104
104
  @credit = @bank_account.credit(
105
- :amount => 50,
106
- :description => 'Blah'
105
+ :amount => 50,
106
+ :description => 'Blah'
107
107
  )
108
108
  end
109
109
 
110
110
  describe 'bank_account' do
111
111
  subject { @credit.bank_account }
112
- its(:account_number) {should end_with '4321'}
113
- its(:routing_number) {should eql '321174851'}
112
+ its(:account_number) { should end_with '4321' }
113
+ its(:routing_number) { should eql '321174851' }
114
114
 
115
115
  end
116
116
 
117
- describe 'without an account' do
118
- subject { @credit }
119
- it { should respond_to :account }
120
- its(:account) { should be_nil }
121
- end
122
-
123
117
  describe 'with an account' do
124
118
  use_vcr_cassette
125
119
 
126
120
  before do
127
121
  @account = @marketplace.create_account
128
122
  bank_account = @marketplace.create_bank_account(
129
- :account_number => "1234567890111",
130
- :bank_code => "021000021",
131
- :name => "Timmy T. McTimmerson",
132
- :type => "checking"
123
+ :account_number => "1234567890111",
124
+ :bank_code => "021000021",
125
+ :name => "Timmy T. McTimmerson",
126
+ :type => "checking"
133
127
  )
134
128
  @account.add_bank_account(bank_account.uri)
135
129
  bank_account = bank_account.reload
136
130
  @credit_with_account = bank_account.credit(
137
- :amount => 500,
138
- :description => 'Blahblahblah'
131
+ :amount => 500,
132
+ :description => 'Blahblahblah'
139
133
  )
140
134
  end
141
135
 
142
- subject { @credit_with_account }
143
- it { should respond_to :account }
144
- it { should be_instance_of Balanced::Credit }
136
+ subject { @credit_with_account }
137
+ it { should respond_to :account }
138
+ it { should be_instance_of Balanced::Credit }
145
139
  end
146
140
 
147
141
  end
142
+
143
+ end
144
+
145
+ describe 'verification' do
146
+
147
+ describe 'cannot debit when unverified' do
148
+ use_vcr_cassette
149
+
150
+ before do
151
+ @bank_account = @marketplace.create_bank_account(
152
+ :account_number => "0987654321",
153
+ :bank_code => "321174851",
154
+ :name => "Timmy T. McTimmerson",
155
+ :type => "checking"
156
+ )
157
+ @account = @marketplace.create_account
158
+ @account.add_bank_account(@bank_account.uri)
159
+ end
160
+
161
+ it do
162
+ lambda {
163
+ @account.debit(:amount => 100)
164
+ }.should raise_error(Balanced::Conflict)
165
+ end
166
+ end
167
+
168
+ describe 'debits when verified' do
169
+ use_vcr_cassette
170
+
171
+ before do
172
+ @bank_account = @marketplace.create_bank_account(
173
+ :account_number => "0987654321",
174
+ :bank_code => "321174851",
175
+ :name => "Timmy T. McTimmerson",
176
+ :type => "checking"
177
+ )
178
+ @account = @marketplace.create_account
179
+ @account.add_bank_account(@bank_account.uri)
180
+ end
181
+
182
+ it do
183
+
184
+ authentication = @bank_account.verify
185
+ authentication.confirm(1, 1)
186
+
187
+ @account.debit(:amount => 100)
188
+ end
189
+ end
190
+
191
+ describe 'errors when incorrectly verified' do
192
+ use_vcr_cassette
193
+
194
+ before do
195
+ @bank_account = @marketplace.create_bank_account(
196
+ :account_number => "0987654321",
197
+ :bank_code => "321174851",
198
+ :name => "Timmy T. McTimmerson",
199
+ :type => "checking"
200
+ )
201
+ @account = @marketplace.create_account
202
+ @account.add_bank_account(@bank_account.uri)
203
+ end
204
+
205
+ it do
206
+
207
+ authentication = @bank_account.verify
208
+
209
+ lambda {
210
+ authentication.confirm(1, 2)
211
+ }.should raise_error(Balanced::BankAccountVerificationFailure)
212
+ end
213
+ end
148
214
  end
149
215
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: balanced
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.5
4
+ version: 0.5.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-02-14 00:00:00.000000000 Z
12
+ date: 2013-02-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: faraday
@@ -74,6 +74,7 @@ files:
74
74
  - doc/balanced_templates/default/onefile/html/layout.erb
75
75
  - doc/balanced_templates/default/onefile/html/setup.rb
76
76
  - doc/balanced_templates/default/tags/html/index.erb
77
+ - examples/bank_account_debits.rb
77
78
  - examples/events_and_callbacks.rb
78
79
  - examples/examples.rb
79
80
  - lib/balanced.rb