balanced 0.7.2 → 0.7.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1 @@
1
+ balanced-ruby
@@ -0,0 +1 @@
1
+ ruby-2.0.0-p247
data/Gemfile CHANGED
@@ -7,7 +7,6 @@ gem "faraday_middleware"
7
7
 
8
8
  group :development do
9
9
  gem "yard"
10
- gem "ruby-debug19"
11
10
  gem "guard", '~> 1.6.2'
12
11
  gem "guard-rspec", '~> 2.4.1'
13
12
  end
@@ -137,6 +137,8 @@ bank_account = Balanced::BankAccount.new(
137
137
  :type => "checking"
138
138
  ).save
139
139
 
140
+ raise "Should not have an account" if bank_account.has_account?
141
+
140
142
  puts "now let's credit it, the super-simple way"
141
143
  credit = bank_account.credit(
142
144
  :amount => 500
@@ -0,0 +1,43 @@
1
+ cwd = File.dirname(File.dirname(File.absolute_path(__FILE__)))
2
+ $:.unshift(cwd + "/lib")
3
+ require 'balanced'
4
+
5
+ begin
6
+ Balanced::Card
7
+ rescue NameError
8
+ raise "wtf"
9
+ end
10
+
11
+ require 'balanced'
12
+
13
+ Balanced.configure("8bb66df4e80711e290df026ba7cd33d0")
14
+
15
+ puts "create our marketplace"
16
+ begin
17
+ marketplace = Balanced::Marketplace.new.save
18
+ rescue Balanced::Conflict => ex
19
+ # balanced automatically maps the body's response
20
+ # for convenience, so for example:
21
+ puts ex.response[:body]
22
+ # you'll notice this hash is mapped to nice attributes
23
+ raise "Not Present" if ex.response[:body]["status"] != ex.status
24
+ # you can find all of the attributes here:
25
+ # https://docs.balancedpayments.com/current/api?language=bash#errors
26
+ marketplace = Balanced::Marketplace.mine
27
+ end
28
+
29
+ # create a new card
30
+
31
+ card = Balanced::Card.new(
32
+ :card_number => "5105105105105100",
33
+ :expiration_month => "12",
34
+ :expiration_year => "2015",
35
+ :phone_number => "INCORRECT PHONE NUMBER"
36
+ )
37
+
38
+ begin
39
+ card.save
40
+ rescue Balanced::BadRequest => ex
41
+ puts ex.extras[:phone_number]
42
+ puts "All the fields that have errors are: #{ex.extras.keys}"
43
+ end
@@ -78,6 +78,7 @@ module Balanced
78
78
  def delete(*args, &block)
79
79
  self.client.delete *args
80
80
  end
81
+
81
82
  end
82
83
 
83
84
  # configure on import so we don't have to configure for creating
@@ -14,8 +14,8 @@ module Balanced
14
14
  :port => 5000,
15
15
  :version => '1',
16
16
  :logging_level => 'WARN',
17
- :connection_timeout => 30,
18
- :read_timeout => 30,
17
+ :connection_timeout => 60,
18
+ :read_timeout => 60,
19
19
  :logger => nil,
20
20
  :ssl_verify => true,
21
21
  :faraday_adapter => Faraday.default_adapter
@@ -42,8 +42,23 @@ module Balanced
42
42
  attr_reader :message
43
43
  alias :error_message :message
44
44
 
45
- def initialize(message)
45
+ # @param [String, nil] message a description of the exception
46
+ def initialize(message = nil)
46
47
  @message = message
48
+ super(message)
49
+ end
50
+ end
51
+
52
+ # Raised when attempted to create a debit or hold for a card not associated to an account
53
+ class UnassociatedCardError < StandardError
54
+ # @param [Balanced::Card] card
55
+ def initialize(card)
56
+ @card = card
57
+ super(error_message)
58
+ end
59
+
60
+ def error_message
61
+ "The Balanced::Card with uri=#{@card.attributes['uri']} is not associated to an account"
47
62
  end
48
63
  end
49
64
 
@@ -111,18 +111,22 @@ module Balanced
111
111
 
112
112
  # Associates the Card represented by +card_uri+ with this Account.
113
113
  #
114
- # @return [Card]
115
- def add_card card_uri
116
- self.card_uri = card_uri
114
+ # @return [Account]
115
+ def add_card(card)
116
+ card.save if card.kind_of?(Balanced::Card) && card.hash.nil?
117
+ self.card_uri = Balanced::Utils.extract_uri_from_object(card)
117
118
  save
118
119
  end
119
120
 
120
121
  # Associates the BankAccount represented by +bank_account_uri+ with this
121
122
  # Account.
122
123
  #
123
- # @return [BankAccount]
124
- def add_bank_account bank_account_uri
125
- self.bank_account_uri = bank_account_uri
124
+ # @return [Account]
125
+ def add_bank_account(bank_account)
126
+ if bank_account.kind_of?(Balanced::BankAccount) && bank_account.fingerprint.nil?
127
+ bank_account.save
128
+ end
129
+ self.bank_account_uri = Balanced::Utils.extract_uri_from_object(bank_account)
126
130
  save
127
131
  end
128
132
 
@@ -59,10 +59,10 @@ module Balanced
59
59
  options = args.last.is_a?(Hash) ? args.pop : {}
60
60
  amount = args[0] || options.fetch(:amount) { nil }
61
61
  description = args[1] || options.fetch(:description) { nil }
62
-
62
+ appears_on_statement_as = args[3] || options.fetch(:appears_on_statement_as) { nil }
63
+
63
64
  if self.has_account?
64
65
  meta = args[2] || options.fetch(:meta) { nil }
65
- appears_on_statement_as = args[3] || options.fetch(:appears_on_statement_as) { nil }
66
66
  destination_uri = args[4] || options.fetch(:destination_uri) { self.uri }
67
67
  credit = self.account.credit(
68
68
  :amount => amount,
@@ -75,7 +75,8 @@ module Balanced
75
75
  credit = Credit.new(
76
76
  :uri => self.credits_uri,
77
77
  :amount => amount,
78
- :description => description
78
+ :description => description,
79
+ :appears_on_statement_as => appears_on_statement_as
79
80
  )
80
81
  credit.save
81
82
  end
@@ -36,6 +36,8 @@ module Balanced
36
36
  meta = args[3] || options.fetch(:meta) { nil }
37
37
  description = args[3] || options.fetch(:description) { nil }
38
38
 
39
+ ensure_associated_to_account!
40
+
39
41
  self.account.debit(
40
42
  :amount => amount,
41
43
  :appears_on_statement_as => appears_on_statement_as,
@@ -55,6 +57,8 @@ module Balanced
55
57
  amount = args[0] || options.fetch(:amount) { nil }
56
58
  meta = args[1] || options.fetch(:meta) { nil }
57
59
 
60
+ ensure_associated_to_account!
61
+
58
62
  self.account.hold(
59
63
  :amount => amount,
60
64
  :meta => meta,
@@ -67,6 +71,14 @@ module Balanced
67
71
  save
68
72
  end
69
73
 
74
+ private
75
+ # Ensure that one of account, account_uri, customer or customer_uri are set.
76
+ # Otherwise raise an exception.
77
+ def ensure_associated_to_account!
78
+ if attributes.values_at('account', 'account_uri', 'customer', 'customer_uri').compact.empty?
79
+ raise UnassociatedCardError.new(self)
80
+ end
81
+ end
70
82
  end
71
83
 
72
84
  end
@@ -19,6 +19,19 @@ module Balanced
19
19
  super attributes
20
20
  end
21
21
 
22
+ # Attempts to find an existing customer by email
23
+ #
24
+ # *NOTE:* There is no unique constraint on email_address.
25
+ # Multiple customers with the same email may exist.
26
+ # Only one Customer is returned.
27
+ #
28
+ # @param [String] email An email of a customer
29
+ # @return [Customer] if customer is found
30
+ # @return [nil] if customer is not found
31
+ def self.find_by_email email
32
+ self.find(:first, :email => email)
33
+ end
34
+
22
35
  def debit(options = {})
23
36
  amount = options[:amount]
24
37
  appears_on_statement_as = options[:appears_on_statement_as]
@@ -60,7 +73,7 @@ module Balanced
60
73
 
61
74
  # Associates the Card represented by 'card' with this Customer.
62
75
  #
63
- # @return [Card]
76
+ # @return [Customer]
64
77
 
65
78
  def add_card(card)
66
79
  card.save if card.kind_of?(Balanced::Card) && card.hash.nil?
@@ -71,9 +84,9 @@ module Balanced
71
84
  # Associates the BankAccount represented by bank_account with this
72
85
  # Customer.
73
86
  #
74
- # @return [BankAccount]
87
+ # @return [Customer]
75
88
  def add_bank_account(bank_account)
76
- if bank_account.kind_of?(Balanced::BankAccount) && bank_account.hash.nil?
89
+ if bank_account.kind_of?(Balanced::BankAccount) && bank_account.fingerprint.nil?
77
90
  bank_account.save
78
91
  end
79
92
  self.bank_account_uri = Balanced::Utils.extract_uri_from_object(bank_account)
@@ -67,6 +67,10 @@ module Balanced
67
67
  Balanced.delete @attributes[:uri]
68
68
  end
69
69
 
70
+ def unstore
71
+ destroy
72
+ end
73
+
70
74
  def reload the_response = nil
71
75
  if the_response
72
76
  return if the_response.body.to_s.length.zero?
@@ -90,9 +94,45 @@ module Balanced
90
94
  attr = method.to_s.chop
91
95
  @attributes[attr] = args[0]
92
96
  else
93
- super
97
+ # This piece of code is a bit disgusting. We will clean it up soon,
98
+ # but basically, we were creating closures using this code snippet
99
+ # but those closures were transferred to the actual classes themselves
100
+ # so you would have something like BankAccount.new.account and this
101
+ # will give the last closure added for a BankAccount even if it has
102
+ # nothing to do with the actual class itself.
103
+ #
104
+ # This caused some weird errors, so the best thing to do was to just
105
+ # move this piece of code and "dynamically" enable it for all
106
+ # method requests that are essentially #{method}_uri.
107
+ #
108
+ # This solves the acute problem, for now.
109
+ if @attributes.has_key? "#{method}_uri"
110
+
111
+ value = @attributes["#{method}_uri"]
112
+ # what if the server returns a _uri that we don't know how to
113
+ # construct? Welp, we catch that NameError and return to super.
114
+ begin
115
+ values_class = Balanced.from_uri(value)
116
+ rescue NameError
117
+ super
118
+ end
119
+
120
+ # if uri is a collection -> this would definitely be if
121
+ # it ends in a symbol then we should allow a lazy executor of
122
+ # the query pager
123
+ if Balanced.is_collection(value)
124
+ pager = Balanced::Pager.new value, {}
125
+ return pager.to_a
126
+ else
127
+ return values_class.find(value)
128
+ end
129
+
130
+ else
131
+ super
132
+ end
94
133
  end
95
134
  end
135
+
96
136
  def self.included(base)
97
137
  base.extend ClassMethods
98
138
  end
@@ -143,37 +183,26 @@ module Balanced
143
183
  return payload if payload[:uri].nil?
144
184
  klass = Balanced.from_uri(payload[:uri])
145
185
  instance = klass.new payload
186
+
187
+ # http://stackoverflow.com/a/2495650/133514
188
+ instance_eigen = class << instance; self; end
189
+
146
190
  payload.each do |name, value|
147
- klass.class_eval {
148
- attr_accessor name.to_s
149
- }
191
+
150
192
  # here is where our interpretations will begin.
151
193
  # if the value is a sub-resource, lets instantiate the class
152
194
  # and set it correctly
153
195
  if value.instance_of? Hash and value.has_key? 'uri'
154
196
  value = construct_from_response value
155
- elsif name =~ /_uri$/
156
- modified_name = name.sub(/_uri$/, '')
157
- klass.instance_eval {
158
- define_method(modified_name) {
159
- values_class = Balanced.from_uri(value)
160
- # if uri is a collection -> this would definitely be if it ends in a symbol
161
- # then we should allow a lazy executor of the query pager
162
- if Balanced.is_collection(value)
163
- pager = Pager.new value, {}
164
- pager.to_a
165
- else
166
- values_class.find(value)
167
- end
168
- }
169
- }
170
197
  end
171
198
 
172
- instance.class.instance_eval {
173
- define_method(name) { @attributes[name] } # Get.
174
- define_method("#{name}=") { |value| @attributes[name] = value } # Set.
175
- define_method("#{name}?") { !!@attributes[name] } # Present.
176
- }
199
+ # Get attribute
200
+ instance.class.send(:define_method, name, proc{@attributes[name]})
201
+ # Set attribute
202
+ instance.class.send(:define_method, "#{name}=", proc{ |value| @attributes[name] = value })
203
+ # Is attribute present?
204
+ instance.class.send(:define_method, "#{name}?", proc{ !!@attributes[name] })
205
+
177
206
  instance.send("#{name}=".to_s, value)
178
207
  end
179
208
  instance
@@ -192,7 +221,7 @@ module Balanced
192
221
  end
193
222
 
194
223
  def paginate options = {}
195
- Pager.new uri, options
224
+ Balanced::Pager.new uri, options
196
225
  end
197
226
  alias scoped paginate
198
227
  alias where paginate
@@ -1,3 +1,3 @@
1
1
  module Balanced
2
- VERSION = '0.7.2'
2
+ VERSION = '0.7.4'
3
3
  end
@@ -1 +1 @@
1
- Balanced::BankAccount.destroy
1
+ Balanced::BankAccount.unstore
@@ -1,3 +1,3 @@
1
1
  <%= boiler_plate %>
2
2
  bank_account = Balanced::BankAccount.find('<%=request['uri']%>')
3
- bank_account.destroy
3
+ bank_account.unstore
@@ -1,11 +1,11 @@
1
1
  % if mode == 'definition':
2
- Balanced::BankAccount.destroy
2
+ Balanced::BankAccount.unstore
3
3
 
4
4
  % else:
5
5
  require 'balanced'
6
6
  Balanced.configure('8af725c6d54611e2bf5e026ba7f8ec28')
7
7
 
8
8
  bank_account = Balanced::BankAccount.find('/v1/bank_accounts/BA4eTWiY1VPXkGpjaU6XPBhu')
9
- bank_account.destroy
9
+ bank_account.unstore
10
10
 
11
11
  % endif
@@ -0,0 +1 @@
1
+ Balanced::Card.unstore
@@ -0,0 +1,3 @@
1
+ <%= boiler_plate %>
2
+ card = Balanced::Card.find('<%=request['uri']%>')
3
+ card.unstore
@@ -0,0 +1,11 @@
1
+ % if mode == 'definition':
2
+ Balanced::Card.unstore
3
+
4
+ % else:
5
+ require 'balanced'
6
+ Balanced.configure('8af725c6d54611e2bf5e026ba7f8ec28')
7
+
8
+ card = Balanced::Card.find('/v1/bank_accounts/BA4eTWiY1VPXkGpjaU6XPBhu')
9
+ card.unstore
10
+
11
+ % endif
@@ -7,7 +7,7 @@ Balanced.configure('8af725c6d54611e2bf5e026ba7f8ec28')
7
7
 
8
8
  card = Balanced::Card.find('/v1/marketplaces/TEST-MP4erLnXCYoaeyr3tx95WSKc/cards/CC4wel9K6ASutW6zqCWZpjsj')
9
9
  card.meta = {
10
- :facebook.user_id => '0192837465',:my-own-customer-id => '12345',:twitter.id => '1234987650',
10
+ 'facebook.user_id' => '0192837465', 'my-own-customer-id' => '12345', 'twitter.id' => '1234987650'
11
11
  }
12
12
  card.save
13
13
 
@@ -39,4 +39,18 @@ describe Balanced::StandardError do
39
39
 
40
40
  its(:message) { should == 'ohnoe!' }
41
41
  its(:error_message) { should == 'ohnoe!' }
42
+ its(:to_s) { should == 'ohnoe!' }
43
+ its(:inspect) { should == '#<Balanced::StandardError: ohnoe!>' }
44
+ end
45
+
46
+ describe Balanced::UnassociatedCardError do
47
+ let(:card) { Balanced::Card.new(uri: '/v1/marketplaces/123/cards/235') }
48
+
49
+ subject do
50
+ Balanced::UnassociatedCardError.new(card)
51
+ end
52
+
53
+ its(:message) do
54
+ should == "The Balanced::Card with uri=#{card.attributes['uri']} is not associated to an account"
55
+ end
42
56
  end
@@ -171,7 +171,7 @@ describe Balanced::Account, :vcr do
171
171
  end
172
172
  end
173
173
 
174
- describe "#add_bank_account", :vcr do
174
+ describe "#add_bank_account using uri", :vcr do
175
175
  before do
176
176
  @new_bank_account = @marketplace.create_bank_account(
177
177
  :account_number => "1234567890",
@@ -194,6 +194,30 @@ describe Balanced::Account, :vcr do
194
194
  it { should eql 2 }
195
195
  end
196
196
  end
197
+
198
+ describe "#add_bank_account using tokenized object", :vcr do
199
+ before do
200
+ @new_bank_account = @marketplace.create_bank_account(
201
+ :account_number => "1234567890",
202
+ :bank_code => "321174851",
203
+ :name => "Jack Q Merchant"
204
+ )
205
+ end
206
+
207
+ describe "when executing" do
208
+ it { -> { @merchant.add_bank_account(@new_bank_account) }.should_not raise_error }
209
+ end
210
+
211
+ describe "after executing", :vcr do
212
+ before do
213
+ @merchant.add_bank_account(@new_bank_account)
214
+ @bank_accounts = Balanced::BankAccount.find(@merchant.bank_accounts_uri).items
215
+ end
216
+
217
+ subject { @bank_accounts.size }
218
+ it { should eql 2 }
219
+ end
220
+ end
197
221
  end
198
222
 
199
223
  describe "buyer" do
@@ -301,7 +325,7 @@ describe Balanced::Account, :vcr do
301
325
  end
302
326
  end
303
327
 
304
- describe "#add_card" do
328
+ describe "#add_card with uri" do
305
329
  describe "when executing", :vcr do
306
330
  before do
307
331
  card = Balanced::Card.new(
@@ -350,6 +374,56 @@ describe Balanced::Account, :vcr do
350
374
  it { should eql 2 }
351
375
  end
352
376
  end
377
+
378
+ describe "#add_card with tokenized object" do
379
+ describe "when executing", :vcr do
380
+ before do
381
+ card = Balanced::Card.new(
382
+ :card_number => "4111111111111111",
383
+ :expiration_month => "12",
384
+ :expiration_year => "2015",
385
+ ).save
386
+ @new_card = Balanced::Card.new(
387
+ :card_number => "4111111111111111",
388
+ :expiration_month => "1",
389
+ :expiration_year => "2015",
390
+ ).save
391
+ @buyer = Balanced::Account.new(
392
+ :uri => @marketplace.accounts_uri,
393
+ :email_address => "buyer3@example.org",
394
+ :card_uri => card.uri,
395
+ :name => "Jack Q Buyer"
396
+ ).save
397
+ end
398
+ it do
399
+ -> { @buyer.add_card(@new_card) }.should_not raise_error
400
+ end
401
+ end
402
+ describe "after executing", :vcr do
403
+ before do
404
+ card = Balanced::Card.new(
405
+ :card_number => "4111111111111111",
406
+ :expiration_month => "12",
407
+ :expiration_year => "2015",
408
+ ).save
409
+ @new_card = Balanced::Card.new(
410
+ :card_number => "5105105105105100",
411
+ :expiration_month => "1",
412
+ :expiration_year => "2017",
413
+ ).save
414
+ @buyer = Balanced::Account.new(
415
+ :uri => @marketplace.accounts_uri,
416
+ :email_address => "buyer4@example.org",
417
+ :card_uri => card.uri,
418
+ :name => "Jack Q Buyer"
419
+ ).save
420
+ @buyer.add_card(@new_card)
421
+ @cards = Balanced::Card.find @buyer.cards_uri
422
+ end
423
+ subject { @cards.items.size }
424
+ it { should eql 2 }
425
+ end
426
+ end
353
427
 
354
428
  describe "#promote_to_merchant" do
355
429
  describe "when executing", :vcr do
@@ -120,26 +120,67 @@ describe Balanced::BankAccount, :vcr do
120
120
  its(:routing_number) { should eql '321174851' }
121
121
  end
122
122
 
123
- describe 'with an account', :vcr do
123
+ describe 'without an account', :vcr do
124
124
  before do
125
- @account = @marketplace.create_account
126
- bank_account = @marketplace.create_bank_account(
125
+ @bank_account = @marketplace.create_bank_account(
127
126
  :account_number => "1234567890111",
128
127
  :bank_code => "021000021",
129
128
  :name => "Timmy T. McTimmerson",
130
129
  :type => "checking"
131
130
  )
132
- @account.add_bank_account(bank_account.uri)
133
- bank_account = bank_account.reload
134
- @credit_with_account = bank_account.credit(
135
- :amount => 500,
136
- :description => 'Blahblahblah'
137
- )
138
131
  end
132
+
133
+ describe 'with appears_on_statement_as', :vcr do
134
+ before do
135
+ @credit = @bank_account.credit(amount: 1000, description: "Testing", appears_on_statement_as: "Test Company")
136
+ end
137
+
138
+ subject { @credit }
139
+ its(:appears_on_statement_as) { should eql 'Test Company' }
140
+ end
141
+ end
139
142
 
140
- subject { @credit_with_account }
141
- it { should respond_to :account }
142
- it { should be_instance_of Balanced::Credit }
143
+ describe 'with an account', :vcr do
144
+ before do
145
+ @bank_account = @marketplace.create_bank_account(
146
+ :account_number => "1234567890111",
147
+ :bank_code => "021000021",
148
+ :name => "Timmy T. McTimmerson",
149
+ :type => "checking"
150
+ )
151
+ @account = @marketplace.create_account
152
+ @account.add_bank_account(@bank_account.uri)
153
+ @bank_account.reload
154
+ end
155
+
156
+ describe 'with appears_on_statement_as', :vcr do
157
+ before do
158
+ @credit = @bank_account.credit(
159
+ :amount => 1000,
160
+ :description => "Blahblahblah",
161
+ :appears_on_statement_as => "Test Company"
162
+ )
163
+ end
164
+
165
+ subject { @credit }
166
+ it { should respond_to :account }
167
+ it { should be_instance_of Balanced::Credit }
168
+ its(:appears_on_statement_as) { should eql 'Test Company' }
169
+ end
170
+
171
+ describe 'without appears_on_statement_as', :vcr do
172
+ before do
173
+ @credit = @bank_account.credit(
174
+ :amount => 1000,
175
+ :description => "Testing",
176
+ )
177
+ end
178
+
179
+ subject { @credit }
180
+ it { should respond_to :account }
181
+ it { should be_instance_of Balanced::Credit }
182
+ its(:appears_on_statement_as) { should eql 'example.com' }
183
+ end
143
184
  end
144
185
  end
145
186
  end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe Balanced::Card, '#debit', vcr: true, marketplace: true do
4
+ it 'raises an exception with an unassociated card' do
5
+ card = Balanced::Card.new
6
+ expect {
7
+ card.debit
8
+ }.to raise_error(Balanced::UnassociatedCardError)
9
+ end
10
+ end
11
+
12
+ describe Balanced::Card, '#hold', vcr: true, marketplace: true do
13
+ it 'raises an exception with an unassociated card' do
14
+ card = Balanced::Card.new
15
+ expect {
16
+ card.hold
17
+ }.to raise_error(Balanced::UnassociatedCardError)
18
+ end
19
+ end
20
+
21
+ describe Balanced::Card, '#debit', vcr: true, marketplace: true do
22
+ it 'debits the card if an account is set' do
23
+ # tokenize card
24
+ card = Balanced::Card.new(
25
+ card_number: '4111111111111111',
26
+ expiration_year: '2016',
27
+ expiration_month: '12')
28
+ card.save
29
+
30
+ # associate card to account
31
+ Balanced::Account.new(email_address: 'user@example.com', name: 'John Doe', card_uri: card.uri).save
32
+
33
+ card = Balanced::Card.find(card.uri)
34
+ card.debit(amount: 10000).should be_instance_of Balanced::Debit
35
+ end
36
+ end
@@ -45,7 +45,7 @@ describe Balanced::Credit, :vcr do
45
45
 
46
46
  describe 'bank_account', :vcr do
47
47
  subject { @credit.bank_account }
48
- its(:account_number) { should end_with '4321' }
48
+ its([:account_number]) { should end_with '4321' }
49
49
  end
50
50
  end
51
51
 
@@ -104,6 +104,39 @@ describe Balanced::Customer, :vcr do
104
104
  end
105
105
  end
106
106
 
107
+ describe "#delete card", :vcr do
108
+ before do
109
+ @card_2 = @marketplace.create_card(
110
+ :card_number => "4111111111111111",
111
+ :expiration_month => "12",
112
+ :expiration_year => "2015",
113
+ ).save
114
+ @card_2.unstore
115
+ end
116
+ it "Should throw 404 on deleted card" do
117
+ expect{
118
+ Balanced::Card.find(@card_2.uri)
119
+ }.to raise_error
120
+ end
121
+ end
122
+
123
+ describe "#delete bank account", :vcr do
124
+ before do
125
+ @bank_account_2 = @marketplace.create_bank_account(
126
+ :account_number => "0987654321",
127
+ :bank_code => "321174851",
128
+ :name => "Timmy T. McTimmerson",
129
+ :type => "checking"
130
+ )
131
+ @bank_account_2.unstore
132
+ end
133
+ it "Should throw 404 on deleted card" do
134
+ expect {
135
+ Balanced::BankAccount.find(@bank_account_2.uri)
136
+ }.to raise_error
137
+ end
138
+ end
139
+
107
140
  describe "#add_bank_account using tokenized object", :vcr do
108
141
  before do
109
142
  @customer = @marketplace.create_customer
@@ -144,6 +177,37 @@ describe Balanced::Customer, :vcr do
144
177
  end
145
178
  end
146
179
 
180
+ describe "#find_by_email", :vcr => { :record => :new_episodes } do
181
+ before do
182
+ api_key = Balanced::ApiKey.new.save
183
+ Balanced.configure api_key.secret
184
+ @marketplace = Balanced::Marketplace.new.save
185
+ customer = @marketplace.create_customer(
186
+ :name => "Bill",
187
+ :email => "bill@bill.com",
188
+ :business_name => "Bill Inc.",
189
+ :ssn_last4 => "1234",
190
+ :address => {
191
+ :line1 => "1234 1st Street",
192
+ :city => "San Francisco",
193
+ :state => "CA"
194
+ }
195
+ ).save
196
+ end
197
+
198
+ context "email address is in system", :vcr => { :record => :new_episodes } do
199
+ it "should return customer object" do
200
+ Balanced::Customer.find_by_email("bill@bill.com").should be_instance_of Balanced::Customer
201
+ end
202
+ end
203
+
204
+ context "email address does not exist", :vcr => { :record => :new_episodes } do
205
+ it "should return nil" do
206
+ Balanced::Customer.find_by_email("foo@bar.com").should be_nil
207
+ end
208
+ end
209
+ end
210
+
147
211
  describe "#debit" do
148
212
  before do
149
213
  @customer = @marketplace.create_customer
@@ -223,6 +287,27 @@ describe Balanced::Customer, :vcr do
223
287
  @customer.active_bank_account.should_not be_nil
224
288
  end
225
289
  end
290
+
291
+ describe "find_by_email", :vcr do
292
+ before do
293
+ @customer = @marketplace.create_customer(
294
+ :email => "balanced-ruby-issue-110@example.com"
295
+ )
296
+ end
297
+
298
+ it "should return 401 unauthorized if not authenticated" do
299
+ @customer.uri.should_not be_nil
300
+ key = Balanced.client.api_key
301
+ Balanced.configure(nil)
302
+ expect {
303
+ Balanced::Customer.find(
304
+ :first,
305
+ email: "balanced-ruby-issue-110@example.com")
306
+ }.to raise_error Balanced::Unauthorized
307
+ Balanced.configure(key)
308
+ end
309
+
310
+ end
226
311
  end
227
312
 
228
313
  end
@@ -37,6 +37,16 @@ RSpec.configure do |c|
37
37
  Balanced.configure api_key.secret
38
38
  Balanced::Marketplace.new.save
39
39
  end
40
+
41
+ # @example Use this metadata to create a marketplace in a before block
42
+ # describe "something under test", vcr: true, marketplace: true do
43
+ # it "works" do
44
+ # # ...
45
+ # end
46
+ # end
47
+ c.before(:each, marketplace: true) do
48
+ make_marketplace
49
+ end
40
50
  end
41
51
 
42
52
 
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.7.2
4
+ version: 0.7.4
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-07-03 00:00:00.000000000 Z
12
+ date: 2013-08-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: faraday
@@ -55,6 +55,8 @@ files:
55
55
  - .gitignore
56
56
  - .rbenv-version
57
57
  - .rspec
58
+ - .ruby-gemset
59
+ - .ruby-version
58
60
  - .travis.yml
59
61
  - CONTRIBUTORS
60
62
  - Gemfile
@@ -77,6 +79,7 @@ files:
77
79
  - examples/customers.rb
78
80
  - examples/events_and_callbacks.rb
79
81
  - examples/examples.rb
82
+ - examples/exception_handling.rb
80
83
  - lib/balanced.rb
81
84
  - lib/balanced/client.rb
82
85
  - lib/balanced/error.rb
@@ -175,6 +178,9 @@ files:
175
178
  - scenarios/card_create/definition.rb
176
179
  - scenarios/card_create/request.rb
177
180
  - scenarios/card_create/ruby.mako
181
+ - scenarios/card_delete/definition.rb
182
+ - scenarios/card_delete/request.rb
183
+ - scenarios/card_delete/ruby.mako
178
184
  - scenarios/card_invalidate/definition.rb
179
185
  - scenarios/card_invalidate/request.rb
180
186
  - scenarios/card_invalidate/ruby.mako
@@ -324,6 +330,7 @@ files:
324
330
  - spec/balanced/resources/api_key_spec.rb
325
331
  - spec/balanced/resources/bank_account_spec.rb
326
332
  - spec/balanced/resources/callback_spec.rb
333
+ - spec/balanced/resources/card_spec.rb
327
334
  - spec/balanced/resources/credit_spec.rb
328
335
  - spec/balanced/resources/customer_spec.rb
329
336
  - spec/balanced/resources/hold_spec.rb
@@ -368,6 +375,7 @@ test_files:
368
375
  - spec/balanced/resources/api_key_spec.rb
369
376
  - spec/balanced/resources/bank_account_spec.rb
370
377
  - spec/balanced/resources/callback_spec.rb
378
+ - spec/balanced/resources/card_spec.rb
371
379
  - spec/balanced/resources/credit_spec.rb
372
380
  - spec/balanced/resources/customer_spec.rb
373
381
  - spec/balanced/resources/hold_spec.rb