balanced 0.7.2 → 0.7.4

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.
@@ -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