braintree-rails 1.4.0 → 1.4.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: beb78e264daf6f5aa910f0f22a037a401de719ee
4
- data.tar.gz: 964ddabe92b7e24904d9fc2a7611c3eb7f57721f
3
+ metadata.gz: 51d3059b858bb2192c5a21e6fe99da5b79ce2dbd
4
+ data.tar.gz: 51a3f9d66af180e42bbc0e5beea380a8fe3e3853
5
5
  SHA512:
6
- metadata.gz: 45abffe047116fef0dff574b3bc833afa11e1c44af7c1019776b387f5f80123d0e4bf186200fa0f6bac331d1cda858080ef50d864d7656d367afb5d74c133c4e
7
- data.tar.gz: 1c45542fe5e4ce03cd46a8b2e00f0a289c4f5fdbc643b7af83624c21962b317a09636c019eda5bd7b1b5fecd421ce1ddb300bfa5c126ab272b25e3e730af3745
6
+ metadata.gz: 48a8b5c76024facbfe7b091d804b072ed91a4d18f68bacb565d46bc0a7f13d704ceda99d0fd55e646c104db4a2ee1f96e8c7790e10e0d77cae9a56fd456e527a
7
+ data.tar.gz: eb131427147d9b22525738f4e9b04f93598f6d6e9c7fd0c7eae24c5f6b9e3261aacdac89bf28934d898b6f60f1658393dec412c4e5ad45c51970619978f38601
@@ -1,4 +1,12 @@
1
1
  ## Unreleased (master)
2
+ ### Enhancements
3
+ * Added image_url to credit card readonly attributes. (Thanks, @maxkaplan)
4
+
5
+ ### Bug Fixes
6
+ * Fix propagation of braintree reported errors to associations in merchant accounts. (Thanks, @twalpole)
7
+ * Do not raise exception on gateway rejected transactions. (Thanks, @murtyk)
8
+
9
+ ## v1.4.0 (0830c14), Dec 12 2014
2
10
  ### Enhancements
3
11
  * Added `service_fee_amount` to `BraintreeRails::Transaction`. (Thanks, @KELiON)
4
12
  * Enhanced validation error parsing so that they can be customized/i18n-ed
data/Gemfile CHANGED
@@ -7,5 +7,6 @@ group :test do
7
7
  gem 'rake'
8
8
  gem 'rspec'
9
9
  gem 'webmock'
10
+ gem 'pry'
10
11
  gem 'coveralls', require: false
11
12
  end
@@ -14,6 +14,7 @@ GEM
14
14
  braintree (2.38.0)
15
15
  builder (>= 2.0.0)
16
16
  builder (3.2.2)
17
+ coderay (1.1.0)
17
18
  coveralls (0.7.2)
18
19
  multi_json (~> 1.3)
19
20
  rest-client (= 1.6.7)
@@ -26,9 +27,14 @@ GEM
26
27
  docile (1.1.5)
27
28
  i18n (0.6.11)
28
29
  json (1.8.1)
30
+ method_source (0.8.2)
29
31
  mime-types (2.4.3)
30
32
  minitest (5.4.3)
31
33
  multi_json (1.10.1)
34
+ pry (0.10.3)
35
+ coderay (~> 1.1.0)
36
+ method_source (~> 0.8.1)
37
+ slop (~> 3.4)
32
38
  rake (10.4.2)
33
39
  rest-client (1.6.7)
34
40
  mime-types (>= 1.16)
@@ -50,6 +56,7 @@ GEM
50
56
  multi_json (~> 1.0)
51
57
  simplecov-html (~> 0.8.0)
52
58
  simplecov-html (0.8.0)
59
+ slop (3.6.0)
53
60
  term-ansicolor (1.2.2)
54
61
  tins (~> 0.8)
55
62
  thor (0.18.1)
@@ -69,6 +76,10 @@ DEPENDENCIES
69
76
  activesupport (>= 3.0)
70
77
  braintree (>= 2.28.0)
71
78
  coveralls
79
+ pry
72
80
  rake
73
81
  rspec
74
82
  webmock
83
+
84
+ BUNDLED WITH
85
+ 1.10.6
@@ -10,5 +10,9 @@ module BraintreeRails
10
10
  def self.braintree_model_name
11
11
  "merchant_account/#{name.demodulize.underscore}"
12
12
  end
13
+
14
+ def extract_errors(errors)
15
+ errors.for(:address) if errors
16
+ end
13
17
  end
14
18
  end
@@ -14,7 +14,7 @@ module BraintreeRails
14
14
  end
15
15
 
16
16
  def add_errors(validation_errors)
17
- address.add_errors(validation_errors) if address
17
+ address.add_errors(extract_errors(validation_errors)) if address
18
18
  super(validation_errors)
19
19
  end
20
20
 
@@ -25,5 +25,9 @@ module BraintreeRails
25
25
  def address_attributes
26
26
  address.present? ? {:address => address.attributes_for(:as_association)} : {}
27
27
  end
28
+
29
+ def extract_errors(errors)
30
+ errors.for(:business)
31
+ end
28
32
  end
29
33
  end
@@ -6,7 +6,7 @@ module BraintreeRails
6
6
  :update => [:billing_address, :cardholder_name, :expiration_date, :expiration_month, :expiration_year, :options, :number, :cvv, :device_data],
7
7
  :readonly => [
8
8
  :bin, :card_type, :commercial, :country_of_issuance, :created_at, :debit, :durbin_regulated, :default,
9
- :expired, :healthcare, :issuing_bank, :last_4, :payroll, :prepaid, :unique_number_identifier, :updated_at
9
+ :expired, :healthcare, :issuing_bank, :image_url, :last_4, :payroll, :prepaid, :unique_number_identifier, :updated_at
10
10
  ],
11
11
  :as_association => [:cardholder_name, :cvv, :expiration_date, :expiration_month, :expiration_year, :number]
12
12
  )
@@ -13,5 +13,9 @@ module BraintreeRails
13
13
  def self.braintree_model_name
14
14
  "merchant_account/#{name.demodulize.underscore}"
15
15
  end
16
+
17
+ def extract_errors(errors)
18
+ errors.for(:funding)
19
+ end
16
20
  end
17
21
  end
@@ -17,7 +17,7 @@ module BraintreeRails
17
17
  end
18
18
 
19
19
  def add_errors(validation_errors)
20
- address.add_errors(validation_errors) if address
20
+ address.add_errors(extract_errors(validation_errors)) if address
21
21
  super(validation_errors)
22
22
  end
23
23
 
@@ -28,5 +28,9 @@ module BraintreeRails
28
28
  def address_attributes
29
29
  address.present? ? {:address => address.attributes_for(:as_association)} : {}
30
30
  end
31
+
32
+ def extract_errors(errors)
33
+ errors.for(:individual)
34
+ end
31
35
  end
32
36
  end
@@ -20,13 +20,13 @@ module BraintreeRails
20
20
  after_create :reload, :if => :persisted?
21
21
 
22
22
  def add_errors(validation_errors)
23
- propergate_errors_to_associations(extract_errors(validation_errors))
23
+ propagate_errors_to_associations(extract_errors(validation_errors))
24
24
  super(validation_errors)
25
25
  end
26
26
 
27
- def propergate_errors_to_associations(validation_errors)
27
+ def propagate_errors_to_associations(validation_errors)
28
28
  [individual, business, funding].each do |association|
29
- association.add_errors(validation_errors) if association
29
+ association.add_errors(validation_errors) if association && errors
30
30
  end
31
31
  end
32
32
 
@@ -114,13 +114,17 @@ module BraintreeRails
114
114
  def with_update_braintree(context)
115
115
  raise RecordInvalid.new(self) unless valid?(context)
116
116
  run_callbacks context do
117
- result = yield
118
- if result.respond_to?(:success?) && !result.success?
117
+ case result = yield
118
+ when Braintree::ErrorResult
119
+ if result.respond_to?(self.class.braintree_model_name) && result.send(self.class.braintree_model_name)
120
+ init(result.send(self.class.braintree_model_name))
121
+ end
119
122
  add_errors(result.errors)
120
123
  false
124
+ when Braintree::SuccessfulResult
125
+ init(result.send(self.class.braintree_model_name))
121
126
  else
122
- new_record = result.respond_to?(self.class.braintree_model_name) ? result.send(self.class.braintree_model_name) : result
123
- init(new_record)
127
+ init(result)
124
128
  end
125
129
  end
126
130
  end
@@ -136,4 +140,4 @@ module BraintreeRails
136
140
  end
137
141
  end
138
142
  end
139
- end
143
+ end
@@ -13,8 +13,8 @@ module BraintreeRails
13
13
  :readonly => [
14
14
  :avs_error_response_code, :avs_postal_code_response_code, :avs_street_address_response_code, :billing_details,
15
15
  :channel, :created_at, :credit_card, :credit_card_details, :currency_iso_code, :customer, :customer_details,
16
- :cvv_response_code, :id, :plan_id, :purchase_order_number, :refund_ids, :refunded_transaction_id, :settlement_batch_id,
17
- :shipping_details, :status, :status_history, :subscription_details, :updated_at
16
+ :cvv_response_code, :gateway_rejection_reason, :id, :plan_id, :purchase_order_number, :refund_ids, :refunded_transaction_id,
17
+ :settlement_batch_id, :shipping_details, :status, :status_history, :subscription_details, :updated_at
18
18
  ]
19
19
  )
20
20
 
@@ -64,7 +64,7 @@ module BraintreeRails
64
64
  end
65
65
 
66
66
  def add_errors(validation_errors)
67
- propergate_errors_to_associations(extract_errors(validation_errors))
67
+ propagate_errors_to_associations(extract_errors(validation_errors))
68
68
  super(validation_errors)
69
69
  end
70
70
 
@@ -80,9 +80,9 @@ module BraintreeRails
80
80
 
81
81
  protected
82
82
 
83
- def propergate_errors_to_associations(errors)
83
+ def propagate_errors_to_associations(errors)
84
84
  [customer, credit_card, billing, shipping].each do |association|
85
- association.add_errors(errors) if association
85
+ association.add_errors(errors) if association && errors
86
86
  end
87
87
  end
88
88
 
@@ -116,4 +116,4 @@ module BraintreeRails
116
116
  end
117
117
  end
118
118
  end
119
- end
119
+ end
@@ -1,3 +1,3 @@
1
1
  module BraintreeRails
2
- Version = "1.4.0"
2
+ Version = "1.4.1"
3
3
  end
@@ -1,4 +1,5 @@
1
1
  ---
2
2
  merchant_id: 'merchant_id'
3
3
  public_key: 'public_key'
4
- private_key: 'private_key'
4
+ private_key: 'private_key'
5
+ default_merchant_account_id: 'default_merchant_account_id'
@@ -0,0 +1,147 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <api-error-response>
3
+ <errors>
4
+ <errors type="array"/>
5
+ </errors>
6
+ <params>
7
+ <transaction>
8
+ <amount>5001</amount>
9
+ <type>sale</type>
10
+ <customer-id>customer_id</customer-id>
11
+ <payment-method-token>credit_card_id</payment-method-token>
12
+ </transaction>
13
+ </params>
14
+ <message>Gateway Rejected: application_incomplete</message>
15
+ <transaction>
16
+ <id>transactionid</id>
17
+ <status>gateway_rejected</status>
18
+ <type>sale</type>
19
+ <currency-iso-code>USD</currency-iso-code>
20
+ <amount>5001.00</amount>
21
+ <merchant-account-id>merchant_id</merchant-account-id>
22
+ <order-id nil="true"/>
23
+ <created-at type="datetime">2015-11-21T22:23:51Z</created-at>
24
+ <updated-at type="datetime">2015-11-21T22:23:51Z</updated-at>
25
+ <customer>
26
+ <id>customer_id</id>
27
+ <first-name>Brain47</first-name>
28
+ <last-name>Tree17</last-name>
29
+ <company nil="true"/>
30
+ <email nil="true"/>
31
+ <website nil="true"/>
32
+ <phone nil="true"/>
33
+ <fax nil="true"/>
34
+ </customer>
35
+ <billing>
36
+ <id>ff</id>
37
+ <first-name>Brain</first-name>
38
+ <last-name>Tree</last-name>
39
+ <company>Braintree</company>
40
+ <street-address>8711 Crane Avenue</street-address>
41
+ <extended-address>Suite 629</extended-address>
42
+ <locality>Menlo Park</locality>
43
+ <region>CA</region>
44
+ <postal-code>82875</postal-code>
45
+ <country-name>United States of America</country-name>
46
+ <country-code-alpha2>US</country-code-alpha2>
47
+ <country-code-alpha3>USA</country-code-alpha3>
48
+ <country-code-numeric>840</country-code-numeric>
49
+ </billing>
50
+ <refund-id nil="true"/>
51
+ <refund-ids type="array"/>
52
+ <refunded-transaction-id nil="true"/>
53
+ <partial-settlement-transaction-ids type="array"/>
54
+ <authorized-transaction-id nil="true"/>
55
+ <settlement-batch-id nil="true"/>
56
+ <shipping>
57
+ <id nil="true"/>
58
+ <first-name nil="true"/>
59
+ <last-name nil="true"/>
60
+ <company nil="true"/>
61
+ <street-address nil="true"/>
62
+ <extended-address nil="true"/>
63
+ <locality nil="true"/>
64
+ <region nil="true"/>
65
+ <postal-code nil="true"/>
66
+ <country-name nil="true"/>
67
+ <country-code-alpha2 nil="true"/>
68
+ <country-code-alpha3 nil="true"/>
69
+ <country-code-numeric nil="true"/>
70
+ </shipping>
71
+ <custom-fields/>
72
+ <avs-error-response-code nil="true"/>
73
+ <avs-postal-code-response-code nil="true"/>
74
+ <avs-street-address-response-code nil="true"/>
75
+ <cvv-response-code nil="true"/>
76
+ <gateway-rejection-reason>application_incomplete</gateway-rejection-reason>
77
+ <processor-authorization-code nil="true"/>
78
+ <processor-response-code></processor-response-code>
79
+ <processor-response-text>Unknown ()</processor-response-text>
80
+ <additional-processor-response nil="true"/>
81
+ <voice-referral-number nil="true"/>
82
+ <purchase-order-number nil="true"/>
83
+ <tax-amount nil="true"/>
84
+ <tax-exempt type="boolean">false</tax-exempt>
85
+ <credit-card>
86
+ <token>credit_card_id</token>
87
+ <bin>400011</bin>
88
+ <last-4>1115</last-4>
89
+ <card-type>Visa</card-type>
90
+ <expiration-month>11</expiration-month>
91
+ <expiration-year>2017</expiration-year>
92
+ <customer-location>US</customer-location>
93
+ <cardholder-name>Brain Tree</cardholder-name>
94
+ <image-url>https://assets.braintreegateway.com/payment_method_logo/visa.png?environment=sandbox</image-url>
95
+ <prepaid>Unknown</prepaid>
96
+ <healthcare>Unknown</healthcare>
97
+ <debit>Unknown</debit>
98
+ <durbin-regulated>Unknown</durbin-regulated>
99
+ <commercial>Unknown</commercial>
100
+ <payroll>Unknown</payroll>
101
+ <issuing-bank>Unknown</issuing-bank>
102
+ <country-of-issuance>Unknown</country-of-issuance>
103
+ <product-id>Unknown</product-id>
104
+ <unique-number-identifier>26f8b913bb2a574089777f07d48cc590</unique-number-identifier>
105
+ <venmo-sdk type="boolean">false</venmo-sdk>
106
+ </credit-card>
107
+ <status-history type="array">
108
+ <status-event>
109
+ <timestamp type="datetime">2015-11-21T22:23:51Z</timestamp>
110
+ <status>gateway_rejected</status>
111
+ <amount>5001.00</amount>
112
+ <user>braintree-rails-integration-test</user>
113
+ <transaction-source>api</transaction-source>
114
+ </status-event>
115
+ </status-history>
116
+ <plan-id nil="true"/>
117
+ <subscription-id nil="true"/>
118
+ <subscription>
119
+ <billing-period-end-date nil="true"/>
120
+ <billing-period-start-date nil="true"/>
121
+ </subscription>
122
+ <add-ons type="array"/>
123
+ <discounts type="array"/>
124
+ <descriptor>
125
+ <name nil="true"/>
126
+ <phone nil="true"/>
127
+ <url nil="true"/>
128
+ </descriptor>
129
+ <recurring type="boolean">false</recurring>
130
+ <channel nil="true"/>
131
+ <service-fee-amount nil="true"/>
132
+ <escrow-status nil="true"/>
133
+ <disbursement-details>
134
+ <disbursement-date nil="true"/>
135
+ <settlement-amount nil="true"/>
136
+ <settlement-currency-iso-code nil="true"/>
137
+ <settlement-currency-exchange-rate nil="true"/>
138
+ <funds-held nil="true"/>
139
+ <success nil="true"/>
140
+ </disbursement-details>
141
+ <disputes type="array"/>
142
+ <payment-instrument-type>credit_card</payment-instrument-type>
143
+ <processor-settlement-response-code></processor-settlement-response-code>
144
+ <processor-settlement-response-text></processor-settlement-response-text>
145
+ <three-d-secure-info nil="true"/>
146
+ </transaction>
147
+ </api-error-response>
@@ -29,6 +29,7 @@ describe 'Credit Card Integration' do
29
29
  attributes.except(:number, :cvv, :billing_address).each do |key, value|
30
30
  expect(braintree_credit_card.send(key)).to eq(value)
31
31
  end
32
+ expect(credit_card.image_url).to eq(braintree_credit_card.image_url)
32
33
 
33
34
  braintree_address = braintree_credit_card.billing_address
34
35
  attributes[:billing_address].each do |key, value|
@@ -42,7 +42,8 @@ describe 'Customer Integration' do
42
42
  customer.update_attributes!(:first_name => 'Foo', :last_name => 'Bar', :credit_card => credit_card_hash.merge(:cardholder_name => "FooBar"))
43
43
 
44
44
  braintree_customer = Braintree::Customer.find(customer.id)
45
- expect(braintree_customer.credit_cards.first.cardholder_name).to eq("FooBar")
45
+ expect(braintree_customer.credit_cards.size).to eq(2)
46
+ expect(braintree_customer.credit_cards.map(&:cardholder_name)).to include("FooBar")
46
47
  end
47
48
 
48
49
  it 'should be able to destroy existing customer' do
@@ -8,8 +8,13 @@ describe 'MerchantAccount Integration' do
8
8
  expect(merchant_account.status).to eq(braintree_merchant_account.status)
9
9
  end
10
10
 
11
- it 'can create sub merchant account' do
12
- merchant_account = BraintreeRails::MerchantAccount.create(merchant_account_hash)
11
+ it 'can create sub merchant account paid via email' do
12
+ merchant_account = BraintreeRails::MerchantAccount.create(merchant_account_hash(:email))
13
+ expect(merchant_account).to be_persisted
14
+ end
15
+
16
+ it 'can create sub merchant account paid via bank account' do
17
+ merchant_account = BraintreeRails::MerchantAccount.create(merchant_account_hash(:bank))
13
18
  expect(merchant_account).to be_persisted
14
19
  end
15
20
 
@@ -18,7 +23,7 @@ describe 'MerchantAccount Integration' do
18
23
  expect(merchant_account).to_not be_persisted
19
24
  end
20
25
 
21
- it 'sets validation errors properly to its associations' do
26
+ it 'sets internal validation errors properly to its associations' do
22
27
  merchant_account = BraintreeRails::MerchantAccount.create(merchant_account_hash.merge(:individual => {}, :funding => {}, :business => {:legal_name => "foo"}))
23
28
  expect(merchant_account).to_not be_persisted
24
29
  expect(merchant_account.individual.errors).to_not be_empty
@@ -26,6 +31,20 @@ describe 'MerchantAccount Integration' do
26
31
  expect(merchant_account.business.errors).to_not be_empty
27
32
  end
28
33
 
34
+ it 'sets validation errors reported by Braintree properly to its associations' do
35
+ mah = merchant_account_hash(:bank)
36
+ mah[:funding][:routing_number]='22222222' #invalid routing number
37
+ mah[:individual][:address][:postal_code] = '1234' #invalid postal code
38
+ mah[:individual][:ssn]='111-11-111' #invalid ssn
39
+ mah[:business][:tax_id]='1' #invlaid tax id
40
+ merchant_account = BraintreeRails::MerchantAccount.create(mah)
41
+ expect(merchant_account).to_not be_persisted
42
+ expect(merchant_account.funding.errors).to_not be_empty
43
+ expect(merchant_account.business.errors).to_not be_empty
44
+ expect(merchant_account.individual.errors).to_not be_empty
45
+ expect(merchant_account.individual.address.errors).to_not be_empty
46
+ end
47
+
29
48
  it 'can update the submerchant account' do
30
49
  individual = merchant_account_hash[:individual].merge(:first_name => "foo")
31
50
  merchant_account = BraintreeRails::MerchantAccount.create(merchant_account_hash.merge(:individual => individual))
@@ -65,12 +65,12 @@ module Helper
65
65
  }
66
66
  end
67
67
 
68
- def merchant_account_hash
68
+ def merchant_account_hash(kind = :email)
69
69
  {
70
70
  :master_merchant_account_id => BraintreeRails::Configuration.default_merchant_account_id,
71
71
  :tos_accepted => true,
72
72
  :individual => individual_details_hash,
73
- :funding => funding_details_hash,
73
+ :funding => send("#{kind.to_s}_funding_details_hash"),
74
74
  :business => business_details_hash,
75
75
  }
76
76
  end
@@ -93,13 +93,23 @@ module Helper
93
93
  }
94
94
  end
95
95
 
96
- def funding_details_hash
96
+ def email_funding_details_hash
97
97
  {
98
98
  :destination => Braintree::MerchantAccount::FundingDestination::Email,
99
99
  :email => "braintree-rails@exameple.com"
100
100
  }
101
101
  end
102
102
 
103
+ def bank_funding_details_hash
104
+ {
105
+ :destination => Braintree::MerchantAccount::FundingDestination::Bank,
106
+ :email => "braintree-rails@example.com",
107
+ :mobile_phone => '2015551212',
108
+ :account_number => '1234567890',
109
+ :routing_number => '071101307'
110
+ }
111
+ end
112
+
103
113
  def address_details_hash
104
114
  {
105
115
  :street_address => "#{(1000..9999).to_a.sample} Crane Avenue",
@@ -14,6 +14,7 @@ describe BraintreeRails::CreditCard do
14
14
  expect(credit_card.default?).to eq(braintree_credit_card.default?)
15
15
  expect(credit_card.expired?).to eq(braintree_credit_card.expired?)
16
16
  expect(credit_card.masked_number).to eq(braintree_credit_card.masked_number)
17
+ expect(credit_card.image_url).to eq(braintree_credit_card.image_url)
17
18
  BraintreeRails::CreditCard.attributes.each do |attribute|
18
19
  next if BraintreeRails::CreditCard.associations.include?(attribute)
19
20
  if braintree_credit_card.respond_to?(attribute)
@@ -350,4 +351,4 @@ describe BraintreeRails::CreditCard do
350
351
  expect(BraintreeRails::CreditCard.delete('credit_card_id')).to eq(true)
351
352
  end
352
353
  end
353
- end
354
+ end
@@ -3,31 +3,31 @@ require File.expand_path(File.join(File.dirname(__FILE__), '../unit_spec_helper'
3
3
  describe BraintreeRails::FundingDetails do
4
4
  describe 'validations' do
5
5
  it "requries destination" do
6
- funding = BraintreeRails::FundingDetails.new(funding_details_hash.merge(:destination => nil))
6
+ funding = BraintreeRails::FundingDetails.new(email_funding_details_hash.merge(:destination => nil))
7
7
  expect(funding).to be_invalid
8
8
  expect(funding.errors[:destination]).to eq(["can't be blank", "is not included in the list"])
9
9
  end
10
10
 
11
11
  it "cannot be trash destination" do
12
- funding = BraintreeRails::FundingDetails.new(funding_details_hash.merge(:destination => "foo"))
12
+ funding = BraintreeRails::FundingDetails.new(email_funding_details_hash.merge(:destination => "foo"))
13
13
  expect(funding).to be_invalid
14
14
  expect(funding.errors[:destination]).to eq(["is not included in the list"])
15
15
  end
16
16
 
17
17
  it "requries email if destination is Email" do
18
- funding = BraintreeRails::FundingDetails.new(funding_details_hash.merge(:destination => Braintree::MerchantAccount::FundingDestination::Email, :email => nil))
18
+ funding = BraintreeRails::FundingDetails.new(email_funding_details_hash.merge(:destination => Braintree::MerchantAccount::FundingDestination::Email, :email => nil))
19
19
  expect(funding).to be_invalid
20
20
  expect(funding.errors[:email]).to eq(["can't be blank"])
21
21
  end
22
22
 
23
23
  it "requries mobile_phone if destination is MobilePhone" do
24
- funding = BraintreeRails::FundingDetails.new(funding_details_hash.merge(:destination => Braintree::MerchantAccount::FundingDestination::MobilePhone, :mobile_phone => nil))
24
+ funding = BraintreeRails::FundingDetails.new(email_funding_details_hash.merge(:destination => Braintree::MerchantAccount::FundingDestination::MobilePhone, :mobile_phone => nil))
25
25
  expect(funding).to be_invalid
26
26
  expect(funding.errors[:mobile_phone]).to eq(["can't be blank"])
27
27
  end
28
28
 
29
29
  it "requries account_number and routing_number if destination is Bank" do
30
- funding = BraintreeRails::FundingDetails.new(funding_details_hash.merge(:destination => Braintree::MerchantAccount::FundingDestination::Bank, :account_number => nil, :routing_number => nil))
30
+ funding = BraintreeRails::FundingDetails.new(email_funding_details_hash.merge(:destination => Braintree::MerchantAccount::FundingDestination::Bank, :account_number => nil, :routing_number => nil))
31
31
  expect(funding).to be_invalid
32
32
  expect(funding.errors[:account_number]).to eq(["can't be blank"])
33
33
  expect(funding.errors[:routing_number]).to eq(["can't be blank"])
@@ -218,7 +218,7 @@ describe BraintreeRails::Transaction do
218
218
  expect {transaction.submit_for_settlement!}.to raise_error(BraintreeRails::RecordInvalid)
219
219
  end
220
220
 
221
- it 'should propergate api errors to associations if any' do
221
+ it 'should propagate api errors to associations if any' do
222
222
  customer = BraintreeRails::Customer.find('customer_id')
223
223
  credit_card = BraintreeRails::CreditCard.find('credit_card_id')
224
224
  transaction = BraintreeRails::Transaction.new(:amount => '10.00', :customer => customer, :credit_card => credit_card, :billing => address_hash, :shipping => address_hash)
@@ -243,9 +243,19 @@ describe BraintreeRails::Transaction do
243
243
  expect(transaction.shipping.errors.full_messages.map(&:to_s)).to eq(["Postal code Postal code may contain no more than 9 letter or number characters."])
244
244
  end
245
245
 
246
+ it 'should be able to handle gateway rejected transactions' do
247
+ customer = BraintreeRails::Customer.find('customer_id')
248
+ credit_card = BraintreeRails::CreditCard.find('credit_card_id')
249
+ transaction = BraintreeRails::Transaction.new(:amount => '10.00', :customer => customer, :credit_card => credit_card, :billing => address_hash, :shipping => address_hash)
250
+ stub_braintree_request(:post, '/transactions', :status => 422, :body => fixture('gateway_rejected.xml'))
251
+ expect {transaction.save}.to_not raise_error
252
+ expect(transaction.status).to eq(Braintree::Transaction::Status::GatewayRejected)
253
+ expect(transaction.gateway_rejection_reason).to eq("application_incomplete")
254
+ end
255
+
246
256
  it 'does not support update or destroy' do
247
257
  expect {BraintreeRails::Transaction.find('transactionid').update_attributes(:amount => 1)}.to raise_error(BraintreeRails::NotSupportedApiException)
248
258
  expect {BraintreeRails::Transaction.find('transactionid').destroy!}.to raise_error(BraintreeRails::NotSupportedApiException)
249
259
  end
250
260
  end
251
- end
261
+ end
metadata CHANGED
@@ -1,129 +1,129 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: braintree-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lin Yang
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-12 00:00:00.000000000 Z
11
+ date: 2015-11-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: braintree
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: 2.28.0
20
- - - <
20
+ - - "<"
21
21
  - !ruby/object:Gem::Version
22
22
  version: '3'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
- - - '>='
27
+ - - ">="
28
28
  - !ruby/object:Gem::Version
29
29
  version: 2.28.0
30
- - - <
30
+ - - "<"
31
31
  - !ruby/object:Gem::Version
32
32
  version: '3'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: activemodel
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
- - - '>='
37
+ - - ">="
38
38
  - !ruby/object:Gem::Version
39
39
  version: '3.0'
40
- - - <
40
+ - - "<"
41
41
  - !ruby/object:Gem::Version
42
42
  version: '5'
43
43
  type: :runtime
44
44
  prerelease: false
45
45
  version_requirements: !ruby/object:Gem::Requirement
46
46
  requirements:
47
- - - '>='
47
+ - - ">="
48
48
  - !ruby/object:Gem::Version
49
49
  version: '3.0'
50
- - - <
50
+ - - "<"
51
51
  - !ruby/object:Gem::Version
52
52
  version: '5'
53
53
  - !ruby/object:Gem::Dependency
54
54
  name: activesupport
55
55
  requirement: !ruby/object:Gem::Requirement
56
56
  requirements:
57
- - - '>='
57
+ - - ">="
58
58
  - !ruby/object:Gem::Version
59
59
  version: '3.0'
60
- - - <
60
+ - - "<"
61
61
  - !ruby/object:Gem::Version
62
62
  version: '5'
63
63
  type: :runtime
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
- - - '>='
67
+ - - ">="
68
68
  - !ruby/object:Gem::Version
69
69
  version: '3.0'
70
- - - <
70
+ - - "<"
71
71
  - !ruby/object:Gem::Version
72
72
  version: '5'
73
73
  - !ruby/object:Gem::Dependency
74
74
  name: rake
75
75
  requirement: !ruby/object:Gem::Requirement
76
76
  requirements:
77
- - - ~>
77
+ - - "~>"
78
78
  - !ruby/object:Gem::Version
79
79
  version: '10'
80
80
  type: :development
81
81
  prerelease: false
82
82
  version_requirements: !ruby/object:Gem::Requirement
83
83
  requirements:
84
- - - ~>
84
+ - - "~>"
85
85
  - !ruby/object:Gem::Version
86
86
  version: '10'
87
87
  - !ruby/object:Gem::Dependency
88
88
  name: rspec
89
89
  requirement: !ruby/object:Gem::Requirement
90
90
  requirements:
91
- - - ~>
91
+ - - "~>"
92
92
  - !ruby/object:Gem::Version
93
93
  version: '3'
94
94
  type: :development
95
95
  prerelease: false
96
96
  version_requirements: !ruby/object:Gem::Requirement
97
97
  requirements:
98
- - - ~>
98
+ - - "~>"
99
99
  - !ruby/object:Gem::Version
100
100
  version: '3'
101
101
  - !ruby/object:Gem::Dependency
102
102
  name: webmock
103
103
  requirement: !ruby/object:Gem::Requirement
104
104
  requirements:
105
- - - ~>
105
+ - - "~>"
106
106
  - !ruby/object:Gem::Version
107
107
  version: '1'
108
108
  type: :development
109
109
  prerelease: false
110
110
  version_requirements: !ruby/object:Gem::Requirement
111
111
  requirements:
112
- - - ~>
112
+ - - "~>"
113
113
  - !ruby/object:Gem::Version
114
114
  version: '1'
115
115
  - !ruby/object:Gem::Dependency
116
116
  name: coveralls
117
117
  requirement: !ruby/object:Gem::Requirement
118
118
  requirements:
119
- - - ~>
119
+ - - "~>"
120
120
  - !ruby/object:Gem::Version
121
121
  version: '0'
122
122
  type: :development
123
123
  prerelease: false
124
124
  version_requirements: !ruby/object:Gem::Requirement
125
125
  requirements:
126
- - - ~>
126
+ - - "~>"
127
127
  - !ruby/object:Gem::Version
128
128
  version: '0'
129
129
  description: Provides ActiveModel compatible wrappers for Braintree models and more.
@@ -132,8 +132,8 @@ executables: []
132
132
  extensions: []
133
133
  extra_rdoc_files: []
134
134
  files:
135
- - .gitignore
136
- - .travis.yml
135
+ - ".gitignore"
136
+ - ".travis.yml"
137
137
  - CHANGELOG.md
138
138
  - Gemfile
139
139
  - Gemfile.lock
@@ -207,6 +207,7 @@ files:
207
207
  - spec/fixtures/credit_card_validation_error.xml
208
208
  - spec/fixtures/customer.xml
209
209
  - spec/fixtures/discounts.xml
210
+ - spec/fixtures/gateway_rejected.xml
210
211
  - spec/fixtures/merchant_account.xml
211
212
  - spec/fixtures/plans.xml
212
213
  - spec/fixtures/subscription.xml
@@ -259,17 +260,17 @@ require_paths:
259
260
  - lib
260
261
  required_ruby_version: !ruby/object:Gem::Requirement
261
262
  requirements:
262
- - - '>='
263
+ - - ">="
263
264
  - !ruby/object:Gem::Version
264
265
  version: 1.9.2
265
266
  required_rubygems_version: !ruby/object:Gem::Requirement
266
267
  requirements:
267
- - - '>='
268
+ - - ">="
268
269
  - !ruby/object:Gem::Version
269
270
  version: '0'
270
271
  requirements: []
271
272
  rubyforge_project:
272
- rubygems_version: 2.2.2
273
+ rubygems_version: 2.4.6
273
274
  signing_key:
274
275
  specification_version: 4
275
276
  summary: Provides ActiveModel compatible wrappers for Braintree models.