braintree 4.9.0 → 4.11.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/lib/braintree/apple_pay_card.rb +2 -0
- data/lib/braintree/credit_card_verification_gateway.rb +18 -5
- data/lib/braintree/customer.rb +4 -1
- data/lib/braintree/dispute.rb +9 -0
- data/lib/braintree/dispute_search.rb +1 -0
- data/lib/braintree/error_codes.rb +7 -0
- data/lib/braintree/gateway.rb +4 -0
- data/lib/braintree/payment_instrument_type.rb +7 -6
- data/lib/braintree/payment_method_gateway.rb +2 -0
- data/lib/braintree/payment_method_nonce_details.rb +3 -0
- data/lib/braintree/payment_method_parser.rb +2 -0
- data/lib/braintree/sepa_direct_debit_account.rb +60 -0
- data/lib/braintree/sepa_direct_debit_account_gateway.rb +25 -0
- data/lib/braintree/sepa_direct_debit_account_nonce_details.rb +28 -0
- data/lib/braintree/test/nonce.rb +2 -0
- data/lib/braintree/transaction/credit_card_details.rb +4 -0
- data/lib/braintree/transaction/sepa_direct_debit_account_details.rb +27 -0
- data/lib/braintree/transaction.rb +6 -0
- data/lib/braintree/transaction_gateway.rb +1 -1
- data/lib/braintree/transaction_search.rb +1 -0
- data/lib/braintree/version.rb +1 -1
- data/lib/braintree/webhook_notification.rb +1 -0
- data/lib/braintree/webhook_testing_gateway.rb +76 -0
- data/lib/braintree.rb +4 -0
- data/spec/integration/braintree/credit_card_spec.rb +0 -60
- data/spec/integration/braintree/credit_card_verification_spec.rb +124 -1
- data/spec/integration/braintree/customer_spec.rb +1 -32
- data/spec/integration/braintree/dispute_search_spec.rb +28 -19
- data/spec/integration/braintree/dispute_spec.rb +27 -0
- data/spec/integration/braintree/http_spec.rb +1 -1
- data/spec/integration/braintree/paypal_account_spec.rb +2 -2
- data/spec/integration/braintree/sepa_direct_debit_account_spec.rb +196 -0
- data/spec/integration/braintree/subscription_spec.rb +1 -1
- data/spec/integration/braintree/transaction_search_spec.rb +34 -2
- data/spec/integration/braintree/transaction_spec.rb +107 -101
- data/spec/integration/spec_helper.rb +6 -0
- data/spec/unit/braintree/apple_pay_card_spec.rb +99 -11
- data/spec/unit/braintree/credit_card_verification_gateway_spec.rb +51 -0
- data/spec/unit/braintree/customer_spec.rb +11 -1
- data/spec/unit/braintree/dispute_search_spec.rb +1 -0
- data/spec/unit/braintree/dispute_spec.rb +8 -0
- data/spec/unit/braintree/payment_method_nonce_details_spec.rb +9 -1
- data/spec/unit/braintree/sepa_debit_account_nonce_details_spec.rb +29 -0
- data/spec/unit/braintree/sepa_debit_account_spec.rb +86 -0
- data/spec/unit/braintree/transaction/credit_card_details_spec.rb +16 -0
- data/spec/unit/braintree/transaction/deposit_details_spec.rb +1 -1
- data/spec/unit/braintree/transaction/sepa_direct_debit_account_details_spec.rb +33 -0
- data/spec/unit/braintree/transaction_gateway_spec.rb +111 -0
- data/spec/unit/braintree/transaction_spec.rb +72 -0
- data/spec/unit/braintree/webhook_notification_spec.rb +16 -0
- metadata +13 -3
@@ -1,4 +1,5 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + "/client_api/spec_helper")
|
2
3
|
|
3
4
|
describe Braintree::CreditCardVerification, "search" do
|
4
5
|
|
@@ -11,7 +12,7 @@ describe Braintree::CreditCardVerification, "search" do
|
|
11
12
|
},
|
12
13
|
:options => {
|
13
14
|
:amount => "10.00"
|
14
|
-
}
|
15
|
+
},
|
15
16
|
}
|
16
17
|
|
17
18
|
result = Braintree::CreditCardVerification.create(verification_params)
|
@@ -259,4 +260,126 @@ describe Braintree::CreditCardVerification, "search" do
|
|
259
260
|
end
|
260
261
|
end
|
261
262
|
end
|
263
|
+
|
264
|
+
describe "intended transaction source" do
|
265
|
+
it "creates a new verification with intended transaction source installment" do
|
266
|
+
verification_params = {
|
267
|
+
:credit_card => {
|
268
|
+
:expiration_date => "05/2029",
|
269
|
+
:number => Braintree::Test::CreditCardNumbers::Visa,
|
270
|
+
},
|
271
|
+
:options => {
|
272
|
+
:amount => "10.00"
|
273
|
+
},
|
274
|
+
:intended_transaction_source => "installment"
|
275
|
+
}
|
276
|
+
|
277
|
+
result = Braintree::CreditCardVerification.create(verification_params)
|
278
|
+
|
279
|
+
result.should be_success
|
280
|
+
result.credit_card_verification.id.should =~ /^\w{6,}$/
|
281
|
+
result.credit_card_verification.status.should == Braintree::CreditCardVerification::Status::Verified
|
282
|
+
result.credit_card_verification.processor_response_code.should == "1000"
|
283
|
+
result.credit_card_verification.processor_response_text.should == "Approved"
|
284
|
+
result.credit_card_verification.processor_response_type.should == Braintree::ProcessorResponseTypes::Approved
|
285
|
+
expect(result.credit_card_verification.network_transaction_id).not_to be_nil
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
289
|
+
context "three_d_secure" do
|
290
|
+
it "can create a verification with a three_d_secure_authentication_id" do
|
291
|
+
three_d_secure_authentication_id = SpecHelper.create_3ds_verification(
|
292
|
+
SpecHelper::ThreeDSecureMerchantAccountId,
|
293
|
+
:number => Braintree::Test::CreditCardNumbers::Visa,
|
294
|
+
:expiration_month => "12",
|
295
|
+
:expiration_year => "2029",
|
296
|
+
)
|
297
|
+
|
298
|
+
verification_params = {
|
299
|
+
:credit_card => {
|
300
|
+
:expiration_date => "12/2029",
|
301
|
+
:number => Braintree::Test::CreditCardNumbers::Visa,
|
302
|
+
},
|
303
|
+
:options => {
|
304
|
+
:amount => "10.00",
|
305
|
+
:merchant_account_id => SpecHelper::ThreeDSecureMerchantAccountId,
|
306
|
+
},
|
307
|
+
:three_d_secure_authentication_id => three_d_secure_authentication_id,
|
308
|
+
}
|
309
|
+
|
310
|
+
result = Braintree::CreditCardVerification.create(verification_params)
|
311
|
+
|
312
|
+
result.should be_success
|
313
|
+
result.credit_card_verification.id.should =~ /^\w{6,}$/
|
314
|
+
result.credit_card_verification.status.should == Braintree::CreditCardVerification::Status::Verified
|
315
|
+
result.credit_card_verification.processor_response_code.should == "1000"
|
316
|
+
result.credit_card_verification.processor_response_text.should == "Approved"
|
317
|
+
result.credit_card_verification.processor_response_type.should == Braintree::ProcessorResponseTypes::Approved
|
318
|
+
expect(result.credit_card_verification.network_transaction_id).not_to be_nil
|
319
|
+
end
|
320
|
+
|
321
|
+
it "can create a verification with a payment_method_nonce" do
|
322
|
+
nonce = nonce_for_new_payment_method(
|
323
|
+
:credit_card => {
|
324
|
+
:number => Braintree::Test::CreditCardNumbers::Visa,
|
325
|
+
:expiration_month => "11",
|
326
|
+
:expiration_year => "2099",
|
327
|
+
},
|
328
|
+
)
|
329
|
+
nonce.should_not be_nil
|
330
|
+
|
331
|
+
verification_params = {
|
332
|
+
:credit_card => {
|
333
|
+
:number => Braintree::Test::CreditCardNumbers::Visa,
|
334
|
+
},
|
335
|
+
:options => {
|
336
|
+
:amount => "10.00",
|
337
|
+
:merchant_account_id => SpecHelper::ThreeDSecureMerchantAccountId,
|
338
|
+
},
|
339
|
+
:payment_method_nonce => nonce,
|
340
|
+
}
|
341
|
+
|
342
|
+
result = Braintree::CreditCardVerification.create(verification_params)
|
343
|
+
|
344
|
+
result.should be_success
|
345
|
+
result.credit_card_verification.id.should =~ /^\w{6,}$/
|
346
|
+
result.credit_card_verification.status.should == Braintree::CreditCardVerification::Status::Verified
|
347
|
+
result.credit_card_verification.processor_response_code.should == "1000"
|
348
|
+
result.credit_card_verification.processor_response_text.should == "Approved"
|
349
|
+
result.credit_card_verification.processor_response_type.should == Braintree::ProcessorResponseTypes::Approved
|
350
|
+
expect(result.credit_card_verification.network_transaction_id).not_to be_nil
|
351
|
+
end
|
352
|
+
|
353
|
+
it "can create a verification with a verification_three_d_secure_pass_thru" do
|
354
|
+
verification_params = {
|
355
|
+
:credit_card => {
|
356
|
+
:number => Braintree::Test::CreditCardNumbers::Visa,
|
357
|
+
:expiration_date => "12/12",
|
358
|
+
},
|
359
|
+
:options => {
|
360
|
+
:amount => "10.00",
|
361
|
+
},
|
362
|
+
:three_d_secure_pass_thru => {
|
363
|
+
:eci_flag => "02",
|
364
|
+
:cavv => "some_cavv",
|
365
|
+
:xid => "some_xid",
|
366
|
+
:three_d_secure_version => "1.0.2",
|
367
|
+
:authentication_response => "Y",
|
368
|
+
:directory_response => "Y",
|
369
|
+
:cavv_algorithm => "2",
|
370
|
+
:ds_transaction_id => "some_ds_id",
|
371
|
+
},
|
372
|
+
}
|
373
|
+
|
374
|
+
result = Braintree::CreditCardVerification.create(verification_params)
|
375
|
+
|
376
|
+
result.should be_success
|
377
|
+
result.credit_card_verification.id.should =~ /^\w{6,}$/
|
378
|
+
result.credit_card_verification.status.should == Braintree::CreditCardVerification::Status::Verified
|
379
|
+
result.credit_card_verification.processor_response_code.should == "1000"
|
380
|
+
result.credit_card_verification.processor_response_text.should == "Approved"
|
381
|
+
result.credit_card_verification.processor_response_type.should == Braintree::ProcessorResponseTypes::Approved
|
382
|
+
expect(result.credit_card_verification.network_transaction_id).not_to be_nil
|
383
|
+
end
|
384
|
+
end
|
262
385
|
end
|
@@ -566,37 +566,6 @@ describe Braintree::Customer do
|
|
566
566
|
result.errors.for(:customer).on(:custom_fields)[0].message.should == "Custom field is invalid: spouse_name."
|
567
567
|
end
|
568
568
|
|
569
|
-
describe "venmo_sdk" do
|
570
|
-
it "can create a customer with a venmo sdk payment method code" do
|
571
|
-
result = Braintree::Customer.create(
|
572
|
-
:first_name => "Steve",
|
573
|
-
:last_name => "Hamlin",
|
574
|
-
:credit_card => {
|
575
|
-
:venmo_sdk_payment_method_code => Braintree::Test::VenmoSDK::VisaPaymentMethodCode
|
576
|
-
},
|
577
|
-
)
|
578
|
-
result.success?.should == true
|
579
|
-
result.customer.credit_cards.first.bin.should == "400934"
|
580
|
-
result.customer.credit_cards.first.last_4.should == "1881"
|
581
|
-
end
|
582
|
-
|
583
|
-
it "can create a customer with a venmo sdk session" do
|
584
|
-
result = Braintree::Customer.create(
|
585
|
-
:first_name => "Steve",
|
586
|
-
:last_name => "Hamlin",
|
587
|
-
:credit_card => {
|
588
|
-
:number => Braintree::Test::CreditCardNumbers::MasterCard,
|
589
|
-
:expiration_date => "05/2010",
|
590
|
-
:options => {
|
591
|
-
:venmo_sdk_session => Braintree::Test::VenmoSDK::Session
|
592
|
-
}
|
593
|
-
},
|
594
|
-
)
|
595
|
-
result.success?.should == true
|
596
|
-
result.customer.credit_cards.first.venmo_sdk?.should == false
|
597
|
-
end
|
598
|
-
end
|
599
|
-
|
600
569
|
context "client API" do
|
601
570
|
it "can create a customer with a payment method nonce" do
|
602
571
|
nonce = nonce_for_new_payment_method(
|
@@ -1754,7 +1723,7 @@ describe Braintree::Customer do
|
|
1754
1723
|
context "future" do
|
1755
1724
|
it "creates a customer with a future paypal account" do
|
1756
1725
|
result = Braintree::Customer.create(
|
1757
|
-
:payment_method_nonce => Braintree::Test::Nonce::
|
1726
|
+
:payment_method_nonce => Braintree::Test::Nonce::PayPalBillingAgreement,
|
1758
1727
|
)
|
1759
1728
|
|
1760
1729
|
result.should be_success
|
@@ -78,33 +78,42 @@ describe Braintree::Dispute, "search" do
|
|
78
78
|
dispute = collection.disputes.first
|
79
79
|
end
|
80
80
|
|
81
|
-
it "correctly returns chargeback protected disputes" do
|
82
|
-
collection = Braintree::Dispute.search do |search|
|
83
|
-
search.case_number.is "CASE-CHARGEBACK-PROTECTED"
|
84
|
-
end
|
85
|
-
|
86
|
-
expect(collection.disputes.count).to eq(1)
|
87
|
-
dispute = collection.disputes.first
|
88
|
-
|
89
|
-
# NEXT_MAJOR_VERSION Remove this assertion when chargeback_protection_level is removed from the SDK
|
90
|
-
expect(dispute.chargeback_protection_level).to eq(Braintree::Dispute::ChargebackProtectionLevel::Effortless)
|
91
|
-
expect(dispute.protection_level).to eq(Braintree::Dispute::ProtectionLevel::EffortlessCBP)
|
92
|
-
expect(dispute.reason).to eq(Braintree::Dispute::Reason::Fraud)
|
93
|
-
end
|
94
|
-
|
95
81
|
it "correctly returns disputes by chargeback protection level flag" do
|
96
82
|
collection = Braintree::Dispute.search do |search|
|
97
83
|
search.chargeback_protection_level.in [
|
98
84
|
Braintree::Dispute::ChargebackProtectionLevel::Effortless
|
99
85
|
]
|
100
86
|
end
|
101
|
-
expect(collection.disputes.count).to
|
102
|
-
dispute = collection.disputes.first
|
87
|
+
expect(collection.disputes.count).to be > 0
|
103
88
|
|
104
89
|
# NEXT_MAJOR_VERSION Remove this assertion when chargeback_protection_level is removed from the SDK
|
105
|
-
|
106
|
-
|
107
|
-
|
90
|
+
collection.disputes.each do |dispute|
|
91
|
+
expect(dispute.chargeback_protection_level).to eq(Braintree::Dispute::ChargebackProtectionLevel::Effortless)
|
92
|
+
expect(dispute.protection_level).to eq(Braintree::Dispute::ProtectionLevel::EffortlessCBP)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
context "pre-dispute program" do
|
97
|
+
it "correctly returns disputes by pre-dispute program" do
|
98
|
+
collection = Braintree::Dispute.search do |search|
|
99
|
+
search.pre_dispute_program.in [
|
100
|
+
Braintree::Dispute::PreDisputeProgram::VisaRdr
|
101
|
+
]
|
102
|
+
end
|
103
|
+
|
104
|
+
expect(collection.disputes.count).to eq(1)
|
105
|
+
dispute = collection.disputes.first
|
106
|
+
expect(dispute.pre_dispute_program).to eq(Braintree::Dispute::PreDisputeProgram::VisaRdr)
|
107
|
+
end
|
108
|
+
|
109
|
+
it "correctly returns disputes with no pre-dispute program" do
|
110
|
+
collection = Braintree::Dispute.search do |search|
|
111
|
+
search.pre_dispute_program.is Braintree::Dispute::PreDisputeProgram::None
|
112
|
+
end
|
113
|
+
|
114
|
+
expect(collection.disputes.count).to be > 1
|
115
|
+
expect(collection.disputes.map(&:pre_dispute_program).uniq).to eq([Braintree::Dispute::PreDisputeProgram::None])
|
116
|
+
end
|
108
117
|
end
|
109
118
|
|
110
119
|
it "correctly returns disputes by effective_date range" do
|
@@ -151,6 +151,33 @@ describe Braintree::Dispute do
|
|
151
151
|
result.evidence.sent_to_processor_at.should == nil
|
152
152
|
result.evidence.sequence_number.should == 7
|
153
153
|
end
|
154
|
+
|
155
|
+
it "creates text evidence for the dispute with CARRIER_NAME shipping tracking" do
|
156
|
+
result = Braintree::Dispute.add_text_evidence(dispute.id, {content: "UPS", category: "CARRIER_NAME", sequence_number: 0})
|
157
|
+
|
158
|
+
result.success?.should == true
|
159
|
+
result.evidence.category.should == "CARRIER_NAME"
|
160
|
+
result.evidence.comment.should == "UPS"
|
161
|
+
result.evidence.sequence_number.should == 0
|
162
|
+
end
|
163
|
+
|
164
|
+
it "creates text evidence for the dispute with TRACKING_NUMBER shipping tracking" do
|
165
|
+
result = Braintree::Dispute.add_text_evidence(dispute.id, {content: "3", category: "TRACKING_NUMBER", sequence_number: 0})
|
166
|
+
|
167
|
+
result.success?.should == true
|
168
|
+
result.evidence.category.should == "TRACKING_NUMBER"
|
169
|
+
result.evidence.comment.should == "3"
|
170
|
+
result.evidence.sequence_number.should == 0
|
171
|
+
end
|
172
|
+
|
173
|
+
it "creates text evidence for the dispute with TRACKING_URL shipping tracking" do
|
174
|
+
result = Braintree::Dispute.add_text_evidence(dispute.id, {content: "https://example.com/tracking-number/abc12345", category: "TRACKING_URL", sequence_number: 1})
|
175
|
+
|
176
|
+
result.success?.should == true
|
177
|
+
result.evidence.category.should == "TRACKING_URL"
|
178
|
+
result.evidence.comment.should == "https://example.com/tracking-number/abc12345"
|
179
|
+
result.evidence.sequence_number.should == 1
|
180
|
+
end
|
154
181
|
end
|
155
182
|
|
156
183
|
describe "self.finalize" do
|
@@ -97,7 +97,7 @@ describe Braintree::Http do
|
|
97
97
|
end
|
98
98
|
|
99
99
|
describe "ssl_version" do
|
100
|
-
|
100
|
+
xit "causes failed requests to sandbox with incompatible SSL version" do
|
101
101
|
begin
|
102
102
|
original_env = Braintree::Configuration.environment
|
103
103
|
Braintree::Configuration.environment = :sandbox
|
@@ -267,7 +267,7 @@ describe Braintree::PayPalAccount do
|
|
267
267
|
context "self.sale" do
|
268
268
|
it "creates a transaction using a paypal account and returns a result object" do
|
269
269
|
customer = Braintree::Customer.create!(
|
270
|
-
:payment_method_nonce => Braintree::Test::Nonce::
|
270
|
+
:payment_method_nonce => Braintree::Test::Nonce::PayPalBillingAgreement,
|
271
271
|
)
|
272
272
|
|
273
273
|
result = Braintree::PayPalAccount.sale(customer.paypal_accounts[0].token, :amount => "100.00")
|
@@ -283,7 +283,7 @@ describe Braintree::PayPalAccount do
|
|
283
283
|
context "self.sale!" do
|
284
284
|
it "creates a transaction using a paypal account and returns a transaction" do
|
285
285
|
customer = Braintree::Customer.create!(
|
286
|
-
:payment_method_nonce => Braintree::Test::Nonce::
|
286
|
+
:payment_method_nonce => Braintree::Test::Nonce::PayPalBillingAgreement,
|
287
287
|
)
|
288
288
|
|
289
289
|
transaction = Braintree::PayPalAccount.sale!(customer.paypal_accounts[0].token, :amount => "100.00")
|
@@ -0,0 +1,196 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
|
2
|
+
|
3
|
+
describe Braintree::SepaDirectDebitAccount do
|
4
|
+
before do
|
5
|
+
Braintree::Configuration.merchant_id = "integration_merchant_id"
|
6
|
+
Braintree::Configuration.public_key = "integration_public_key"
|
7
|
+
Braintree::Configuration.private_key = "integration_private_key"
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:customer) { Braintree::Customer.create.customer }
|
11
|
+
let(:nonce) { Braintree::Test::Nonce::SepaDirectDebit }
|
12
|
+
|
13
|
+
let(:token) do
|
14
|
+
Braintree::PaymentMethod.create(
|
15
|
+
payment_method_nonce: nonce,
|
16
|
+
customer_id: customer.id,
|
17
|
+
).payment_method.token
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "self.find" do
|
21
|
+
subject do
|
22
|
+
described_class.find(token)
|
23
|
+
end
|
24
|
+
|
25
|
+
context "when payment method exists" do
|
26
|
+
it "returns a payment method" do
|
27
|
+
sepa_direct_debit_account = subject
|
28
|
+
sepa_direct_debit_account.should be_a(Braintree::SepaDirectDebitAccount)
|
29
|
+
sepa_direct_debit_account.last_4.should == "1234"
|
30
|
+
sepa_direct_debit_account.default.should == true
|
31
|
+
sepa_direct_debit_account.customer_id.should == customer.id
|
32
|
+
sepa_direct_debit_account.global_id.should_not be_empty
|
33
|
+
sepa_direct_debit_account.customer_global_id.should_not be_empty
|
34
|
+
sepa_direct_debit_account.bank_reference_token.should == "a-fake-bank-reference-token"
|
35
|
+
sepa_direct_debit_account.mandate_type.should == "RECURRENT"
|
36
|
+
sepa_direct_debit_account.merchant_or_partner_customer_id.should == "a-fake-mp-customer-id"
|
37
|
+
sepa_direct_debit_account.token.should_not be_empty
|
38
|
+
sepa_direct_debit_account.image_url.should_not be_empty
|
39
|
+
sepa_direct_debit_account.created_at.should be_a Time
|
40
|
+
sepa_direct_debit_account.updated_at.should be_a Time
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context "when payment method does not exist" do
|
45
|
+
let(:token) { "ABC123" }
|
46
|
+
|
47
|
+
it "raises an error" do
|
48
|
+
expect {
|
49
|
+
subject
|
50
|
+
}.to raise_error(Braintree::NotFoundError)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context "subscriptions" do
|
55
|
+
it "returns subscriptions associated with a SEPA direct debit account" do
|
56
|
+
customer = Braintree::Customer.create!
|
57
|
+
|
58
|
+
subscription1 = Braintree::Subscription.create(
|
59
|
+
:payment_method_token => token,
|
60
|
+
:plan_id => SpecHelper::TriallessPlan[:id],
|
61
|
+
).subscription
|
62
|
+
|
63
|
+
subscription2 = Braintree::Subscription.create(
|
64
|
+
:payment_method_token => token,
|
65
|
+
:plan_id => SpecHelper::TriallessPlan[:id],
|
66
|
+
).subscription
|
67
|
+
|
68
|
+
sepa_debit_account = Braintree::SepaDirectDebitAccount.find(token)
|
69
|
+
subscription_ids = sepa_debit_account.subscriptions.map { |h| h[:id] }.sort
|
70
|
+
expect(subscription_ids).to eq([subscription1.id, subscription2.id].sort)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "self.delete" do
|
76
|
+
subject do
|
77
|
+
described_class.delete(token)
|
78
|
+
end
|
79
|
+
|
80
|
+
context "when payment method exists" do
|
81
|
+
it "deletes a payment method" do
|
82
|
+
should be_success
|
83
|
+
|
84
|
+
expect {
|
85
|
+
described_class.find(token)
|
86
|
+
}.to raise_error(Braintree::NotFoundError)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
context "when payment method does not exist" do
|
91
|
+
let(:token) { "ABC123" }
|
92
|
+
|
93
|
+
it "raises an error" do
|
94
|
+
expect {
|
95
|
+
subject
|
96
|
+
}.to raise_error(Braintree::NotFoundError)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
describe "self.sale" do
|
102
|
+
let(:params) do
|
103
|
+
{
|
104
|
+
amount: 1.23,
|
105
|
+
}
|
106
|
+
end
|
107
|
+
|
108
|
+
subject do
|
109
|
+
described_class.sale(token, params)
|
110
|
+
end
|
111
|
+
|
112
|
+
context "when payment method exists" do
|
113
|
+
it "creates a transaction" do
|
114
|
+
should be_success
|
115
|
+
|
116
|
+
transaction = subject.transaction
|
117
|
+
transaction.amount.should eq(1.23)
|
118
|
+
transaction.status.should == "settling"
|
119
|
+
sepa_direct_debit_account_details = transaction.sepa_direct_debit_account_details
|
120
|
+
sepa_direct_debit_account_details.should be_a(Braintree::Transaction::SepaDirectDebitAccountDetails)
|
121
|
+
sepa_direct_debit_account_details.bank_reference_token.should == "a-fake-bank-reference-token"
|
122
|
+
sepa_direct_debit_account_details.capture_id.should_not be_empty
|
123
|
+
sepa_direct_debit_account_details.debug_id.should be_nil
|
124
|
+
sepa_direct_debit_account_details.global_id.should_not be_empty
|
125
|
+
sepa_direct_debit_account_details.last_4.should == "1234"
|
126
|
+
sepa_direct_debit_account_details.mandate_type.should == "RECURRENT"
|
127
|
+
sepa_direct_debit_account_details.merchant_or_partner_customer_id.should == "a-fake-mp-customer-id"
|
128
|
+
sepa_direct_debit_account_details.paypal_v2_order_id.should be_nil
|
129
|
+
sepa_direct_debit_account_details.refund_from_transaction_fee_amount.should be_nil
|
130
|
+
sepa_direct_debit_account_details.refund_from_transaction_fee_currency_iso_code.should be_nil
|
131
|
+
sepa_direct_debit_account_details.refund_id.should be_nil
|
132
|
+
sepa_direct_debit_account_details.settlement_type.should be_nil
|
133
|
+
sepa_direct_debit_account_details.token.should == token
|
134
|
+
sepa_direct_debit_account_details.transaction_fee_amount.should == "0.01"
|
135
|
+
sepa_direct_debit_account_details.transaction_fee_currency_iso_code.should == "USD"
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
context "when payment method does not exist" do
|
140
|
+
let(:token) { "ABC123" }
|
141
|
+
|
142
|
+
it "not raises an error" do
|
143
|
+
expect {
|
144
|
+
subject
|
145
|
+
}.to_not raise_error
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
describe "self.sale!" do
|
151
|
+
let(:params) do
|
152
|
+
{
|
153
|
+
amount: 1.23,
|
154
|
+
}
|
155
|
+
end
|
156
|
+
|
157
|
+
subject do
|
158
|
+
described_class.sale!(token, params)
|
159
|
+
end
|
160
|
+
|
161
|
+
context "when payment method exists" do
|
162
|
+
it "creates a transaction" do
|
163
|
+
transaction = subject
|
164
|
+
transaction.amount.should eq(1.23)
|
165
|
+
transaction.status.should == "settling"
|
166
|
+
sepa_direct_debit_account_details = transaction.sepa_direct_debit_account_details
|
167
|
+
sepa_direct_debit_account_details.should be_a(Braintree::Transaction::SepaDirectDebitAccountDetails)
|
168
|
+
sepa_direct_debit_account_details.bank_reference_token.should == "a-fake-bank-reference-token"
|
169
|
+
sepa_direct_debit_account_details.capture_id.should_not be_empty
|
170
|
+
sepa_direct_debit_account_details.debug_id.should be_nil
|
171
|
+
sepa_direct_debit_account_details.global_id.should_not be_empty
|
172
|
+
sepa_direct_debit_account_details.last_4.should == "1234"
|
173
|
+
sepa_direct_debit_account_details.mandate_type.should == "RECURRENT"
|
174
|
+
sepa_direct_debit_account_details.merchant_or_partner_customer_id.should == "a-fake-mp-customer-id"
|
175
|
+
sepa_direct_debit_account_details.paypal_v2_order_id.should be_nil
|
176
|
+
sepa_direct_debit_account_details.refund_from_transaction_fee_amount.should be_nil
|
177
|
+
sepa_direct_debit_account_details.refund_from_transaction_fee_currency_iso_code.should be_nil
|
178
|
+
sepa_direct_debit_account_details.refund_id.should be_nil
|
179
|
+
sepa_direct_debit_account_details.settlement_type.should be_nil
|
180
|
+
sepa_direct_debit_account_details.token.should == token
|
181
|
+
sepa_direct_debit_account_details.transaction_fee_amount.should == "0.01"
|
182
|
+
sepa_direct_debit_account_details.transaction_fee_currency_iso_code.should == "USD"
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
context "when payment method does not exist" do
|
187
|
+
let(:token) { "ABC123" }
|
188
|
+
|
189
|
+
it "not raises an error" do
|
190
|
+
expect {
|
191
|
+
subject
|
192
|
+
}.to raise_error(Braintree::ValidationsFailed)
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
@@ -96,7 +96,7 @@ describe Braintree::Subscription do
|
|
96
96
|
it "creates a subscription when given a paypal account payment_method_nonce" do
|
97
97
|
customer = Braintree::Customer.create!
|
98
98
|
payment_method_result = Braintree::PaymentMethod.create(
|
99
|
-
:payment_method_nonce => Braintree::Test::Nonce::
|
99
|
+
:payment_method_nonce => Braintree::Test::Nonce::PayPalBillingAgreement,
|
100
100
|
:customer_id => customer.id,
|
101
101
|
)
|
102
102
|
|
@@ -133,7 +133,7 @@ describe Braintree::Transaction, "search" do
|
|
133
133
|
it "searches on users" do
|
134
134
|
transaction = Braintree::Transaction.sale!(
|
135
135
|
:amount => Braintree::Test::TransactionAmounts::Authorize,
|
136
|
-
:payment_method_nonce => Braintree::Test::Nonce::
|
136
|
+
:payment_method_nonce => Braintree::Test::Nonce::PayPalBillingAgreement,
|
137
137
|
)
|
138
138
|
|
139
139
|
collection = Braintree::Transaction.search do |search|
|
@@ -146,7 +146,7 @@ describe Braintree::Transaction, "search" do
|
|
146
146
|
it "searches on paypal transactions" do
|
147
147
|
transaction = Braintree::Transaction.sale!(
|
148
148
|
:amount => Braintree::Test::TransactionAmounts::Authorize,
|
149
|
-
:payment_method_nonce => Braintree::Test::Nonce::
|
149
|
+
:payment_method_nonce => Braintree::Test::Nonce::PayPalBillingAgreement,
|
150
150
|
)
|
151
151
|
|
152
152
|
paypal_details = transaction.paypal_details
|
@@ -396,6 +396,38 @@ describe Braintree::Transaction, "search" do
|
|
396
396
|
collection.first.payment_instrument_type.should == Braintree::PaymentInstrumentType::LocalPayment
|
397
397
|
end
|
398
398
|
|
399
|
+
it "searches by payment instrument type SepaDebitAccountDetail" do
|
400
|
+
transaction = Braintree::Transaction.sale!(
|
401
|
+
:amount => Braintree::Test::TransactionAmounts::Authorize,
|
402
|
+
:payment_method_nonce => Braintree::Test::Nonce::SepaDirectDebit,
|
403
|
+
:options => {:submit_for_settlement => true},
|
404
|
+
)
|
405
|
+
|
406
|
+
collection = Braintree::Transaction.search do |search|
|
407
|
+
search.id.is transaction.id
|
408
|
+
search.payment_instrument_type.in ["SEPADebitAccountDetail"]
|
409
|
+
end
|
410
|
+
|
411
|
+
collection.first.id.should == transaction.id
|
412
|
+
collection.first.payment_instrument_type.should == Braintree::PaymentInstrumentType::SepaDirectDebitAccount
|
413
|
+
end
|
414
|
+
|
415
|
+
it "searches by paypal_v2_order_id" do
|
416
|
+
transaction = Braintree::Transaction.sale!(
|
417
|
+
:amount => Braintree::Test::TransactionAmounts::Authorize,
|
418
|
+
:payment_method_nonce => Braintree::Test::Nonce::SepaDirectDebit,
|
419
|
+
:options => {:submit_for_settlement => true},
|
420
|
+
)
|
421
|
+
|
422
|
+
collection = Braintree::Transaction.search do |search|
|
423
|
+
search.id.is transaction.id
|
424
|
+
search.sepa_debit_paypal_v2_order_id.is transaction.sepa_direct_debit_account_details.paypal_v2_order_id
|
425
|
+
end
|
426
|
+
|
427
|
+
collection.first.id.should == transaction.id
|
428
|
+
collection.first.payment_instrument_type.should == Braintree::PaymentInstrumentType::SepaDirectDebitAccount
|
429
|
+
end
|
430
|
+
|
399
431
|
it "searches by payment instrument type ApplePay" do
|
400
432
|
transaction = Braintree::Transaction.sale!(
|
401
433
|
:amount => Braintree::Test::TransactionAmounts::Authorize,
|