solidus_paypal_braintree 1.1.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +4 -0
  3. data/.gitignore +1 -0
  4. data/CHANGELOG.md +70 -1
  5. data/Gemfile +2 -5
  6. data/app/models/solidus_paypal_braintree/gateway.rb +2 -0
  7. data/app/models/solidus_paypal_braintree/transaction.rb +2 -2
  8. data/app/models/solidus_paypal_braintree/transaction_import.rb +2 -2
  9. data/lib/solidus_paypal_braintree/engine.rb +5 -3
  10. data/lib/solidus_paypal_braintree/version.rb +1 -1
  11. data/solidus_paypal_braintree.gemspec +0 -1
  12. metadata +7 -125
  13. data/spec/controllers/solidus_paypal_braintree/checkouts_controller_spec.rb +0 -99
  14. data/spec/controllers/solidus_paypal_braintree/client_tokens_controller_spec.rb +0 -55
  15. data/spec/controllers/solidus_paypal_braintree/configurations_controller_spec.rb +0 -73
  16. data/spec/controllers/solidus_paypal_braintree/transactions_controller_spec.rb +0 -183
  17. data/spec/features/backend/configuration_spec.rb +0 -23
  18. data/spec/features/backend/new_payment_spec.rb +0 -137
  19. data/spec/features/frontend/braintree_credit_card_checkout_spec.rb +0 -191
  20. data/spec/features/frontend/paypal_checkout_spec.rb +0 -166
  21. data/spec/features/frontend/venmo_checkout_spec.rb +0 -189
  22. data/spec/fixtures/cassettes/admin/invalid_credit_card.yml +0 -63
  23. data/spec/fixtures/cassettes/admin/resubmit_credit_card.yml +0 -352
  24. data/spec/fixtures/cassettes/admin/valid_credit_card.yml +0 -412
  25. data/spec/fixtures/cassettes/braintree/create_profile.yml +0 -71
  26. data/spec/fixtures/cassettes/braintree/generate_token.yml +0 -63
  27. data/spec/fixtures/cassettes/braintree/token.yml +0 -63
  28. data/spec/fixtures/cassettes/checkout/invalid_credit_card.yml +0 -63
  29. data/spec/fixtures/cassettes/checkout/resubmit_credit_card.yml +0 -216
  30. data/spec/fixtures/cassettes/checkout/update.yml +0 -71
  31. data/spec/fixtures/cassettes/checkout/valid_credit_card.yml +0 -156
  32. data/spec/fixtures/cassettes/checkout/valid_venmo_transaction.yml +0 -599
  33. data/spec/fixtures/cassettes/gateway/authorize/credit_card/address.yml +0 -86
  34. data/spec/fixtures/cassettes/gateway/authorize/merchant_account/EUR.yml +0 -154
  35. data/spec/fixtures/cassettes/gateway/authorize/paypal/EUR.yml +0 -90
  36. data/spec/fixtures/cassettes/gateway/authorize/paypal/address.yml +0 -90
  37. data/spec/fixtures/cassettes/gateway/authorize.yml +0 -86
  38. data/spec/fixtures/cassettes/gateway/authorized_transaction.yml +0 -73
  39. data/spec/fixtures/cassettes/gateway/cancel/missing.yml +0 -63
  40. data/spec/fixtures/cassettes/gateway/cancel/refunds.yml +0 -272
  41. data/spec/fixtures/cassettes/gateway/cancel/void.yml +0 -201
  42. data/spec/fixtures/cassettes/gateway/capture.yml +0 -141
  43. data/spec/fixtures/cassettes/gateway/complete.yml +0 -157
  44. data/spec/fixtures/cassettes/gateway/credit.yml +0 -208
  45. data/spec/fixtures/cassettes/gateway/purchase.yml +0 -87
  46. data/spec/fixtures/cassettes/gateway/settled_transaction.yml +0 -140
  47. data/spec/fixtures/cassettes/gateway/void.yml +0 -137
  48. data/spec/fixtures/cassettes/source/card_type.yml +0 -267
  49. data/spec/fixtures/cassettes/source/last4.yml +0 -267
  50. data/spec/fixtures/cassettes/transaction/import/valid/capture.yml +0 -224
  51. data/spec/fixtures/cassettes/transaction/import/valid.yml +0 -71
  52. data/spec/fixtures/views/spree/orders/edit.html.erb +0 -50
  53. data/spec/helpers/solidus_paypal_braintree/braintree_admin_helper_spec.rb +0 -17
  54. data/spec/helpers/solidus_paypal_braintree/braintree_checkout_helper_spec.rb +0 -70
  55. data/spec/models/solidus_paypal_braintree/address_spec.rb +0 -71
  56. data/spec/models/solidus_paypal_braintree/avs_result_spec.rb +0 -317
  57. data/spec/models/solidus_paypal_braintree/gateway_spec.rb +0 -692
  58. data/spec/models/solidus_paypal_braintree/response_spec.rb +0 -280
  59. data/spec/models/solidus_paypal_braintree/source_spec.rb +0 -499
  60. data/spec/models/solidus_paypal_braintree/transaction_address_spec.rb +0 -235
  61. data/spec/models/solidus_paypal_braintree/transaction_import_spec.rb +0 -300
  62. data/spec/models/solidus_paypal_braintree/transaction_spec.rb +0 -85
  63. data/spec/models/spree/store_spec.rb +0 -14
  64. data/spec/requests/spree/api/orders_controller_spec.rb +0 -36
  65. data/spec/spec_helper.rb +0 -29
  66. data/spec/support/capybara.rb +0 -7
  67. data/spec/support/factories.rb +0 -2
  68. data/spec/support/gateway_helpers.rb +0 -29
  69. data/spec/support/order_ready_for_payment.rb +0 -37
  70. data/spec/support/vcr.rb +0 -42
  71. data/spec/support/views.rb +0 -1
@@ -1,499 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe SolidusPaypalBraintree::Source, type: :model do
4
- include_context 'when order is ready for payment'
5
-
6
- it 'is invalid without a payment_type set' do
7
- expect(described_class.new).to be_invalid
8
- end
9
-
10
- it 'is invalid with payment_type set to unknown type' do
11
- expect(described_class.new(payment_type: 'AndroidPay')).to be_invalid
12
- end
13
-
14
- describe 'attributes' do
15
- context 'with paypal_funding_source' do
16
- subject { build(:solidus_paypal_braintree_source, :paypal) }
17
-
18
- it 'can be nil' do
19
- subject.paypal_funding_source = nil
20
-
21
- expect(subject).to be_valid
22
- end
23
-
24
- it 'makes empty strings nil' do
25
- subject.paypal_funding_source = ''
26
-
27
- result = subject.save
28
-
29
- expect(result).to eq(true)
30
- expect(subject.paypal_funding_source).to be_nil
31
- end
32
-
33
- it 'gets correctly mapped as an enum' do
34
- subject.paypal_funding_source = 'applepay'
35
-
36
- result = subject.save
37
-
38
- expect(result).to eq(true)
39
- expect(subject.paypal_funding_source).to eq('applepay')
40
- expect(subject.applepay_funding?).to eq(true)
41
- end
42
-
43
- it "doesn't become nil when the payment_type is a PAYPAL" do
44
- subject.payment_type = described_class::PAYPAL
45
- subject.paypal_funding_source = 'venmo'
46
-
47
- result = subject.save
48
-
49
- expect(result).to eq(true)
50
- expect(subject.venmo_funding?).to eq(true)
51
- end
52
-
53
- it 'becomes nil when the payment_type is a CREDIT CARD' do
54
- subject.payment_type = described_class::CREDIT_CARD
55
- subject.paypal_funding_source = 'venmo'
56
-
57
- result = subject.save
58
-
59
- expect(result).to eq(true)
60
- expect(subject.paypal_funding_source).to be_nil
61
- end
62
-
63
- it 'becomes nil when the payment_type is APPLE PAY' do
64
- subject.payment_type = described_class::APPLE_PAY
65
- subject.paypal_funding_source = 'venmo'
66
-
67
- result = subject.save
68
-
69
- expect(result).to eq(true)
70
- expect(subject.paypal_funding_source).to be_nil
71
- end
72
- end
73
- end
74
-
75
- describe '#payment_method' do
76
- it 'uses spree_payment_method' do
77
- expect(described_class.new.build_payment_method).to be_a Spree::PaymentMethod
78
- end
79
- end
80
-
81
- describe '#imported' do
82
- it 'is always false' do
83
- expect(described_class.new.imported).not_to be_truthy
84
- end
85
- end
86
-
87
- describe "#actions" do
88
- it "supports capture, void, and credit" do
89
- expect(described_class.new.actions).to eq %w[capture void credit]
90
- end
91
- end
92
-
93
- describe "#can_capture?" do
94
- subject { described_class.new.can_capture?(payment) }
95
-
96
- context "when the payment state is pending" do
97
- let(:payment) { build(:payment, state: "pending") }
98
-
99
- it { is_expected.to be_truthy }
100
- end
101
-
102
- context "when the payment state is checkout" do
103
- let(:payment) { build(:payment, state: "checkout") }
104
-
105
- it { is_expected.to be_truthy }
106
- end
107
-
108
- context "when the payment is completed" do
109
- let(:payment) { build(:payment, state: "completed") }
110
-
111
- it { is_expected.not_to be_truthy }
112
- end
113
- end
114
-
115
- describe '#can_void?' do
116
- subject { payment_source.can_void?(payment) }
117
-
118
- let(:payment_source) { described_class.new }
119
- let(:payment) { build(:payment) }
120
-
121
- let(:transaction_response) do
122
- double(:response, status: Braintree::Transaction::Status::SubmittedForSettlement)
123
- end
124
-
125
- let(:transaction_request) do
126
- double(:request, find: transaction_response)
127
- end
128
-
129
- before do
130
- allow(payment_source).to receive(:braintree_client) do
131
- double(:transaction, transaction: transaction_request)
132
- end
133
- end
134
-
135
- context 'when transaction id is not present' do
136
- let(:payment) { build(:payment, response_code: nil) }
137
-
138
- it { is_expected.to be(false) }
139
- end
140
-
141
- context 'when transaction has voidable status' do
142
- it { is_expected.to be(true) }
143
- end
144
-
145
- context 'when transaction has non voidable status' do
146
- let(:transaction_response) do
147
- double(:response, status: Braintree::Transaction::Status::Settled)
148
- end
149
-
150
- it { is_expected.to be(false) }
151
- end
152
-
153
- context 'when transaction is not found at Braintreee' do
154
- before do
155
- allow(transaction_request).to \
156
- receive(:find).and_raise(Braintree::NotFoundError)
157
- end
158
-
159
- it { is_expected.to be(false) }
160
- end
161
- end
162
-
163
- describe "#can_credit?" do
164
- subject { described_class.new.can_credit?(payment) }
165
-
166
- context "when the payment is completed" do
167
- context "when the credit allowed is 100" do
168
- let(:payment) { build(:payment, state: "completed", amount: 100) }
169
-
170
- it { is_expected.to be_truthy }
171
- end
172
-
173
- context "when the credit allowed is 0" do
174
- let(:payment) { build(:payment, state: "completed", amount: 0) }
175
-
176
- it { is_expected.not_to be_truthy }
177
- end
178
- end
179
-
180
- context "when the payment has not been completed" do
181
- let(:payment) { build(:payment, state: "checkout") }
182
-
183
- it { is_expected.not_to be_truthy }
184
- end
185
- end
186
-
187
- describe "#friendly_payment_type" do
188
- subject { described_class.new(payment_type: type).friendly_payment_type }
189
-
190
- context "when then payment type is PayPal" do
191
- let(:type) { "PayPalAccount" }
192
-
193
- it "returns the translated payment type" do
194
- expect(subject).to eq "PayPal"
195
- end
196
- end
197
-
198
- context "when the payment type is Apple Pay" do
199
- let(:type) { "ApplePayCard" }
200
-
201
- it "returns the translated payment type" do
202
- expect(subject).to eq "Apple Pay"
203
- end
204
- end
205
-
206
- context "when the payment type is Credit Card" do
207
- let(:type) { "CreditCard" }
208
-
209
- it "returns the translated payment type" do
210
- expect(subject).to eq "Credit Card"
211
- end
212
- end
213
- end
214
-
215
- describe "#apple_pay?" do
216
- subject { described_class.new(payment_type: type).apple_pay? }
217
-
218
- context "when the payment type is Apple Pay" do
219
- let(:type) { "ApplePayCard" }
220
-
221
- it { is_expected.to be true }
222
- end
223
-
224
- context "when the payment type is not Apple Pay" do
225
- let(:type) { "DogeCoin" }
226
-
227
- it { is_expected.to be false }
228
- end
229
- end
230
-
231
- describe "#paypal?" do
232
- subject { described_class.new(payment_type: type).paypal? }
233
-
234
- context "when the payment type is PayPal" do
235
- let(:type) { "PayPalAccount" }
236
-
237
- it { is_expected.to be true }
238
- end
239
-
240
- context "when the payment type is not PayPal" do
241
- let(:type) { "MonopolyMoney" }
242
-
243
- it { is_expected.to be false }
244
- end
245
- end
246
-
247
- describe "#credit_card?" do
248
- subject { described_class.new(payment_type: type).credit_card? }
249
-
250
- context "when the payment type is CreditCard" do
251
- let(:type) { "CreditCard" }
252
-
253
- it { is_expected.to be true }
254
- end
255
-
256
- context "when the payment type is not CreditCard" do
257
- let(:type) { "MonopolyMoney" }
258
-
259
- it { is_expected.to be false }
260
- end
261
- end
262
-
263
- describe "#venmo?" do
264
- subject { described_class.new(payment_type: type).venmo? }
265
-
266
- context "when the payment type is VenmoAccount" do
267
- let(:type) { "VenmoAccount" }
268
-
269
- it { is_expected.to be true }
270
- end
271
-
272
- context "when the payment type is not VenmoAccount" do
273
- let(:type) { "Swish" }
274
-
275
- it { is_expected.to be false }
276
- end
277
- end
278
-
279
- shared_context 'with unknown source token' do
280
- let(:braintree_payment_method) { double }
281
-
282
- before do
283
- allow(braintree_payment_method).to receive(:find) do
284
- raise Braintree::NotFoundError
285
- end
286
- allow(payment_source).to receive(:braintree_client) do
287
- instance_double(payment_method: braintree_payment_method)
288
- end
289
- end
290
- end
291
-
292
- shared_context 'with nil source token' do
293
- let(:braintree_payment_method) { double }
294
-
295
- before do
296
- allow(braintree_payment_method).to receive(:find) do
297
- raise ArgumentError
298
- end
299
- allow(payment_source).to receive(:braintree_client) do
300
- instance_double(payment_method: braintree_payment_method)
301
- end
302
- end
303
- end
304
-
305
- describe "#last_4" do
306
- subject { payment_source.last_4 }
307
-
308
- let(:method) { new_gateway.tap(&:save!) }
309
- let(:payment_source) { described_class.create!(payment_type: "CreditCard", payment_method: method) }
310
- let(:braintree_client) { method.braintree }
311
-
312
- context 'when token is known at braintree', vcr: {
313
- cassette_name: "source/last4",
314
- match_requests_on: [:braintree_uri]
315
- } do
316
- before do
317
- customer = braintree_client.customer.create
318
-
319
- method = braintree_client.payment_method.create({
320
- payment_method_nonce: "fake-valid-country-of-issuance-usa-nonce",
321
- customer_id: customer.customer.id
322
- })
323
-
324
- payment_source.update!(token: method.payment_method.token)
325
- end
326
-
327
- it "delegates to the braintree payment method" do
328
- method = braintree_client.payment_method.find(payment_source.token)
329
- expect(subject).to eql(method.last_4)
330
- end
331
- end
332
-
333
- context 'when the source token is not known at Braintree' do
334
- include_context 'with unknown source token'
335
-
336
- it { is_expected.to be(nil) }
337
- end
338
-
339
- context 'when the source token is nil' do
340
- include_context 'with nil source token'
341
-
342
- it { is_expected.to be(nil) }
343
- end
344
- end
345
-
346
- describe "#display_number" do
347
- subject { payment_source.display_number }
348
-
349
- let(:type) { nil }
350
- let(:payment_source) { described_class.new(payment_type: type) }
351
-
352
- context "when last_digits is a number" do
353
- before do
354
- allow(payment_source).to receive(:last_digits).and_return('1234')
355
- end
356
-
357
- it { is_expected.to eq 'XXXX-XXXX-XXXX-1234' }
358
- end
359
-
360
- context "when last_digits is nil" do
361
- before do
362
- allow(payment_source).to receive(:last_digits).and_return(nil)
363
- end
364
-
365
- it { is_expected.to eq 'XXXX-XXXX-XXXX-XXXX' }
366
- end
367
-
368
- context "when is a PayPal source" do
369
- let(:type) { "PayPalAccount" }
370
-
371
- before do
372
- allow(payment_source).to receive(:email).and_return('user@example.com')
373
- end
374
-
375
- it { is_expected.to eq 'user@example.com' }
376
- end
377
-
378
- context "when is a Venmo source" do
379
- let(:type) { "VenmoAccount" }
380
-
381
- before do
382
- allow(payment_source).to receive(:username).and_return('venmojoe')
383
- end
384
-
385
- it { is_expected.to eq('venmojoe') }
386
- end
387
- end
388
-
389
- describe "#card_type" do
390
- subject { payment_source.card_type }
391
-
392
- let(:method) { new_gateway.tap(&:save!) }
393
- let(:payment_source) { described_class.create!(payment_type: "CreditCard", payment_method: method) }
394
- let(:braintree_client) { method.braintree }
395
-
396
- context "when the token is known at braintree", vcr: {
397
- cassette_name: "source/card_type",
398
- match_requests_on: [:braintree_uri]
399
- } do
400
- before do
401
- customer = braintree_client.customer.create
402
-
403
- method = braintree_client.payment_method.create({
404
- payment_method_nonce: "fake-valid-country-of-issuance-usa-nonce", customer_id: customer.customer.id
405
- })
406
-
407
- payment_source.update!(token: method.payment_method.token)
408
- end
409
-
410
- it "delegates to the braintree payment method" do
411
- method = braintree_client.payment_method.find(payment_source.token)
412
- expect(subject).to eql(method.card_type)
413
- end
414
- end
415
-
416
- context 'when the source token is not known at Braintree' do
417
- include_context 'with unknown source token'
418
-
419
- it { is_expected.to be_nil }
420
- end
421
-
422
- context 'when the source token is nil' do
423
- include_context 'with nil source token'
424
-
425
- it { is_expected.to be_nil }
426
- end
427
- end
428
-
429
- describe '#display_paypal_funding_source' do
430
- let(:payment_source) { described_class.new }
431
-
432
- context 'when the EN locale exists' do
433
- it 'translates the funding source' do
434
- payment_source.paypal_funding_source = 'card'
435
-
436
- result = payment_source.display_paypal_funding_source
437
-
438
- expect(result).to eq('Credit or debit card')
439
- end
440
- end
441
-
442
- context "when the locale doesn't exist" do
443
- it 'returns the paypal_funding_source as the default' do
444
- allow(payment_source).to receive(:paypal_funding_source).and_return('non-existent')
445
-
446
- result = payment_source.display_paypal_funding_source
447
-
448
- expect(result).to eq('non-existent')
449
- end
450
- end
451
- end
452
-
453
- describe '#display_payment_type' do
454
- subject { described_class.new(payment_type: type).display_payment_type }
455
-
456
- context 'when type is CreditCard' do
457
- let(:type) { 'CreditCard' }
458
-
459
- it 'returns "Payment Type: Credit Card' do
460
- expect(subject).to eq('Payment Type: Credit Card')
461
- end
462
- end
463
-
464
- context 'when type is PayPalAccount' do
465
- let(:type) { 'PayPalAccount' }
466
-
467
- it 'returns "Payment Type: PayPal' do
468
- expect(subject).to eq('Payment Type: PayPal')
469
- end
470
- end
471
-
472
- context 'when type is VenmoAccount' do
473
- let(:type) { 'VenmoAccount' }
474
-
475
- it 'returns "Payment Type: Venmo' do
476
- expect(subject).to eq('Payment Type: Venmo')
477
- end
478
- end
479
- end
480
-
481
- describe '#reusable?' do
482
- subject { payment_source.reusable? }
483
-
484
- let(:payment_source) { described_class.new(token: token, nonce: nonce) }
485
- let(:nonce) { 'nonce67890' }
486
-
487
- context 'when source token is present' do
488
- let(:token) { 'token12345' }
489
-
490
- it { is_expected.to be_truthy }
491
- end
492
-
493
- context 'when source token is nil' do
494
- let(:token) { nil }
495
-
496
- it { is_expected.to be_falsy }
497
- end
498
- end
499
- end