braintree 2.78.0 → 2.79.0
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 +4 -4
- data/README.rdoc +9 -0
- data/lib/braintree.rb +1 -0
- data/lib/braintree/configuration.rb +2 -2
- data/lib/braintree/customer_gateway.rb +11 -1
- data/lib/braintree/error_codes.rb +3 -0
- data/lib/braintree/granted_payment_instrument_update.rb +19 -0
- data/lib/braintree/payment_method_gateway.rb +6 -0
- data/lib/braintree/risk_data.rb +2 -2
- data/lib/braintree/subscription.rb +3 -2
- data/lib/braintree/subscription_gateway.rb +7 -2
- data/lib/braintree/transaction_gateway.rb +6 -3
- data/lib/braintree/version.rb +1 -1
- data/lib/braintree/webhook_notification.rb +4 -0
- data/lib/braintree/webhook_testing_gateway.rb +22 -0
- data/lib/braintree/xml/generator.rb +1 -0
- data/spec/integration/braintree/add_on_spec.rb +1 -1
- data/spec/integration/braintree/credit_card_spec.rb +1 -0
- data/spec/integration/braintree/customer_spec.rb +18 -0
- data/spec/integration/braintree/merchant_account_spec.rb +27 -0
- data/spec/integration/braintree/oauth_spec.rb +2 -0
- data/spec/integration/braintree/payment_method_spec.rb +69 -0
- data/spec/integration/braintree/subscription_spec.rb +87 -1
- data/spec/integration/braintree/test_transaction_spec.rb +10 -10
- data/spec/integration/braintree/transaction_spec.rb +25 -38
- data/spec/unit/braintree/configuration_spec.rb +11 -2
- data/spec/unit/braintree/credit_card_verification_spec.rb +7 -1
- data/spec/unit/braintree/customer_spec.rb +46 -2
- data/spec/unit/braintree/risk_data_spec.rb +6 -4
- data/spec/unit/braintree/webhook_notification_spec.rb +27 -8
- data/spec/unit/braintree/xml_spec.rb +7 -0
- data/spec/unit/braintree_spec.rb +1 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0e9443a409e302f9f139f6b8f43f6357671c4fb4
|
4
|
+
data.tar.gz: 58f33b08befa54a85859bda8277d6f556c4c834d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2482192edfc3d977132a3fee6c9f1052746ec2fc20ce8b2be5ae02021978cfbb64c1c93248a7f3b27d20da680b7d6f92abdc3ed7d627768887812a1f30ffc84e
|
7
|
+
data.tar.gz: f33e4c21098180d53f3839d7f2039c2add7df880b0856e86717b450d3604803d8b92463a0d365657cb23f5749708eb1b23e352e7d84212a8a80e862b5e3f2f5c
|
data/README.rdoc
CHANGED
@@ -88,6 +88,15 @@ The unit specs can be run by anyone on any system, but the integration specs are
|
|
88
88
|
server of our gateway code. These integration specs are not meant for public consumption and will likely fail if run on
|
89
89
|
your system. To run unit tests use rake: <tt>rake test:unit</tt>.
|
90
90
|
|
91
|
+
== Suppress Braintree Logs
|
92
|
+
|
93
|
+
To suppress logs from Braintree on environments where they are considered noise
|
94
|
+
(e.g. test) use the following configuration:
|
95
|
+
|
96
|
+
logger = Logger.new("/dev/null")
|
97
|
+
logger.level = Logger::INFO
|
98
|
+
Braintree::Configuration.logger = logger
|
99
|
+
|
91
100
|
== License
|
92
101
|
|
93
102
|
See the LICENSE[https://github.com/braintree/braintree_ruby/blob/master/LICENSE] file for more info.
|
data/lib/braintree.rb
CHANGED
@@ -49,6 +49,7 @@ require "braintree/credit_card_verification_gateway"
|
|
49
49
|
require "braintree/credit_card_verification_search"
|
50
50
|
require "braintree/customer"
|
51
51
|
require "braintree/customer_gateway"
|
52
|
+
require "braintree/granted_payment_instrument_update"
|
52
53
|
require "braintree/customer_search"
|
53
54
|
require "braintree/descriptor"
|
54
55
|
require "braintree/digest"
|
@@ -201,7 +201,7 @@ module Braintree
|
|
201
201
|
def server # :nodoc:
|
202
202
|
case @environment
|
203
203
|
when :development, :integration
|
204
|
-
"localhost"
|
204
|
+
ENV['GATEWAY_HOST'] || "localhost"
|
205
205
|
when :production
|
206
206
|
"#{endpoint}.braintreegateway.com"
|
207
207
|
when :qa
|
@@ -260,7 +260,7 @@ module Braintree
|
|
260
260
|
|
261
261
|
def assert_has_access_token_or_keys
|
262
262
|
if (public_key.nil? || private_key.nil?) && access_token.nil?
|
263
|
-
raise ConfigurationError.new("Braintree::Gateway public_key and private_key are required.")
|
263
|
+
raise ConfigurationError.new("Braintree::Gateway access_token or public_key and private_key are required.")
|
264
264
|
end
|
265
265
|
end
|
266
266
|
|
@@ -74,6 +74,7 @@ module Braintree
|
|
74
74
|
def self._create_signature # :nodoc:
|
75
75
|
credit_card_signature = CreditCardGateway._create_signature - [:customer_id]
|
76
76
|
paypal_account_signature = PayPalAccountGateway._create_nested_signature
|
77
|
+
paypal_options_shipping_signature = AddressGateway._shared_signature
|
77
78
|
options = [
|
78
79
|
:paypal => [
|
79
80
|
:payee_email,
|
@@ -81,6 +82,7 @@ module Braintree
|
|
81
82
|
:custom_field,
|
82
83
|
:description,
|
83
84
|
:amount,
|
85
|
+
{:shipping => paypal_options_shipping_signature}
|
84
86
|
],
|
85
87
|
]
|
86
88
|
[
|
@@ -135,8 +137,16 @@ module Braintree
|
|
135
137
|
credit_card_signature = CreditCardGateway._update_signature - [:customer_id]
|
136
138
|
credit_card_options = credit_card_signature.find { |item| item.respond_to?(:keys) && item.keys == [:options] }
|
137
139
|
credit_card_options[:options] << :update_existing_token
|
140
|
+
paypal_options_shipping_signature = AddressGateway._shared_signature
|
138
141
|
options = [
|
139
|
-
:paypal => [
|
142
|
+
:paypal => [
|
143
|
+
:payee_email,
|
144
|
+
:order_id,
|
145
|
+
:custom_field,
|
146
|
+
:description,
|
147
|
+
:amount,
|
148
|
+
{:shipping => paypal_options_shipping_signature}
|
149
|
+
],
|
140
150
|
]
|
141
151
|
[
|
142
152
|
:company, :email, :fax, :first_name, :id, :last_name, :phone, :website,
|
@@ -305,6 +305,9 @@ module Braintree
|
|
305
305
|
CustomerDefaultPaymentMethodCardTypeIsNotAccepted = "81509"
|
306
306
|
CustomerDoesNotHaveCreditCard = "91511"
|
307
307
|
CustomerIdIsInvalid = "91510"
|
308
|
+
FailedAuthAdjustmentAllowRetry = "95603"
|
309
|
+
FailedAuthAdjustmentHardDecline = "95602"
|
310
|
+
FinalAuthSubmitForSettlementForDifferentAmount = "95601"
|
308
311
|
HasAlreadyBeenRefunded = "91512"
|
309
312
|
IdealPaymentNotComplete = "815141"
|
310
313
|
IdealPaymentsCannotBeVaulted = "915150"
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Braintree
|
2
|
+
class GrantedPaymentInstrumentUpdate
|
3
|
+
include BaseModule
|
4
|
+
|
5
|
+
attr_reader :grant_owner_merchant_id, :grant_recipient_merchant_id, :payment_method_nonce, :token, :updated_fields
|
6
|
+
|
7
|
+
def initialize(attributes)
|
8
|
+
set_instance_variables_from_hash(attributes)
|
9
|
+
@payment_method_nonce = attributes[:payment_method_nonce][:nonce]
|
10
|
+
end
|
11
|
+
|
12
|
+
class << self
|
13
|
+
protected :new
|
14
|
+
def _new(*args) # :nodoc:
|
15
|
+
self.new *args
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -72,6 +72,8 @@ module Braintree
|
|
72
72
|
ApplePayCard._new(@gateway, response[:apple_pay_card])
|
73
73
|
elsif response.has_key?(:android_pay_card)
|
74
74
|
AndroidPayCard._new(@gateway, response[:android_pay_card])
|
75
|
+
elsif response.has_key?(:venmo_account)
|
76
|
+
VenmoAccount._new(@gateway, response[:venmo_account])
|
75
77
|
else
|
76
78
|
UnknownPaymentMethod._new(@gateway, response)
|
77
79
|
end
|
@@ -148,6 +150,7 @@ module Braintree
|
|
148
150
|
|
149
151
|
def self._signature(type) # :nodoc:
|
150
152
|
billing_address_params = AddressGateway._shared_signature
|
153
|
+
paypal_options_shipping_signature = AddressGateway._shared_signature
|
151
154
|
options = [
|
152
155
|
:make_default, :verification_merchant_account_id, :verify_card, :venmo_sdk_session,
|
153
156
|
:verification_amount,
|
@@ -157,6 +160,7 @@ module Braintree
|
|
157
160
|
:custom_field,
|
158
161
|
:description,
|
159
162
|
:amount,
|
163
|
+
{:shipping => paypal_options_shipping_signature}
|
160
164
|
],
|
161
165
|
]
|
162
166
|
signature = [
|
@@ -171,6 +175,8 @@ module Braintree
|
|
171
175
|
when :create
|
172
176
|
options << :fail_on_duplicate_payment_method
|
173
177
|
signature << :customer_id
|
178
|
+
signature << :paypal_refresh_token
|
179
|
+
signature << :paypal_vault_without_upgrade
|
174
180
|
when :update
|
175
181
|
billing_address_params << {:options => [:update_existing]}
|
176
182
|
else
|
data/lib/braintree/risk_data.rb
CHANGED
@@ -2,14 +2,14 @@ module Braintree
|
|
2
2
|
class RiskData # :nodoc:
|
3
3
|
include BaseModule
|
4
4
|
|
5
|
-
attr_reader :id, :decision
|
5
|
+
attr_reader :id, :decision, :device_data_captured
|
6
6
|
|
7
7
|
def initialize(attributes)
|
8
8
|
set_instance_variables_from_hash attributes unless attributes.nil?
|
9
9
|
end
|
10
10
|
|
11
11
|
def inspect
|
12
|
-
attr_order = [:id, :decision]
|
12
|
+
attr_order = [:id, :decision, :device_data_captured]
|
13
13
|
formatted_attrs = attr_order.map do |attr|
|
14
14
|
"#{attr}: #{send(attr).inspect}"
|
15
15
|
end
|
@@ -34,6 +34,7 @@ module Braintree
|
|
34
34
|
attr_reader :number_of_billing_cycles, :billing_day_of_month
|
35
35
|
attr_reader :add_ons, :discounts
|
36
36
|
attr_reader :descriptor
|
37
|
+
attr_reader :description
|
37
38
|
attr_reader :current_billing_cycle
|
38
39
|
attr_reader :updated_at, :created_at
|
39
40
|
attr_reader :status_history
|
@@ -54,8 +55,8 @@ module Braintree
|
|
54
55
|
Configuration.gateway.subscription.find(id)
|
55
56
|
end
|
56
57
|
|
57
|
-
def self.retry_charge(subscription_id, amount=nil)
|
58
|
-
Configuration.gateway.transaction.retry_subscription_charge(subscription_id, amount)
|
58
|
+
def self.retry_charge(subscription_id, amount=nil, submit_for_settlement=false)
|
59
|
+
Configuration.gateway.transaction.retry_subscription_charge(subscription_id, amount, submit_for_settlement)
|
59
60
|
end
|
60
61
|
|
61
62
|
def self.search(&block)
|
@@ -67,7 +67,11 @@ module Braintree
|
|
67
67
|
:trial_duration,
|
68
68
|
:trial_duration_unit,
|
69
69
|
:trial_period,
|
70
|
-
{:options => [
|
70
|
+
{:options => [
|
71
|
+
:do_not_inherit_add_ons_or_discounts,
|
72
|
+
:start_immediately,
|
73
|
+
{:paypal => [:description]},
|
74
|
+
]},
|
71
75
|
{:descriptor => [:name, :phone, :url]}
|
72
76
|
] + _add_on_discount_signature
|
73
77
|
end
|
@@ -85,7 +89,8 @@ module Braintree
|
|
85
89
|
{:options => [
|
86
90
|
:prorate_charges,
|
87
91
|
:replace_all_add_ons_and_discounts,
|
88
|
-
:revert_subscription_on_proration_failure
|
92
|
+
:revert_subscription_on_proration_failure,
|
93
|
+
{:paypal => [:description]},
|
89
94
|
]},
|
90
95
|
{:descriptor => [:name, :phone, :url]}
|
91
96
|
] + _add_on_discount_signature
|
@@ -73,11 +73,14 @@ module Braintree
|
|
73
73
|
_handle_transaction_response(response)
|
74
74
|
end
|
75
75
|
|
76
|
-
def retry_subscription_charge(subscription_id, amount=nil)
|
76
|
+
def retry_subscription_charge(subscription_id, amount=nil, submit_for_settlement=false)
|
77
77
|
attributes = {
|
78
78
|
:amount => amount,
|
79
79
|
:subscription_id => subscription_id,
|
80
|
-
:type => Transaction::Type::Sale
|
80
|
+
:type => Transaction::Type::Sale,
|
81
|
+
:options => {
|
82
|
+
:submit_for_settlement => submit_for_settlement
|
83
|
+
}
|
81
84
|
}
|
82
85
|
_do_create "/transactions", :transaction => attributes
|
83
86
|
end
|
@@ -144,7 +147,7 @@ module Braintree
|
|
144
147
|
:purchase_order_number, :recurring, :transaction_source, :shipping_address_id, :type, :tax_amount, :tax_exempt,
|
145
148
|
:venmo_sdk_payment_method_code, :device_session_id, :service_fee_amount, :device_data, :fraud_merchant_id,
|
146
149
|
:billing_address_id, :payment_method_nonce, :three_d_secure_token,
|
147
|
-
:shared_payment_method_token, :shared_billing_address_id, :shared_customer_id, :shared_shipping_address_id,
|
150
|
+
:shared_payment_method_token, :shared_billing_address_id, :shared_customer_id, :shared_shipping_address_id, :shared_payment_method_nonce,
|
148
151
|
{:risk_data => [:customer_browser, :customer_ip]},
|
149
152
|
{:credit_card => [:token, :cardholder_name, :cvv, :expiration_date, :expiration_month, :expiration_year, :number]},
|
150
153
|
{:customer => [:id, :company, :email, :fax, :first_name, :last_name, :phone, :website]},
|
data/lib/braintree/version.rb
CHANGED
@@ -38,6 +38,8 @@ module Braintree
|
|
38
38
|
|
39
39
|
ConnectedMerchantStatusTransitioned = "connected_merchant_status_transitioned"
|
40
40
|
ConnectedMerchantPayPalStatusChanged = "connected_merchant_paypal_status_changed"
|
41
|
+
|
42
|
+
GrantedPaymentInstrumentUpdate = "granted_payment_instrument_update"
|
41
43
|
end
|
42
44
|
|
43
45
|
attr_reader :subscription
|
@@ -51,6 +53,7 @@ module Braintree
|
|
51
53
|
attr_reader :ideal_payment
|
52
54
|
attr_reader :connected_merchant_status_transitioned
|
53
55
|
attr_reader :connected_merchant_paypal_status_changed
|
56
|
+
attr_reader :granted_payment_instrument_update
|
54
57
|
|
55
58
|
def self.parse(signature, payload)
|
56
59
|
Configuration.gateway.webhook_notification.parse(signature, payload)
|
@@ -74,6 +77,7 @@ module Braintree
|
|
74
77
|
@ideal_payment = Braintree::IdealPayment._new(gateway, @subject[:ideal_payment]) if @subject.has_key?(:ideal_payment)
|
75
78
|
@connected_merchant_status_transitioned = ConnectedMerchantStatusTransitioned._new(@subject[:connected_merchant_status_transitioned]) if @subject.has_key?(:connected_merchant_status_transitioned)
|
76
79
|
@connected_merchant_paypal_status_changed = ConnectedMerchantPayPalStatusChanged._new(@subject[:connected_merchant_paypal_status_changed]) if @subject.has_key?(:connected_merchant_paypal_status_changed)
|
80
|
+
@granted_payment_instrument_update = GrantedPaymentInstrumentUpdate._new(@subject[:granted_payment_instrument_update]) if @subject.has_key?(:granted_payment_instrument_update)
|
77
81
|
end
|
78
82
|
|
79
83
|
def merchant_account
|
@@ -67,6 +67,8 @@ module Braintree
|
|
67
67
|
_ideal_payment_complete_sample_xml(id)
|
68
68
|
when Braintree::WebhookNotification::Kind::IdealPaymentFailed
|
69
69
|
_ideal_payment_failed_sample_xml(id)
|
70
|
+
when Braintree::WebhookNotification::Kind::GrantedPaymentInstrumentUpdate
|
71
|
+
_granted_payment_instrument_update_sample_xml(id)
|
70
72
|
else
|
71
73
|
_subscription_sample_xml(id)
|
72
74
|
end
|
@@ -603,5 +605,25 @@ module Braintree
|
|
603
605
|
</ideal-payment>
|
604
606
|
XML
|
605
607
|
end
|
608
|
+
|
609
|
+
def _granted_payment_instrument_update_sample_xml(id)
|
610
|
+
|
611
|
+
<<-XML
|
612
|
+
<granted-payment-instrument-update>
|
613
|
+
<grant-owner-merchant-id>vczo7jqrpwrsi2px</grant-owner-merchant-id>
|
614
|
+
<grant-recipient-merchant-id>cf0i8wgarszuy6hc</grant-recipient-merchant-id>
|
615
|
+
<payment-method-nonce>
|
616
|
+
<nonce>ee257d98-de40-47e8-96b3-a6954ea7a9a4</nonce>
|
617
|
+
<consumed type="boolean">false</consumed>
|
618
|
+
<locked type="boolean">false</locked>
|
619
|
+
</payment-method-nonce>
|
620
|
+
<token>abc123z</token>
|
621
|
+
<updated-fields type="array">
|
622
|
+
<item>expiration-month</item>
|
623
|
+
<item>expiration-year</item>
|
624
|
+
</updated-fields>
|
625
|
+
</granted-payment-instrument-update>
|
626
|
+
XML
|
627
|
+
end
|
606
628
|
end
|
607
629
|
end
|
@@ -40,7 +40,7 @@ describe Braintree::AddOn do
|
|
40
40
|
|
41
41
|
expect do
|
42
42
|
gateway.add_on.all
|
43
|
-
end.to raise_error(Braintree::ConfigurationError, /public_key and private_key are required/)
|
43
|
+
end.to raise_error(Braintree::ConfigurationError, /access_token or public_key and private_key are required/)
|
44
44
|
end
|
45
45
|
end
|
46
46
|
end
|
@@ -150,6 +150,7 @@ describe Braintree::CreditCard do
|
|
150
150
|
verification = credit_card.verification
|
151
151
|
verification.risk_data.should respond_to(:id)
|
152
152
|
verification.risk_data.should respond_to(:decision)
|
153
|
+
verification.risk_data.should respond_to(:device_data_captured)
|
153
154
|
end
|
154
155
|
|
155
156
|
it "exposes the gateway rejection reason on verification" do
|
@@ -1493,6 +1493,15 @@ describe Braintree::Customer do
|
|
1493
1493
|
:custom_field => "custom merchant field",
|
1494
1494
|
:description => "merchant description",
|
1495
1495
|
:amount => "1.23",
|
1496
|
+
:shipping => {
|
1497
|
+
:first_name => "first",
|
1498
|
+
:last_name => "last",
|
1499
|
+
:locality => "Austin",
|
1500
|
+
:postal_code => "78729",
|
1501
|
+
:street_address => "7700 W Parmer Ln",
|
1502
|
+
:country_name => "US",
|
1503
|
+
:region => "TX",
|
1504
|
+
},
|
1496
1505
|
},
|
1497
1506
|
},
|
1498
1507
|
)
|
@@ -1530,6 +1539,15 @@ describe Braintree::Customer do
|
|
1530
1539
|
:custom_field => "custom merchant field",
|
1531
1540
|
:description => "merchant description",
|
1532
1541
|
:amount => "1.23",
|
1542
|
+
:shipping => {
|
1543
|
+
:first_name => "first",
|
1544
|
+
:last_name => "last",
|
1545
|
+
:locality => "Austin",
|
1546
|
+
:postal_code => "78729",
|
1547
|
+
:street_address => "7700 W Parmer Ln",
|
1548
|
+
:country_name => "US",
|
1549
|
+
:region => "TX",
|
1550
|
+
},
|
1533
1551
|
},
|
1534
1552
|
},
|
1535
1553
|
)
|
@@ -113,6 +113,33 @@ describe Braintree::MerchantAccount do
|
|
113
113
|
result.merchant_accounts.first.status.should == "active"
|
114
114
|
result.merchant_accounts.first.default.should == true
|
115
115
|
end
|
116
|
+
|
117
|
+
it "returns all merchant accounts for read_only scoped grants" do
|
118
|
+
gateway = Braintree::Gateway.new(
|
119
|
+
:client_id => "client_id$#{Braintree::Configuration.environment}$integration_client_id",
|
120
|
+
:client_secret => "client_secret$#{Braintree::Configuration.environment}$integration_client_secret",
|
121
|
+
:logger => Logger.new("/dev/null")
|
122
|
+
)
|
123
|
+
|
124
|
+
code = Braintree::OAuthTestHelper.create_grant(gateway, {
|
125
|
+
:merchant_public_id => "integration_merchant_id",
|
126
|
+
:scope => "read_only"
|
127
|
+
})
|
128
|
+
|
129
|
+
result = gateway.oauth.create_token_from_code(
|
130
|
+
:code => code,
|
131
|
+
:scope => "read_only"
|
132
|
+
)
|
133
|
+
|
134
|
+
gateway = Braintree::Gateway.new(
|
135
|
+
:access_token => result.credentials.access_token,
|
136
|
+
:logger => Logger.new("/dev/null")
|
137
|
+
)
|
138
|
+
|
139
|
+
result = gateway.merchant_account.all
|
140
|
+
result.should be_success
|
141
|
+
result.merchant_accounts.count.should > 20
|
142
|
+
end
|
116
143
|
end
|
117
144
|
|
118
145
|
describe "create" do
|
@@ -113,6 +113,7 @@ describe "OAuth" do
|
|
113
113
|
:scope => "read_write",
|
114
114
|
:state => "baz_state",
|
115
115
|
:landing_page => "signup",
|
116
|
+
:login_only => false,
|
116
117
|
:user => {
|
117
118
|
:country => "USA",
|
118
119
|
:email => "foo@example.com",
|
@@ -159,6 +160,7 @@ describe "OAuth" do
|
|
159
160
|
query["scope"].should == ["read_write"]
|
160
161
|
query["state"].should == ["baz_state"]
|
161
162
|
query["landing_page"].should == ["signup"]
|
163
|
+
query["login_only"].should == ["false"]
|
162
164
|
|
163
165
|
query["user[country]"].should == ["USA"]
|
164
166
|
query["business[name]"].should == ["14 Ladders"]
|
@@ -85,6 +85,7 @@ describe Braintree::PaymentMethod do
|
|
85
85
|
apple_pay_card = result.payment_method
|
86
86
|
apple_pay_card.should be_a(Braintree::ApplePayCard)
|
87
87
|
apple_pay_card.should_not be_nil
|
88
|
+
apple_pay_card.bin.should_not be_nil
|
88
89
|
apple_pay_card.token.should == token
|
89
90
|
apple_pay_card.card_type.should == Braintree::ApplePayCard::CardType::AmEx
|
90
91
|
apple_pay_card.payment_instrument_name.should == "AmEx 41002"
|
@@ -552,6 +553,15 @@ describe Braintree::PaymentMethod do
|
|
552
553
|
:custom_field => "custom merchant field",
|
553
554
|
:description => "merchant description",
|
554
555
|
:amount => "1.23",
|
556
|
+
:shipping => {
|
557
|
+
:first_name => "first",
|
558
|
+
:last_name => "last",
|
559
|
+
:locality => "Austin",
|
560
|
+
:postal_code => "78729",
|
561
|
+
:street_address => "7700 W Parmer Ln",
|
562
|
+
:country_name => "US",
|
563
|
+
:region => "TX",
|
564
|
+
},
|
555
565
|
},
|
556
566
|
},
|
557
567
|
)
|
@@ -565,6 +575,41 @@ describe Braintree::PaymentMethod do
|
|
565
575
|
found_paypal_account.should_not be_nil
|
566
576
|
end
|
567
577
|
|
578
|
+
it "creates a billing agreement payment method from a refresh token" do
|
579
|
+
customer = Braintree::Customer.create.customer
|
580
|
+
result = Braintree::PaymentMethod.create(
|
581
|
+
:customer_id => customer.id,
|
582
|
+
:paypal_refresh_token => "some_future_payment_token",
|
583
|
+
)
|
584
|
+
|
585
|
+
result.should be_success
|
586
|
+
result.payment_method.should be_a(Braintree::PayPalAccount)
|
587
|
+
result.payment_method.billing_agreement_id.should eq("B_FAKE_ID")
|
588
|
+
token = result.payment_method.token
|
589
|
+
|
590
|
+
found_paypal_account = Braintree::PayPalAccount.find(token)
|
591
|
+
found_paypal_account.should_not be_nil
|
592
|
+
found_paypal_account.billing_agreement_id.should eq("B_FAKE_ID")
|
593
|
+
end
|
594
|
+
|
595
|
+
it "creates a billing agreement payment method from a refresh token without upgrading" do
|
596
|
+
customer = Braintree::Customer.create.customer
|
597
|
+
result = Braintree::PaymentMethod.create(
|
598
|
+
:customer_id => customer.id,
|
599
|
+
:paypal_refresh_token => "some_future_payment_token",
|
600
|
+
:paypal_vault_without_upgrade => true,
|
601
|
+
)
|
602
|
+
|
603
|
+
result.should be_success
|
604
|
+
result.payment_method.should be_a(Braintree::PayPalAccount)
|
605
|
+
result.payment_method.billing_agreement_id.should be_nil
|
606
|
+
token = result.payment_method.token
|
607
|
+
|
608
|
+
found_paypal_account = Braintree::PayPalAccount.find(token)
|
609
|
+
found_paypal_account.should_not be_nil
|
610
|
+
found_paypal_account.billing_agreement_id.should be_nil
|
611
|
+
end
|
612
|
+
|
568
613
|
it "does not create a payment method from an unvalidated onetime paypal account nonce" do
|
569
614
|
customer = Braintree::Customer.create.customer
|
570
615
|
nonce = nonce_for_paypal_account(:access_token => "PAYPAL_ACCESS_TOKEN")
|
@@ -792,6 +837,30 @@ describe Braintree::PaymentMethod do
|
|
792
837
|
end
|
793
838
|
end
|
794
839
|
|
840
|
+
context "venmo accounts" do
|
841
|
+
it "finds the payment method with the given token" do
|
842
|
+
customer = Braintree::Customer.create!
|
843
|
+
payment_method_token = "PAYMENT_METHOD_TOKEN_#{rand(36**3).to_s(36)}"
|
844
|
+
result = Braintree::PaymentMethod.create(
|
845
|
+
:payment_method_nonce => Braintree::Test::Nonce::VenmoAccount,
|
846
|
+
:customer_id => customer.id,
|
847
|
+
:token => payment_method_token
|
848
|
+
)
|
849
|
+
result.should be_success
|
850
|
+
|
851
|
+
venmo_account = Braintree::PaymentMethod.find(payment_method_token)
|
852
|
+
venmo_account.should be_a(Braintree::VenmoAccount)
|
853
|
+
venmo_account.should_not be_nil
|
854
|
+
venmo_account.token.should == payment_method_token
|
855
|
+
venmo_account.default.should == true
|
856
|
+
venmo_account.image_url.should =~ /venmo/
|
857
|
+
venmo_account.username.should == 'venmojoe'
|
858
|
+
venmo_account.venmo_user_id.should == 'Venmo-Joe-1'
|
859
|
+
venmo_account.source_description.should == "Venmo Account: venmojoe"
|
860
|
+
venmo_account.customer_id.should == customer.id
|
861
|
+
end
|
862
|
+
end
|
863
|
+
|
795
864
|
context "android pay cards" do
|
796
865
|
it "finds the proxy card payment method with the given token" do
|
797
866
|
customer = Braintree::Customer.create!
|
@@ -113,6 +113,31 @@ describe Braintree::Subscription do
|
|
113
113
|
transaction.paypal_details.payer_email.should == "payer@example.com"
|
114
114
|
end
|
115
115
|
|
116
|
+
it "creates a subscription when given a paypal description" do
|
117
|
+
customer = Braintree::Customer.create!
|
118
|
+
payment_method_result = Braintree::PaymentMethod.create(
|
119
|
+
:payment_method_nonce => Braintree::Test::Nonce::PayPalFuturePayment,
|
120
|
+
:customer_id => customer.id
|
121
|
+
)
|
122
|
+
|
123
|
+
result = Braintree::Subscription.create(
|
124
|
+
:payment_method_token => payment_method_result.payment_method.token,
|
125
|
+
:plan_id => SpecHelper::TriallessPlan[:id],
|
126
|
+
:options => {
|
127
|
+
:paypal => {
|
128
|
+
:description => "A great product",
|
129
|
+
},
|
130
|
+
},
|
131
|
+
)
|
132
|
+
|
133
|
+
result.should be_success
|
134
|
+
subscription = result.subscription
|
135
|
+
subscription.description.should == "A great product"
|
136
|
+
transaction = subscription.transactions[0]
|
137
|
+
transaction.paypal_details.payer_email.should == "payer@example.com"
|
138
|
+
transaction.paypal_details.description.should == "A great product"
|
139
|
+
end
|
140
|
+
|
116
141
|
it "returns an error if the payment_method_nonce hasn't been vaulted" do
|
117
142
|
customer = Braintree::Customer.create!
|
118
143
|
result = Braintree::Subscription.create(
|
@@ -747,7 +772,7 @@ describe Braintree::Subscription do
|
|
747
772
|
result.subscription.payment_method_token.should_not == @credit_card.token
|
748
773
|
end
|
749
774
|
|
750
|
-
it "allows
|
775
|
+
it "allows changing the descriptors" do
|
751
776
|
result = Braintree::Subscription.update(@subscription.id,
|
752
777
|
:descriptor => {
|
753
778
|
:name => 'aaa*1234',
|
@@ -762,6 +787,31 @@ describe Braintree::Subscription do
|
|
762
787
|
result.subscription.descriptor.url.should == 'ebay.com'
|
763
788
|
end
|
764
789
|
|
790
|
+
it "allows changing the paypal description" do
|
791
|
+
customer = Braintree::Customer.create!
|
792
|
+
payment_method = Braintree::PaymentMethod.create(
|
793
|
+
:payment_method_nonce => Braintree::Test::Nonce::PayPalFuturePayment,
|
794
|
+
:customer_id => customer.id
|
795
|
+
).payment_method
|
796
|
+
|
797
|
+
subscription = Braintree::Subscription.create(
|
798
|
+
:payment_method_token => payment_method.token,
|
799
|
+
:plan_id => SpecHelper::TriallessPlan[:id]
|
800
|
+
).subscription
|
801
|
+
|
802
|
+
result = Braintree::Subscription.update(
|
803
|
+
subscription.id,
|
804
|
+
:options => {
|
805
|
+
:paypal => {
|
806
|
+
:description => 'A great product',
|
807
|
+
},
|
808
|
+
},
|
809
|
+
)
|
810
|
+
|
811
|
+
result.success?.should == true
|
812
|
+
result.subscription.description.should == 'A great product'
|
813
|
+
end
|
814
|
+
|
765
815
|
context "when successful" do
|
766
816
|
it "returns a success response with the updated subscription if valid" do
|
767
817
|
new_id = rand(36**9).to_s(36)
|
@@ -1653,5 +1703,41 @@ describe Braintree::Subscription do
|
|
1653
1703
|
transaction.type.should == Braintree::Transaction::Type::Sale
|
1654
1704
|
transaction.status.should == Braintree::Transaction::Status::Authorized
|
1655
1705
|
end
|
1706
|
+
|
1707
|
+
it "is successful with subscription id and submit_for_settlement" do
|
1708
|
+
subscription = Braintree::Subscription.create(
|
1709
|
+
:payment_method_token => @credit_card.token,
|
1710
|
+
:plan_id => SpecHelper::TriallessPlan[:id]
|
1711
|
+
).subscription
|
1712
|
+
SpecHelper.make_past_due(subscription)
|
1713
|
+
|
1714
|
+
result = Braintree::Subscription.retry_charge(subscription.id, Braintree::Test::TransactionAmounts::Authorize, true)
|
1715
|
+
|
1716
|
+
result.success?.should == true
|
1717
|
+
transaction = result.transaction
|
1718
|
+
|
1719
|
+
transaction.amount.should == BigDecimal.new(Braintree::Test::TransactionAmounts::Authorize)
|
1720
|
+
transaction.processor_authorization_code.should_not be_nil
|
1721
|
+
transaction.type.should == Braintree::Transaction::Type::Sale
|
1722
|
+
transaction.status.should == Braintree::Transaction::Status::SubmittedForSettlement
|
1723
|
+
end
|
1724
|
+
|
1725
|
+
it "is successful with subscription id, amount and submit_for_settlement" do
|
1726
|
+
subscription = Braintree::Subscription.create(
|
1727
|
+
:payment_method_token => @credit_card.token,
|
1728
|
+
:plan_id => SpecHelper::TriallessPlan[:id]
|
1729
|
+
).subscription
|
1730
|
+
SpecHelper.make_past_due(subscription)
|
1731
|
+
|
1732
|
+
result = Braintree::Subscription.retry_charge(subscription.id, Braintree::Test::TransactionAmounts::Authorize, true)
|
1733
|
+
|
1734
|
+
result.success?.should == true
|
1735
|
+
transaction = result.transaction
|
1736
|
+
|
1737
|
+
transaction.amount.should == BigDecimal.new(Braintree::Test::TransactionAmounts::Authorize)
|
1738
|
+
transaction.processor_authorization_code.should_not be_nil
|
1739
|
+
transaction.type.should == Braintree::Transaction::Type::Sale
|
1740
|
+
transaction.status.should == Braintree::Transaction::Status::SubmittedForSettlement
|
1741
|
+
end
|
1656
1742
|
end
|
1657
1743
|
end
|
@@ -6,13 +6,13 @@ describe Braintree::TestTransaction do
|
|
6
6
|
it "changes transaction status to settled" do
|
7
7
|
sale_result = Braintree::Transaction.sale(
|
8
8
|
:amount => "100",
|
9
|
-
:payment_method_nonce => Braintree::Test::Nonce::
|
9
|
+
:payment_method_nonce => Braintree::Test::Nonce::VisaCheckoutVisa,
|
10
10
|
:options => {
|
11
11
|
:submit_for_settlement => true
|
12
12
|
}
|
13
13
|
)
|
14
14
|
sale_result.success?.should == true
|
15
|
-
sale_result.transaction.status.should == Braintree::Transaction::Status::
|
15
|
+
sale_result.transaction.status.should == Braintree::Transaction::Status::SubmittedForSettlement
|
16
16
|
|
17
17
|
settle_result = Braintree::TestTransaction.settle(sale_result.transaction.id)
|
18
18
|
settle_result.transaction.status.should == Braintree::Transaction::Status::Settled
|
@@ -22,13 +22,13 @@ describe Braintree::TestTransaction do
|
|
22
22
|
it "changes transaction status to settlement_confirmed" do
|
23
23
|
sale_result = Braintree::Transaction.sale(
|
24
24
|
:amount => "100",
|
25
|
-
:payment_method_nonce => Braintree::Test::Nonce::
|
25
|
+
:payment_method_nonce => Braintree::Test::Nonce::VisaCheckoutVisa,
|
26
26
|
:options => {
|
27
27
|
:submit_for_settlement => true
|
28
28
|
}
|
29
29
|
)
|
30
30
|
sale_result.success?.should == true
|
31
|
-
sale_result.transaction.status.should == Braintree::Transaction::Status::
|
31
|
+
sale_result.transaction.status.should == Braintree::Transaction::Status::SubmittedForSettlement
|
32
32
|
|
33
33
|
settle_result = Braintree::TestTransaction.settlement_confirm(sale_result.transaction.id)
|
34
34
|
settle_result.transaction.status.should == Braintree::Transaction::Status::SettlementConfirmed
|
@@ -38,13 +38,13 @@ describe Braintree::TestTransaction do
|
|
38
38
|
it "changes transaction status to settlement_declined" do
|
39
39
|
sale_result = Braintree::Transaction.sale(
|
40
40
|
:amount => "100",
|
41
|
-
:payment_method_nonce => Braintree::Test::Nonce::
|
41
|
+
:payment_method_nonce => Braintree::Test::Nonce::VisaCheckoutVisa,
|
42
42
|
:options => {
|
43
43
|
:submit_for_settlement => true
|
44
44
|
}
|
45
45
|
)
|
46
46
|
sale_result.success?.should == true
|
47
|
-
sale_result.transaction.status.should == Braintree::Transaction::Status::
|
47
|
+
sale_result.transaction.status.should == Braintree::Transaction::Status::SubmittedForSettlement
|
48
48
|
|
49
49
|
settle_result = Braintree::TestTransaction.settlement_decline(sale_result.transaction.id)
|
50
50
|
settle_result.transaction.status.should == Braintree::Transaction::Status::SettlementDeclined
|
@@ -54,13 +54,13 @@ describe Braintree::TestTransaction do
|
|
54
54
|
it "changes transaction status to settlement_pending" do
|
55
55
|
sale_result = Braintree::Transaction.sale(
|
56
56
|
:amount => "100",
|
57
|
-
:payment_method_nonce => Braintree::Test::Nonce::
|
57
|
+
:payment_method_nonce => Braintree::Test::Nonce::VisaCheckoutVisa,
|
58
58
|
:options => {
|
59
59
|
:submit_for_settlement => true
|
60
60
|
}
|
61
61
|
)
|
62
62
|
sale_result.success?.should == true
|
63
|
-
sale_result.transaction.status.should == Braintree::Transaction::Status::
|
63
|
+
sale_result.transaction.status.should == Braintree::Transaction::Status::SubmittedForSettlement
|
64
64
|
|
65
65
|
settle_result = Braintree::TestTransaction.settlement_pending(sale_result.transaction.id)
|
66
66
|
settle_result.transaction.status.should == Braintree::Transaction::Status::SettlementPending
|
@@ -70,7 +70,7 @@ describe Braintree::TestTransaction do
|
|
70
70
|
it "returns a validation error when invalid transition is specified" do
|
71
71
|
sale_result = Braintree::Transaction.sale(
|
72
72
|
:amount => "100",
|
73
|
-
:payment_method_nonce => Braintree::Test::Nonce::
|
73
|
+
:payment_method_nonce => Braintree::Test::Nonce::VisaCheckoutVisa
|
74
74
|
)
|
75
75
|
sale_result.success?.should == true
|
76
76
|
|
@@ -110,7 +110,7 @@ describe Braintree::TestTransaction do
|
|
110
110
|
|
111
111
|
sale_result = transaction_gateway.sale(
|
112
112
|
:amount => "100",
|
113
|
-
:payment_method_nonce => Braintree::Test::Nonce::
|
113
|
+
:payment_method_nonce => Braintree::Test::Nonce::VisaCheckoutVisa
|
114
114
|
)
|
115
115
|
testing_gateway.settle(sale_result.transaction.id)
|
116
116
|
end
|
@@ -123,7 +123,7 @@ describe Braintree::Transaction do
|
|
123
123
|
|
124
124
|
describe "self.create" do
|
125
125
|
describe "risk data" do
|
126
|
-
it "returns decision and id" do
|
126
|
+
it "returns decision, device_data_captured and id" do
|
127
127
|
result = Braintree::Transaction.create(
|
128
128
|
:type => "sale",
|
129
129
|
:amount => 1_00,
|
@@ -135,6 +135,7 @@ describe Braintree::Transaction do
|
|
135
135
|
result.transaction.risk_data.should be_a(Braintree::RiskData)
|
136
136
|
result.transaction.risk_data.should respond_to(:id)
|
137
137
|
result.transaction.risk_data.should respond_to(:decision)
|
138
|
+
result.transaction.risk_data.should respond_to(:device_data_captured)
|
138
139
|
end
|
139
140
|
end
|
140
141
|
|
@@ -1943,7 +1944,7 @@ describe Braintree::Transaction do
|
|
1943
1944
|
}
|
1944
1945
|
)
|
1945
1946
|
result.success?.should == true
|
1946
|
-
result.transaction.status.should == Braintree::Transaction::Status::
|
1947
|
+
result.transaction.status.should == Braintree::Transaction::Status::Settled
|
1947
1948
|
end
|
1948
1949
|
end
|
1949
1950
|
|
@@ -4622,50 +4623,18 @@ describe Braintree::Transaction do
|
|
4622
4623
|
result.errors.for(:transaction).for(:paypal_account).first.code.should == Braintree::ErrorCodes::PayPalAccount::IncompletePayPalAccount
|
4623
4624
|
end
|
4624
4625
|
end
|
4625
|
-
|
4626
|
-
context "inline capture" do
|
4627
|
-
it "includes processor_settlement_response_code and processor_settlement_response_text for settlement declined transactions" do
|
4628
|
-
result = Braintree::Transaction.sale(
|
4629
|
-
:amount => "100",
|
4630
|
-
:payment_method_nonce => Braintree::Test::Nonce::PayPalFuturePayment,
|
4631
|
-
:options => { :submit_for_settlement => true }
|
4632
|
-
)
|
4633
|
-
|
4634
|
-
result.should be_success
|
4635
|
-
Braintree::Configuration.gateway.testing.settlement_decline(result.transaction.id)
|
4636
|
-
|
4637
|
-
settlement_declined_transaction = Braintree::Transaction.find(result.transaction.id)
|
4638
|
-
settlement_declined_transaction.processor_settlement_response_code.should == "4001"
|
4639
|
-
settlement_declined_transaction.processor_settlement_response_text.should == "Settlement Declined"
|
4640
|
-
end
|
4641
|
-
|
4642
|
-
it "includes processor_settlement_response_code and processor_settlement_response_text for settlement pending transactions" do
|
4643
|
-
result = Braintree::Transaction.sale(
|
4644
|
-
:amount => "100",
|
4645
|
-
:payment_method_nonce => Braintree::Test::Nonce::PayPalFuturePayment,
|
4646
|
-
:options => { :submit_for_settlement => true }
|
4647
|
-
)
|
4648
|
-
|
4649
|
-
result.should be_success
|
4650
|
-
Braintree::Configuration.gateway.testing.settlement_pending(result.transaction.id)
|
4651
|
-
|
4652
|
-
settlement_declined_transaction = Braintree::Transaction.find(result.transaction.id)
|
4653
|
-
settlement_declined_transaction.processor_settlement_response_code.should == "4002"
|
4654
|
-
settlement_declined_transaction.processor_settlement_response_text.should == "Settlement Pending"
|
4655
|
-
end
|
4656
|
-
end
|
4657
4626
|
end
|
4658
4627
|
|
4659
4628
|
context "shared payment method" do
|
4660
4629
|
before(:each) do
|
4661
|
-
partner_merchant_gateway = Braintree::Gateway.new(
|
4630
|
+
@partner_merchant_gateway = Braintree::Gateway.new(
|
4662
4631
|
:merchant_id => "integration_merchant_public_id",
|
4663
4632
|
:public_key => "oauth_app_partner_user_public_key",
|
4664
4633
|
:private_key => "oauth_app_partner_user_private_key",
|
4665
4634
|
:environment => Braintree::Configuration.environment,
|
4666
4635
|
:logger => Logger.new("/dev/null")
|
4667
4636
|
)
|
4668
|
-
@customer = partner_merchant_gateway.customer.create(
|
4637
|
+
@customer = @partner_merchant_gateway.customer.create(
|
4669
4638
|
:first_name => "Joe",
|
4670
4639
|
:last_name => "Brown",
|
4671
4640
|
:company => "ExampleCo",
|
@@ -4674,12 +4643,12 @@ describe Braintree::Transaction do
|
|
4674
4643
|
:fax => "614.555.5678",
|
4675
4644
|
:website => "www.example.com"
|
4676
4645
|
).customer
|
4677
|
-
@address = partner_merchant_gateway.address.create(
|
4646
|
+
@address = @partner_merchant_gateway.address.create(
|
4678
4647
|
:customer_id => @customer.id,
|
4679
4648
|
:first_name => "Testy",
|
4680
4649
|
:last_name => "McTesterson"
|
4681
4650
|
).address
|
4682
|
-
@credit_card = partner_merchant_gateway.credit_card.create(
|
4651
|
+
@credit_card = @partner_merchant_gateway.credit_card.create(
|
4683
4652
|
:customer_id => @customer.id,
|
4684
4653
|
:cardholder_name => "Adam Davis",
|
4685
4654
|
:number => Braintree::Test::CreditCardNumbers::Visa,
|
@@ -4705,6 +4674,7 @@ describe Braintree::Transaction do
|
|
4705
4674
|
:access_token => access_token,
|
4706
4675
|
:logger => Logger.new("/dev/null")
|
4707
4676
|
)
|
4677
|
+
|
4708
4678
|
end
|
4709
4679
|
|
4710
4680
|
it "oauth app details are returned on transaction created via nonce granting" do
|
@@ -4759,5 +4729,22 @@ describe Braintree::Transaction do
|
|
4759
4729
|
result.transaction.facilitator_details.oauth_application_client_id.should == "client_id$#{Braintree::Configuration.environment}$integration_client_id"
|
4760
4730
|
result.transaction.facilitator_details.oauth_application_name.should == "PseudoShop"
|
4761
4731
|
end
|
4732
|
+
|
4733
|
+
it "facilitated details are returned on transaction created via a shared_payment_method_nonce" do
|
4734
|
+
shared_nonce = @partner_merchant_gateway.payment_method_nonce.create(
|
4735
|
+
@credit_card.token
|
4736
|
+
).payment_method_nonce.nonce
|
4737
|
+
|
4738
|
+
result = @granting_gateway.transaction.sale(
|
4739
|
+
:shared_payment_method_nonce => shared_nonce,
|
4740
|
+
:amount => Braintree::Test::TransactionAmounts::Authorize
|
4741
|
+
)
|
4742
|
+
result.transaction.facilitated_details.merchant_id.should == "integration_merchant_id"
|
4743
|
+
result.transaction.facilitated_details.merchant_name.should == "14ladders"
|
4744
|
+
result.transaction.facilitated_details.payment_method_nonce.should == nil
|
4745
|
+
result.transaction.facilitator_details.should_not == nil
|
4746
|
+
result.transaction.facilitator_details.oauth_application_client_id.should == "client_id$#{Braintree::Configuration.environment}$integration_client_id"
|
4747
|
+
result.transaction.facilitator_details.oauth_application_name.should == "PseudoShop"
|
4748
|
+
end
|
4762
4749
|
end
|
4763
4750
|
end
|
@@ -307,9 +307,18 @@ describe Braintree::Configuration do
|
|
307
307
|
end
|
308
308
|
|
309
309
|
describe "server" do
|
310
|
-
it "is localhost for development" do
|
310
|
+
it "is localhost or GATEWAY_HOST environment variable for development" do
|
311
311
|
Braintree::Configuration.environment = :development
|
312
|
-
|
312
|
+
old_gateway_url = ENV['GATEWAY_HOST']
|
313
|
+
begin
|
314
|
+
ENV['GATEWAY_HOST'] = nil
|
315
|
+
Braintree::Configuration.instantiate.server.should == "localhost"
|
316
|
+
|
317
|
+
ENV['GATEWAY_HOST'] = 'gateway'
|
318
|
+
Braintree::Configuration.instantiate.server.should == 'gateway'
|
319
|
+
ensure
|
320
|
+
ENV['GATEWAY_HOST'] = old_gateway_url
|
321
|
+
end
|
313
322
|
end
|
314
323
|
|
315
324
|
it "is api.braintreegateway.com for production" do
|
@@ -105,9 +105,15 @@ describe Braintree::CreditCardVerification do
|
|
105
105
|
|
106
106
|
describe "risk_data" do
|
107
107
|
it "initializes a RiskData object" do
|
108
|
-
verification = Braintree::CreditCardVerification._new(:risk_data => {
|
108
|
+
verification = Braintree::CreditCardVerification._new(:risk_data => {
|
109
|
+
:id => "123",
|
110
|
+
:decision => "WOO YOU WON $1000 dollars",
|
111
|
+
:device_data_captured => true
|
112
|
+
})
|
113
|
+
|
109
114
|
verification.risk_data.id.should == "123"
|
110
115
|
verification.risk_data.decision.should == "WOO YOU WON $1000 dollars"
|
116
|
+
verification.risk_data.device_data_captured.should == true
|
111
117
|
end
|
112
118
|
|
113
119
|
it "handles a nil risk_data" do
|
@@ -123,7 +123,29 @@ describe Braintree::Customer do
|
|
123
123
|
:billing_agreement_id,
|
124
124
|
{:options => [:make_default]},
|
125
125
|
]},
|
126
|
-
{:options =>
|
126
|
+
{:options =>
|
127
|
+
[:paypal => [
|
128
|
+
:payee_email,
|
129
|
+
:order_id,
|
130
|
+
:custom_field,
|
131
|
+
:description,
|
132
|
+
:amount,
|
133
|
+
{:shipping => [
|
134
|
+
:company,
|
135
|
+
:country_code_alpha2,
|
136
|
+
:country_code_alpha3,
|
137
|
+
:country_code_numeric,
|
138
|
+
:country_name,
|
139
|
+
:extended_address,
|
140
|
+
:first_name,
|
141
|
+
:last_name,
|
142
|
+
:locality,
|
143
|
+
:postal_code,
|
144
|
+
:region,
|
145
|
+
:street_address,
|
146
|
+
]}
|
147
|
+
]]
|
148
|
+
},
|
127
149
|
{:custom_fields => :_any_key_}
|
128
150
|
]
|
129
151
|
end
|
@@ -182,7 +204,29 @@ describe Braintree::Customer do
|
|
182
204
|
{:options => [:update_existing]}
|
183
205
|
]}
|
184
206
|
]},
|
185
|
-
{:options =>
|
207
|
+
{:options =>
|
208
|
+
[:paypal => [
|
209
|
+
:payee_email,
|
210
|
+
:order_id,
|
211
|
+
:custom_field,
|
212
|
+
:description,
|
213
|
+
:amount,
|
214
|
+
{:shipping => [
|
215
|
+
:company,
|
216
|
+
:country_code_alpha2,
|
217
|
+
:country_code_alpha3,
|
218
|
+
:country_code_numeric,
|
219
|
+
:country_name,
|
220
|
+
:extended_address,
|
221
|
+
:first_name,
|
222
|
+
:last_name,
|
223
|
+
:locality,
|
224
|
+
:postal_code,
|
225
|
+
:region,
|
226
|
+
:street_address,
|
227
|
+
]}
|
228
|
+
]]
|
229
|
+
},
|
186
230
|
{:custom_fields => :_any_key_}
|
187
231
|
]
|
188
232
|
end
|
@@ -2,10 +2,11 @@ require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
|
|
2
2
|
|
3
3
|
describe Braintree::RiskData do
|
4
4
|
describe "#initialize" do
|
5
|
-
it "sets id and
|
6
|
-
risk_data = Braintree::RiskData.new(:id => "123", :decision => "YOU WON $1000 DOLLARS")
|
5
|
+
it "sets id, decision and device_data_captured" do
|
6
|
+
risk_data = Braintree::RiskData.new(:id => "123", :decision => "YOU WON $1000 DOLLARS", :device_data_captured => true)
|
7
7
|
risk_data.id.should == "123"
|
8
8
|
risk_data.decision.should == "YOU WON $1000 DOLLARS"
|
9
|
+
risk_data.device_data_captured.should be_truthy
|
9
10
|
end
|
10
11
|
end
|
11
12
|
|
@@ -13,9 +14,10 @@ describe Braintree::RiskData do
|
|
13
14
|
it "prints the attributes" do
|
14
15
|
details = Braintree::RiskData.new(
|
15
16
|
:id => "123",
|
16
|
-
:decision => "YOU WON $1000 DOLLARS"
|
17
|
+
:decision => "YOU WON $1000 DOLLARS",
|
18
|
+
:device_data_captured => true
|
17
19
|
)
|
18
|
-
details.inspect.should == %(#<RiskData id: "123", decision: "YOU WON $1000 DOLLARS">)
|
20
|
+
details.inspect.should == %(#<RiskData id: "123", decision: "YOU WON $1000 DOLLARS", device_data_captured: true>)
|
19
21
|
end
|
20
22
|
end
|
21
23
|
end
|
@@ -367,16 +367,35 @@ describe Braintree::WebhookNotification do
|
|
367
367
|
|
368
368
|
context "account_updater_daily_report" do
|
369
369
|
it "builds a sample notification for an account_updater_daily_report webhook" do
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
370
|
+
sample_notification = Braintree::WebhookTesting.sample_notification(
|
371
|
+
Braintree::WebhookNotification::Kind::AccountUpdaterDailyReport,
|
372
|
+
"my_id"
|
373
|
+
)
|
374
374
|
|
375
|
-
|
375
|
+
notification = Braintree::WebhookNotification.parse(sample_notification[:bt_signature], sample_notification[:bt_payload])
|
376
376
|
|
377
|
-
|
378
|
-
|
379
|
-
|
377
|
+
notification.kind.should == Braintree::WebhookNotification::Kind::AccountUpdaterDailyReport
|
378
|
+
notification.account_updater_daily_report.report_url.should == "link-to-csv-report"
|
379
|
+
notification.account_updater_daily_report.report_date.should == Date.parse("2016-01-14")
|
380
|
+
end
|
381
|
+
end
|
382
|
+
|
383
|
+
context "granted_payment_instrument_update" do
|
384
|
+
it "builds a sample notification for a granted_payment_instrument_update webhook" do
|
385
|
+
sample_notification = Braintree::WebhookTesting.sample_notification(
|
386
|
+
Braintree::WebhookNotification::Kind::GrantedPaymentInstrumentUpdate,
|
387
|
+
"my_id"
|
388
|
+
)
|
389
|
+
|
390
|
+
notification = Braintree::WebhookNotification.parse(sample_notification[:bt_signature], sample_notification[:bt_payload])
|
391
|
+
update = notification.granted_payment_instrument_update
|
392
|
+
|
393
|
+
notification.kind.should == Braintree::WebhookNotification::Kind::GrantedPaymentInstrumentUpdate
|
394
|
+
update.grant_owner_merchant_id.should == 'vczo7jqrpwrsi2px'
|
395
|
+
update.grant_recipient_merchant_id.should == 'cf0i8wgarszuy6hc'
|
396
|
+
update.payment_method_nonce.should == 'ee257d98-de40-47e8-96b3-a6954ea7a9a4'
|
397
|
+
update.token.should == 'abc123z'
|
398
|
+
update.updated_fields.should == ['expiration-month', 'expiration-year']
|
380
399
|
end
|
381
400
|
end
|
382
401
|
|
@@ -99,6 +99,13 @@ describe Braintree::Xml do
|
|
99
99
|
verify_to_xml_and_back hash
|
100
100
|
end
|
101
101
|
|
102
|
+
context "Integer" do
|
103
|
+
it "works for integers" do
|
104
|
+
hash = { :root => {:foo => 1 } }
|
105
|
+
Braintree::Xml.hash_to_xml(hash).should include("<foo type=\"integer\">1</foo>")
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
102
109
|
context "BigDecimal" do
|
103
110
|
it "works for BigDecimals" do
|
104
111
|
hash = {:root => {:foo => BigDecimal.new("123.45")}}
|
data/spec/unit/braintree_spec.rb
CHANGED
@@ -6,6 +6,7 @@ describe Braintree do
|
|
6
6
|
braintree_file = "#{lib_dir}/braintree.rb"
|
7
7
|
File.exist?(braintree_file).should == true
|
8
8
|
output = `ruby -r rubygems -I #{lib_dir} -e 'load #{braintree_file.inspect}; load #{braintree_file.inspect}' 2>&1`
|
9
|
+
output = output.gsub(/^.*warning: constant ::Fixnum is deprecated.*\n/, "")
|
9
10
|
output.should == ""
|
10
11
|
end
|
11
12
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: braintree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.79.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Braintree
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-11-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: builder
|
@@ -88,6 +88,7 @@ files:
|
|
88
88
|
- lib/braintree/facilitated_details.rb
|
89
89
|
- lib/braintree/facilitator_details.rb
|
90
90
|
- lib/braintree/gateway.rb
|
91
|
+
- lib/braintree/granted_payment_instrument_update.rb
|
91
92
|
- lib/braintree/http.rb
|
92
93
|
- lib/braintree/ideal_payment.rb
|
93
94
|
- lib/braintree/ideal_payment_gateway.rb
|
@@ -292,7 +293,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
292
293
|
version: '0'
|
293
294
|
requirements: []
|
294
295
|
rubyforge_project: braintree
|
295
|
-
rubygems_version: 2.
|
296
|
+
rubygems_version: 2.4.5.1
|
296
297
|
signing_key:
|
297
298
|
specification_version: 4
|
298
299
|
summary: Braintree Gateway Ruby Client Library
|